Swift协议{get}和{get set}之间的区别及具体示例?

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

我对Swift很陌生,虽然我已经阅读了苹果的文档以及许多关于这方面的主题和线索,但我仍然不明白
{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和getterFor
firstName
您只能得到它,这意味着您只能调用它并可以设置它。使用
lastName
,您既可以获取和设置它,也可以更改它。请参阅:
var
store属性同时具有setter和getter。对于
firstName
,您只能获取它,这意味着您只能调用它并可以设置它。使用
lastName
,您既可以获取和设置它,也可以更改它。