Swift协议{get}和{get set}之间的区别及具体示例?
我对Swift很陌生,虽然我已经阅读了苹果的文档以及许多关于这方面的主题和线索,但我仍然不明白Swift协议{get}和{get set}之间的区别及具体示例?,swift,swift-protocols,Swift,Swift Protocols,我对Swift很陌生,虽然我已经阅读了苹果的文档以及许多关于这方面的主题和线索,但我仍然不明白{get}和{get set}之间的区别。我是说,我想用一个具体的例子来解释 例如: protocol PersonProtocol { var firstName: String { get } var lastName: String { get set } } 这两个属性之间的实际区别是什么?我试着在操场上玩这些东西: struct Person: PersonProtocol
{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
var p1:PersonProtocol=Person(名字:“约翰”,姓氏:“列侬”)
打印(p1.名字)//John
打印(p1.lastName)//列侬
p1.firstName=“Paul”您正在创建一个类型为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
var p1:PersonProtocol=Person(名字:“约翰”,姓氏:“列侬”)
打印(p1.名字)//John
打印(p1.lastName)//列侬
p1.firstName=“Paul”协议
-是实现它的某种类型的最小接口的要求
var name:Type{get}
要求Type至少具有一个getter
(可从类型外部访问,而不是从private
)的属性,即外部代码应该能够读取属性的值。在实现类型中,它可以是let name:type
,var name:type
,private(set)var name:type
,fileprivate(set)var name:type
,等等
var name:Type{get set}
要求Type同时具有可访问的getter
和setter
属性,即外部代码应该能够读取和写入属性。这里只允许var name:Type
如果protocol
需要getter
,但您也提供了setter
-这并不违反protocol
要求。
但是如果protocol
同时要求getter
和setter
,那么您必须同时提供这两个,并且没有任何一个都是有效的实现
您的Person
类将这两个属性定义为var
(使用可访问的getter
和setter
),因此您可以同时更改它们。但是PersonProtocol
不需要设置firstName
的功能
正如@JoakimDanielson所示,如果只使用协议所需的接口
,则不会更改名字
值。协议
-是实现它的某种类型的最小接口的要求
var name:Type{get}
要求Type至少具有一个getter
(可从类型外部访问,而不是从private
)的属性,即外部代码应该能够读取属性的值。在实现类型中,它可以是let name:type
,var name:type
,private(set)var name:type
,fileprivate(set)var name:type
,等等
var name:Type{get set}
要求Type同时具有可访问的getter
和setter
属性,即外部代码应该能够读取和写入属性。这里只允许var name:Type
如果protocol
需要getter
,但您也提供了setter
-这并不违反protocol
要求。
但是如果protocol
同时要求getter
和setter
,那么您必须同时提供这两个,并且没有任何一个都是有效的实现
您的Person
类将这两个属性定义为var
(使用可访问的getter
和setter
),因此您可以同时更改它们。但是PersonProtocol
不需要设置firstName
的功能
正如@JoakimDanielson所示,如果您只使用协议所需的接口,您将不会更改firstName
值。请参见:var
store属性同时具有setter和getterForfirstName
您只能得到它,这意味着您只能调用它并可以设置它。使用lastName
,您既可以获取和设置它,也可以更改它。请参阅:var
store属性同时具有setter和getter。对于firstName
,您只能获取它,这意味着您只能调用它并可以设置它。使用lastName
,您既可以获取和设置它,也可以更改它。