为什么我们在Swift变量声明中使用关键字“get”?

6
这可能听起来很蠢,但我无法弄清楚为什么程序员在Swift中声明变量如下所示:
class Person: NSObject {
    var name: String { get }
}

为什么使用关键字“get”?为什么没有“set”?我认为我们应该像这样使用它们:
class Person: NSObject {
    var name: String {
        get {
          // getter
        }
        set {
          // setter
        }
    }
}

这可能是一个垃圾问题,但我对{ get }的理论定义很感兴趣。


1
https://dev59.com/OmAf5IYBdhLWcg3wZB-u - Serhan Oztekin
谢谢,我知道如何使用setgetwillSetdidSet,但我对这段代码很好奇:**{ get }**。为什么它实际上并没有返回任何东西? - Lucifer
你应该在其中添加一个返回语句。get { return name }。我猜这个语句“var name: String { get }”只是为了展示一个简短的代码片段。 - Serhan Oztekin
语法 var foo: String { get { return "bar" } }(可以缩写为 var foo: String { return "bar" })声明了一个没有 setter 的计算属性。你的第二个例子是一个既有 getter 又有 setter 的计算属性。 - Rob
2个回答

4

var name: String { get } 这样的语句通常在协议中使用而不是类中。在协议中,它表示实现必须有一个类型为 String 的变量,至少应该是只读的(因此有 get)。如果花括号里是 { get set },那么这个变量就是可读写的。

事实上,根据 Earl Grey 的答案,在类内部编写 var name: String { get } 会导致编译错误。


太好了,谢谢!混淆是由于助理编辑器,在我将 Obj-C 类的界面转换为 Swift 时,编辑器生成了这个变量。现在我明白了一切。谢谢! - Lucifer

2

严格来讲,第一个代码示例没有意义。你不能在类中这样声明变量(像这样在协议中声明变量)。

第二个示例是计算属性的一个例子,尽管缺少getter和setter实现。(至少似乎暗示着这一点,因此我不会反对代码示例的有效性。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接