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

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)

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

use*_*434 9

protocol\xe2\x80\x94 是实现它的类型的某些最小接口的要求。

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

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

  • \n
\n\n

如果protocol需要,getter但您还提供了setter\xe2\x80\x94,则不违反protocol要求。\n但如果protocol需要两者gettersetter\xe2\x80\x94,则必须提供两者,并且没有其中任何一个都不是有效的实现。

\n\n
\n\n

您的Person类将这两个属性定义为var(带有accessiblegettersetter),因此您可以更改它们。但还PersonProtocol没有需要设置的能力firstName

\n\n

正如@JoakimDanielson 所示,如果您只使用所需的接口,则protocol无需更改该firstName值。

\n


Joa*_*son 6

您正在创建一个类型的变量,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)