【问题标题】:How to use get and set in Swift如何在 Swift 中使用 get 和 set
【发布时间】:2016-07-19 06:36:55
【问题描述】:

我有一段简单的代码可以计算菱形的面积和周长。

 var perimeterOfRhombus: Double {
        get {
            let twoSides1 = sideLength1 + sideLength1
            let twoSides2 = sideLength2 + sideLength2
            let finalPerimeter = twoSides1 + twoSides2
            return finalPerimeter
        } set {
      }
    }

我缺少的是设置部分。

我希望它显示一开始的 sideLength1 和 sideLength2 是什么。

我不确定 newValue 的用途是什么,什么时候它没有价值。

它在不使用 set 的情况下也可以工作,但我在 Apple 的 swift 语言指南中看到 set 和 get 通常一起使用。

如果此代码中确实不需要 set,那么它通常用于什么?

【问题讨论】:

  • 不要将您的特殊示例与一般情况混淆。设置菱形的面积是什么意思/做什么,合乎逻辑吗?不太可能。所以你的 var 应该是只读的并且没有设置器
  • 比较 stackoverflow.com/questions/29690521/… 的类似问题。

标签: ios get swift2 set


【解决方案1】:

您应该指的是只读计算属性,而不是计算属性。

具有 getter 但没有 setter 的计算属性称为只读计算属性。它始终返回一个值,并且不能设置为其他值。

 var perimeterOfRhombus: Double {
  let twoSides1 = sideLength1 + sideLength1
  let twoSides2 = sideLength2 + sideLength2
  let finalPerimeter = twoSides1 + twoSides2
  return finalPerimeter
 }

计算属性实际上并不存储值。相反,它们提供了一个 getter 和一个可选的 setter 来间接检索和设置其他属性和值。

计算属性,包括只读属性,必须设置为变量而不是常量。

 struct Square {
  var edge: Double = 0

  var area: Double {
    get {
      return edge * edge
    }
    set (newArea){
      edge = sqrt(newArea)
    }
  }
 }

在这种情况下,setter 不能用于设置属性的值,而是用于设置其他属性的值,从这些属性中计算计算的属性。

关于newValue,它被称为Shorthand Setter Declaration - 如果计算属性的setter 没有为要设置的新值定义名称,则使用默认名称newValue

所以,上面的例子就变成了

 struct Square {
  var edge: Double = 0

  var area: Double {
    get {
      return edge * edge
    }
    set {
      edge = sqrt(newValue) //someSquare.area = 25 (25 is newValue)
    }
  }
 }

【讨论】:

    【解决方案2】:

    使用 get 和 set 快速计算属性

    class Square {
        var side: Double = 0.0
        var area: Double {
            get {
                return side*side
            }
            set(newArea) {
                print(newArea)
                self.side = sqrt(newArea)
            }
        }
    }
    
    let obj = Square()
    obj.side = 10.0
    print(obj.area)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多