我对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
没有帮助...谢谢您的帮助。
答案 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
),即外部代码应该能够读取该属性的值。在实现类型中,它可以是private
,let name: Type
,var name: Type
,private(set) var name: Type
等。
fileprivate(set) var name: Type
要求类型具有同时具有var name: Type { get set }
和getter
可访问性的属性,即外部代码应能够读取< / strong>,然后写入。这里只允许setter
。
如果var name: Type
需要protocol
,但您还提供了getter
–这不符合setter
的要求。
但是,如果protocol
同时需要protocol
和getter
-您必须同时提供两者,并且没有任何一个都不是有效的实现。
您的setter
类将两个{em>属性都定义为Person
(具有可访问的var
和getter
),因此您可以同时更改它们。但是setter
不需要设置PersonProtocol
的功能。
正如@JoakimDanielson所示,如果仅使用firstName
所需的接口,则不会更改protocol
的值。