Swift 中协议对属性的规定的疑惑

dowhilenet
  • 654

Swift_Programming_Language中有这么一段代码。

protocol FullyNamed {
    var fullName: String { get }
}

struct Person: FullyNamed {
    var fullName: String
}
let john = Person(fullName: "John Appleseed")
// john.fullName is "John Appleseed"

fullName是一个只读的属性,但是在Person将fullName实现成了可读可写的。

疑惑的是在协议中规定属性为只读并没有什么作用。

我在实现的时候并没有什么约束,即使是只读的,我也可以实现为可读可写。

仅仅是在协议中将属性规定为可读可些的时候你不能把它实现成只读的。

回复
阅读 3.7k
2 个回答
✓ 已被采纳

当声明 instance 为 protocol 类型的时候,只读属性便会生效.例如let john: FullyNamed = Person(fullName: "John Appleseed")

madiffer
  • 1
新手上路,请多包涵

"只读"是 (遵守该协议)类的该属性为只读. 别的地方修改该类实例的时候,不允许.
相当于"隔层"指定.

例如 :

protocol GameFever { // 游戏"发烧友"

// 玩家账号id,年龄 可以读取和修改
var playerId : Int { get set }
var age : Int { get set }

// 游戏名 只读
var game : String { get }

}

class Student : GameFever {

var playerId : Int = 0
var age : Int = 0
var game : String = ""

}

xxFuckFunc() {

let st = Student(id:213,age:18:game:"LOL")
print(st.game) // ok
print(st.age+st.playerId) // ok

st.age = 19 // ok
st.game = "王者荣耀" // error

}

This is readonly!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏