如何在Swift中使用get和set

Car*_*ith 5 get set ios swift2

我有一块简单的代码来计算菱形的面积和周长.

 var perimeterOfRhombus: Double {
        get {
            let twoSides1 = sideLength1 + sideLength1
            let twoSides2 = sideLength2 + sideLength2
            let finalPerimeter = twoSides1 + twoSides2
            return finalPerimeter
        } set {
      }
    }
Run Code Online (Sandbox Code Playgroud)

我缺少的是设置部分.

我想让它显示sideLength1和sideLength2在开头是什么.

当它没有价值时,我不确定使用什么newValue.

它确实可以在不使用set的情况下工作,但我在Apple的swift语言指南中看到,设置和通常一起使用.

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

Aji*_*yak 16

您应该引用只读计算属性而不是计算属性.

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

 var perimeterOfRhombus: Double {
  let twoSides1 = sideLength1 + sideLength1
  let twoSides2 = sideLength2 + sideLength2
  let finalPerimeter = twoSides1 + twoSides2
  return finalPerimeter
 }
Run Code Online (Sandbox Code Playgroud)

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

计算属性(包括只读属性)必须设置为变量而不是常量.

 struct Square {
  var edge: Double = 0

  var area: Double {
    get {
      return edge * edge
    }
    set (newArea){
      edge = sqrt(newArea)
    }
  }
 }
Run Code Online (Sandbox Code Playgroud)

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

关于newValue,它被称为速记设置器声明 - 如果计算属性的设置器没有为要设置的新值定义名称,newValue则使用默认名称.

所以,上面的例子变成了

 struct Square {
  var edge: Double = 0

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