Swift中为何可给协议定义的get-only只读属性赋值?
协议属性规则的核心逻辑
你对协议属性的约束方向理解反了:Swift协议中声明的属性权限是对遵循方的最低实现要求,而非最高权限限制。
- 标记为
{ get }的属性:仅要求遵循类型必须提供该属性的读取能力,不禁止遵循类型额外为其添加写入权限。你可以将其实现为可读可写的var存储属性、let常量、只读计算属性,只要支持读取就符合协议要求。 - 标记为
{ get set }的属性:强制要求遵循类型必须同时提供该属性的读取、写入能力,不能将其实现为let常量、只读计算属性,否则会触发编译错误。
对你的代码场景的解释
你在ViewController中将dummyGet实现为var dummyGet: String = ""的可读可写存储属性,完全满足协议要求的「可读取」最低标准,编译器不会做额外限制,因此你直接操作ViewController类型的实例时,自然可以给该属性赋值。
你可以通过两个边界场景验证规则:
- 不符合协议约束的错误实现
class WrongViewController: TestProtocol { // 编译报错:dummySet要求必须提供setter,let常量无写入权限,不满足{get set}约束 let dummySet: String = "" // 合法:dummyGet仅要求读取权限,let常量完全符合要求 let dummyGet: String = "" } - 协议类型上下文下的权限限制
当你用协议类型承载实例时,仅能访问协议明确定义的权限,此时只读约束会生效:// 以TestProtocol协议类型声明实例 let testInstance: TestProtocol = ViewController() testInstance.dummyGet = "new value" // 编译报错:协议视角下dummyGet为只读属性,无写入权限 testInstance.dummySet = "new value" // 合法:协议明确声明dummySet提供setter
内容的提问来源于stack exchange,提问作者Artun
相关产品推荐
相关产品推荐

