【发布时间】:2020-05-21 16:37:32
【问题描述】:
我目前对协议中的可获取属性有点困惑。考虑这个例子:
protocol Person {
var name: String { get }
}
我原以为name 属性是只读的,但我发现您可以更改值而无需编译器投诉:
struct Driver: Person {
var name: String
}
var driver = Driver(name: "Ryan")
driver.name = "Changed!"
如果我们用 let 关键字定义 driver,那么编译器会引发错误,但如果我理解正确,它与协议无关,因为常量结构在 Swift 中的设计是不可变的。
方法交互的行为与我预期的一样:
extension Person {
mutating func changeName(_ newName: String) {
self.name = newName // Error: 'name' is a get-only property
}
}
我是 Swift 新手,提到的细微差别可能没有任何实际用途,但这种行为让我问自己是否对结构的工作原理缺乏一些基本了解。
【问题讨论】:
-
protocol定义要实现的最小接口。您的协议Person要求实现类型具有名为name的String属性,该属性至少可读。set的功能是额外的功能,协议不会限制您这样做。
标签: swift struct swift-protocols