XCode测试报错:'any Protocol'不兼容预期Protocol类型排查
问题原因及解决办法
核心原因
这个报错是Swift 5.7引入的any存在类型与具体协议遵守类型的类型不匹配导致的,本质是TokenAdapter的初始化参数要求和你声明的变量类型不兼容。
具体拆解
TokenAdapter的初始化约束
你的TokenAdapter大概率用了泛型约束来限定参数类型,比如:class TokenAdapter<P: TokenProviderProtocol, S: SessionProtocol> { init(tokenProvider: P, session: S) { // 初始化逻辑 } }这种泛型初始化要求传入的是遵守对应协议的具体类型实例(比如你的
MockTokenProvider、MockSession本身),而不是被any擦除类型信息的存在类型。测试代码的类型问题
你在测试中声明provider/session时,可能显式用了any来擦除类型,比如:let provider: any TokenProviderProtocol = MockTokenProvider() let session: any SessionProtocol = MockSession()此时变量的类型是被擦除后的
any TokenProviderProtocol,不再是具体的MockTokenProvider类型,和TokenAdapter泛型初始化要求的具体类型不匹配,因此触发报错。Xcode提示矛盾的原因
Xcode的自动修复提示只是基于表面类型不匹配给出的建议,但any TokenProviderProtocol本身就是协议的存在类型,强制转换as! TokenProviderProtocol无法解决泛型参数需要具体类型的核心问题,所以转换后错误依然存在,Xcode又会提示你移除无效的转换。
解决办法
方法一:移除any,保留具体类型
直接让Swift推导变量的具体Mock类型,不要显式声明为any类型:
let provider = MockTokenProvider() let session = MockSession() let adapter = TokenAdapter(tokenProvider: provider, session: session)
方法二:修改TokenAdapter接受存在类型
如果业务需要保留类型擦除,可以调整TokenAdapter的初始化方法,直接接受any修饰的协议类型:
class TokenAdapter { init(tokenProvider: any TokenProviderProtocol, session: any SessionProtocol) { // 初始化逻辑 } }
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

