You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:13:14