Swift中受约束存在类型的组合语法问题咨询
Swift中受约束存在类型的组合语法问题咨询
我想跟大家探讨一个Swift 5.7泛型协议存在类型组合的语法问题。首先我定义了两个带@MainActor约束的泛型协议,用的是Swift 5.7的新语法:
@MainActor protocol P1<T>: AnyObject { associatedtype T func f1(_: T) } @MainActor protocol P2<U>: AnyObject { associatedtype U func f2(_: U) }
接下来,我在类里声明单个已经绑定了关联类型的存在类型属性是完全没问题的:
class MyClass { var myP1Property: (any P1<Int>)? // ok var myP2Property: (any P2<String>)? // ok }
这看起来都很顺畅,但当我尝试把这两个已经绑定好关联类型的存在类型组合起来作为属性类型时,却编译报错了:
class MyClass { var myP1P2Property: (any P1<Int> & P2<String>)? // error }
报错信息是:"Non-protocol, non-class type ... cannot be used within a protocol-constrained type.",我觉得这个提示有点让人摸不着头脑。
不过我也找到一个替代方案:不用&操作符直接组合,而是声明一个新的协议来间接实现这种组合效果:
@MainActor protocol P1P2<T, U>: P1, P2 {}
用这个新协议的存在类型就可以正常编译了:
class MyClass { var myP1P2Property: (any P1P2<Int, String>)? // ok }
这个方案确实完全实现了我想要的效果,但我还是有个疑问:有没有办法直接用&组合语法来实现这个需求呢?如果确实没有的话,这算不算Swift语言的一个语法缺口呢?
备注:内容来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

