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

Swift编译器是否存在Bug?Swift 4.1协议约束实现问题咨询

实现仅允许指定类遵循的Swift协议

嘿,我刚好处理过类似的需求,用Swift 4.1新增的协议where约束语法,就能轻松实现让协议只能被特定类(比如你说的Root)遵循的效果,下面是完整的代码示例和说明:

1. 定义带类约束的协议

首先我们通过where Self: Root来限定协议的遵循者必须是Root类(或其子类):

import UIKit

protocol Delegate where Self: Root {
    var titleImage: UIImage? { get }
}

这个约束的作用很直接:任何非Root类型的类,尝试遵循Delegate协议都会触发编译错误,从根源上保证了协议的专属使用范围。

2. 实现指定类的协议遵循

接下来让Root类遵循这个协议,并实现协议要求的属性:

class Root: Delegate {
    var titleImage: UIImage?
    
    func willDo() {
        let foo = Foo()
        foo.delegate = self
        foo.invokeDelegate()
    }
}

3. 定义持有协议的关联类

这里我们实现你提到的Foo类,它持有一个Delegate类型的属性,用来和Root类交互:

class Foo {
    // 注意用weak避免循环引用
    weak var delegate: Delegate?
    
    func invokeDelegate() {
        if let image = delegate?.titleImage {
            print("成功获取标题图片:\(image)")
        } else {
            print("标题图片为空")
        }
    }
}

4. 验证约束效果

如果尝试让非Root类(比如Foo本身)遵循Delegate协议:

// 下面这段代码会编译报错,因为Foo不符合协议的类约束
// class Foo: Delegate {
//     var titleImage: UIImage?
// }

编译器会直接提示错误:Type 'Foo' does not conform to protocol 'Delegate',完美阻止了非指定类的协议遵循。

这样设置后,你就可以放心地让Delegate协议只服务于Root类啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:55:03