Swift 协议:{ get } 和 { get set } 之间的区别有具体的例子吗?
Swift Protocols: Difference between { get } and { get set } with concrete examples?
我是 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
没有帮助...感谢您的帮助。
您正在创建一个 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
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
和 setter
,即外部代码应该能够读和写到属性。这里只允许var name: Type
。
如果 protocol
要求 getter
但您还提供 setter
— 这不违反 protocol
要求。
但是,如果 protocol
需要 getter
和 setter
— 你必须同时提供,没有任何一个都不是有效的实现。
您的 Person
class 将 两个 属性定义为 var
(可访问 getter
和 setter
)因此您可以同时更改它们。但是 PersonProtocol
不需要设置 firstName
.
的能力
如@JoakimDanielson 所示,如果您只使用 protocol
所需的界面,则无需更改 firstName
值。
我是 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
没有帮助...感谢您的帮助。
您正在创建一个 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
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
和setter
,即外部代码应该能够读和写到属性。这里只允许var name: Type
。
如果 protocol
要求 getter
但您还提供 setter
— 这不违反 protocol
要求。
但是,如果 protocol
需要 getter
和 setter
— 你必须同时提供,没有任何一个都不是有效的实现。
您的 Person
class 将 两个 属性定义为 var
(可访问 getter
和 setter
)因此您可以同时更改它们。但是 PersonProtocol
不需要设置 firstName
.
如@JoakimDanielson 所示,如果您只使用 protocol
所需的界面,则无需更改 firstName
值。