Swift 4.1中具体类型无法遵循带关联类型约束的协议问题
关于Swift 4.1中关联类型协议约束的问题解答
嘿,这个问题我之前踩过坑!其实这不是你的操作问题,是Swift 4.1版本类型系统的一个细节限制——虽然你明确让MyProtocol遵循了ConstraintProtocol,但当你把协议本身(而不是遵循该协议的具体类型)指定为关联类型T时,Swift 4.1并不认可这种“协议作为关联类型满足协议约束”的场景。
问题根源
在Swift 4.1中,关联类型的约束要求的是具体类型符合协议,而协议本身并不是一个能直接满足协议约束的“实例类型”。简单来说:MyProtocol是一套规则,它规定了哪些具体类型能属于它,但它自己不是一个符合ConstraintProtocol的“实体类型”,所以编译器会判定ConcreteType.T(也就是MyProtocol)不满足ConstraintProtocol的约束。
解决方案
有两种方式可以解决这个问题:
- 改用具体类型作为关联类型:如果你业务逻辑允许,定义一个遵循
MyProtocol的具体类型,把它赋值给T:
protocol ConstraintProtocol { } protocol AssocProtocol { associatedtype T : ConstraintProtocol } protocol MyProtocol : ConstraintProtocol { } // 新增一个遵循MyProtocol的具体类型 struct ConcreteMyImpl: MyProtocol { } enum ConcreteType: AssocProtocol { typealias T = ConcreteMyImpl case a }
这样编译器就能识别到ConcreteMyImpl是符合ConstraintProtocol的具体类型,编译正常通过。
- 升级Swift版本:Swift 4.2及以上(对应Xcode 10+)修复了这个限制,开始支持协议作为关联类型满足协议约束的场景,你的原始代码在新版本里可以直接正常编译运行。
内容的提问来源于stack exchange,提问作者Zaphod
相关产品推荐
相关产品推荐

