You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中为何可给协议定义的get-only只读属性赋值?

协议属性规则的核心逻辑

你对协议属性的约束方向理解反了:Swift协议中声明的属性权限是对遵循方的最低实现要求,而非最高权限限制。

  • 标记为{ get }的属性:仅要求遵循类型必须提供该属性的读取能力,不禁止遵循类型额外为其添加写入权限。你可以将其实现为可读可写的var存储属性、let常量、只读计算属性,只要支持读取就符合协议要求。
  • 标记为{ get set }的属性:强制要求遵循类型必须同时提供该属性的读取、写入能力,不能将其实现为let常量、只读计算属性,否则会触发编译错误。

对你的代码场景的解释

你在ViewController中将dummyGet实现为var dummyGet: String = ""的可读可写存储属性,完全满足协议要求的「可读取」最低标准,编译器不会做额外限制,因此你直接操作ViewController类型的实例时,自然可以给该属性赋值。

你可以通过两个边界场景验证规则:

  1. 不符合协议约束的错误实现
    class WrongViewController: TestProtocol {
        // 编译报错:dummySet要求必须提供setter,let常量无写入权限,不满足{get set}约束
        let dummySet: String = ""
        // 合法:dummyGet仅要求读取权限,let常量完全符合要求
        let dummyGet: String = ""
    }
    
  2. 协议类型上下文下的权限限制
    当你用协议类型承载实例时,仅能访问协议明确定义的权限,此时只读约束会生效:
    // 以TestProtocol协议类型声明实例
    let testInstance: TestProtocol = ViewController()
    testInstance.dummyGet = "new value" // 编译报错:协议视角下dummyGet为只读属性,无写入权限
    testInstance.dummySet = "new value" // 合法:协议明确声明dummySet提供setter
    

内容的提问来源于stack exchange,提问作者Artun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:18:15