【问题标题】:Swift Protocols: Difference between { get } and { get set } with concrete examples?Swift 协议:{ get } 和 { get set } 之间的区别以及具体示例?
【发布时间】:2019-06-06 05:32:09
【问题描述】:

我对 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

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

【问题讨论】:

  • var store 属性同时具有 setter 和 getter
  • 对于firstName,你只能得到它意味着你只能调用它并且你可以设置它。使用lastName,既可以获取也可以设置,也可以更改。

标签: swift swift-protocols


【解决方案1】:

您正在创建一个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

【讨论】:

    【解决方案2】:

    protocol — 是实现它的类型的某些 minimal 接口的要求

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

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

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


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

    正如@JoakimDanielson 所示,如果您只使用protocol 所需的接口,您将不会更改firstName 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 2013-04-21
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多