Swift 协议:{ get } 和 { get set } 之间的区别有具体的例子吗?

Swift Protocols: Difference between { get } and { get set } with concrete examples?

我是 Swift 的新手,虽然我已经阅读了 Apple 的文档以及许多关于此的主题和主题,但我仍然无法理解 { get }{ get set }。我的意思是,我正在寻找一个具体示例的解释。

喜欢,例如:

protocol PersonProtocol {
    var firstName: String { get }
    var lastName: String { get set }
}

这两个属性之间的实际区别是什么?我试着在操场上玩这些属性:

struct Person: PersonProtocol {
    var firstName: String
    var lastName: String
}

var p = Person(firstName: "John", lastName: "Lennon")
print(p.firstName) // John
print(p.lastName) // Lennon
p.firstName = "Paul"
p.lastName = "McCartney"
print(p.firstName) // Paul
print(p.lastName) // McCartney

没有帮助...感谢您的帮助。

您正在创建一个 Person 类型的变量,并且对该结构没有任何限制。如果您改为创建 PersonProtocol 类型的变量,则 firstName 将是只读的

var p1: PersonProtocol = Person(firstName: "John", lastName: "Lennon")
print(p1.firstName) // John
print(p1.lastName) // Lennon
p1.firstName = "Paul" <== error: cannot assign to property: 'firstName' is a get-only property

protocol — 是一些 最小 实现它的类型的接口的 要求

  • var name: Type { get } 要求类型具有 属性 且至少有一个 getter (可从类型外部访问,而不是 private),即外部代码应该能够 读取 属性 的值。在实现类型中可以是let name: Typevar name: Typeprivate(set) var name: Typefileprivate(set) var name: Type

  • var name: Type { get set } 要求类型具有 属性 且可访问 gettersetter,即外部代码应该能够到属性。这里只允许var name: Type

如果 protocol 要求 getter 但您还提供 setter — 这不违反 protocol 要求。 但是,如果 protocol 需要 gettersetter — 你必须同时提供,没有任何一个都不是有效的实现。


您的 Person class 将 两个 属性定义为 var(可访问 gettersetter)因此您可以同时更改它们。但是 PersonProtocol 不需要设置 firstName.

的能力

如@JoakimDanielson 所示,如果您只使用 protocol 所需的界面,则无需更改 firstName 值。