Den*_*nis 2 swift swift-protocols
我对 Swift 还是很陌生,虽然我已经阅读了 Apple 的文档以及许多关于此的主题和线程,但我仍然无法理解{ get }和{ get set }. 我的意思是,我正在寻找一个具体例子的解释。
比如,例如:
protocol PersonProtocol {
var firstName: String { get }
var lastName: String { get set }
}
Run Code Online (Sandbox Code Playgroud)
这两个属性之间的实际区别是什么?我试图在操场上玩这些属性:
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
Run Code Online (Sandbox Code Playgroud)
没有帮助...感谢您的帮助。
protocol\xe2\x80\x94 是实现它的类型的某些最小接口的要求。
var name: Type { get }要求类型具有至少具有 a 的属性getter(可从类型外部访问,而不是private),即外部代码应该能够读取属性的值。在实现类型中可以是let name: Type、var name: Type、private(set) var name: Type、fileprivate(set) var name: Type等。
var name: Type { get set }要求类型具有可访问和 的属性,即外部代码应该能够读取和写入该属性。只有这里才被允许。gettersettervar name: Type
如果protocol需要,getter但您还提供了setter\xe2\x80\x94,则不违反protocol要求。\n但如果protocol需要两者getter和setter\xe2\x80\x94,则必须提供两者,并且没有其中任何一个都不是有效的实现。
您的Person类将这两个属性定义为var(带有accessiblegetter和setter),因此您可以更改它们。但还PersonProtocol没有需要设置的能力firstName。
正如@JoakimDanielson 所示,如果您只使用所需的接口,则protocol无需更改该firstName值。
您正在创建一个类型的变量,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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1215 次 |
| 最近记录: |