Swift通讯协定:{get}和{get set}之间的区别和具体示例?

时间:2019-01-11 09:53:46

标签: swift swift-protocols

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

app —是实现该类型的某些最小接口的要求

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

  • fileprivate(set) var name: Type要求类型具有同时具有var name: Type { get set }getter可访问性的属性,即外部代码应能够读取< / strong>,然后写入。这里只允许setter

如果var name: Type需要protocol,但您还提供了getter –这不符合setter的要求。 但是,如果protocol同时需要protocolgetter -您必须同时提供两者,并且没有任何一个都不是有效的实现。


您的setter类将两个{em>属性都定义为Person(具有可访问的vargetter),因此您可以同时更改它们。但是setter不需要设置PersonProtocol的功能。

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