Swift中Coordinator类型数组比较报错:参数类型'Coordinator'需为类或类约束类型的实例
解决Swift中
===运算符的类型错误问题 错误原因
这个错误的核心逻辑很清晰:Swift的恒等运算符===只能作用于类(class)实例,它的作用是判断两个对象是否指向同一块内存地址。
如果你的Coordinator只是一个普通协议(没有添加类约束),那么它可以被结构体、枚举这类值类型遵守——编译器没法保证传入的childCoordinator和数组里的元素是类实例,自然就会抛出「需要类或类约束类型的实例」的错误。
修复方案
最稳妥也符合Coordinator设计模式的方式,是给Coordinator协议加上类专属约束:
// 给协议添加: AnyObject,限制只有类能遵守它 protocol Coordinator: AnyObject { func start() // 这里放你的协议要求的方法 }
修改后,编译器会默认所有Coordinator类型的实例都是类对象,===运算符就能正常工作,你原来的childDidFinish方法里的比较逻辑完全不用改动,直接就能运行。
要是你没法修改Coordinator协议的定义(比如它来自第三方库),可以用一个折中方案——把两个操作数都转成AnyObject再比较,但这种方式不够优雅,还存在类型安全隐患,只建议作为临时 workaround:
func childDidFinish(_ childCoordinator: Coordinator){ if let index = childCoordinators.firstIndex(where: { (childCoordinator as AnyObject) === ($0 as AnyObject) }){ childCoordinators.remove(at: index) } }
补充说明
在Coordinator模式的常规实践中,子协调器都是类实例(因为需要持有引用、管理页面生命周期),所以给协议添加类约束是完全符合设计逻辑的,这也是社区里的标准做法。
内容的提问来源于stack exchange,提问作者Xavier Duvan Melo
相关产品推荐
相关产品推荐

