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
相关产品推荐
相关产品推荐

