如何实现仅在特定对象上下文生效的DataModel扩展?
实现仅在特定上下文生效的DataModel扩展
你的原代码问题在于:extension DataModel where Self: MyProtocol 的约束要求DataModel本身实现MyProtocol,但你的DataModel结构体并未遵循该协议,所以这个扩展的execute方法根本不会被添加到DataModel上,自然无法调用。
要实现“仅在实现MyProtocol的类内部,DataModel实例拥有可触发类start方法的execute方法”,可以通过闭包捕获上下文的方式实现,无需类型检查,自动绑定上下文逻辑:
struct DataModel { // 私有闭包,存储上下文的start方法 private let executeHandler: (() -> Void)? // 外部初始化默认不带闭包,内部通过协议扩展传入 init(executeHandler: (() -> Void)? = nil) { self.executeHandler = executeHandler } func execute() { executeHandler?() } } protocol MyProtocol { func start() } // 给MyProtocol添加扩展,提供绑定了上下文的DataModel实例 extension MyProtocol { var model: DataModel { // 捕获当前实例的start方法,传入DataModel初始化 DataModel(executeHandler: self.start) } } class Class_A: MyProtocol { func start() { print("Model extension worked") } func doSomething() { model.execute() // 调用后触发start方法 } } class Class_B { // 这里的DataModel是默认初始化,没有绑定executeHandler let model = DataModel() func doSomething() { model.execute() // 闭包为nil,无任何操作 } }
方案说明
- DataModel设计:通过私有可选闭包
executeHandler存储需要执行的逻辑,execute方法仅在闭包存在时触发逻辑。 - 协议扩展绑定上下文:在
MyProtocol的扩展中定义计算属性model,返回一个捕获了当前实例start方法的DataModel对象,实现上下文自动绑定。 - 自动区分上下文:
- 实现
MyProtocol的类(如Class_A)调用model.execute()时,会触发自身的start方法; - 未实现
MyProtocol的类(如Class_B)使用默认初始化的DataModel,execute方法无任何操作,且无需额外类型检查。
- 实现
内容的提问来源于stack exchange,提问作者incelemeTRe
相关产品推荐
相关产品推荐

