Swift中为何要求DatabaseGateway遵循Something协议?泛型约束问题
问题原因分析
你遇到的报错源于Swift对数组类型的自动推断逻辑:
Poll和User都是DatabaseGateway的子类,Swift会默认把[self, user]的类型推断为[DatabaseGateway]。- 你调用的
VoteRecordFilter初始化器init<S: Something>(parameters: [S]) where S.T == VoteTable.Field,要求数组元素必须是遵循Something协议的类型,但DatabaseGateway本身并没有实现该协议,因此编译器抛出错误。
解决方案
通过显式指定数组的协议类型,让Swift正确识别元素的协议一致性,替代默认的父类类型推断:
方式一(Swift 5.7+ 推荐)
修改voteSubmitted方法中的初始化代码:
func voteSubmitted(user: User) async throws -> Bool { // 显式指定数组为遵循Something且关联类型为VoteTable.Field的协议集合 let filter = VoteRecordFilter(parameters: [self, user] as [any Something where Something.T == VoteTable.Field]) return true }
方式二(兼容Swift 5.6及以下版本)
通过类型转换明确元素的协议身份:
func voteSubmitted(user: User) async throws -> Bool { let filter = VoteRecordFilter(parameters: [self as Something, user as Something]) return true }
两种方式都能让编译器正确匹配到对应的初始化器,解决报错问题。
内容的提问来源于stack exchange,提问作者bobby123uk
相关产品推荐
相关产品推荐

