Swift添加协议存根后仍重复提示‘类型未遵循协议’错误
Swift泛型协议遵循问题的解决方法
问题根源
- 泛型参数与协议名重名:你使用
LocaleStrategy、TimeWindowStrategy作为泛型参数名,这和你定义的协议名称完全一致,导致编译器无法区分泛型参数和协议类型,进而无法正确校验协议遵循性。 - 泛型约束不匹配:
ProjectProtocol要求localeStrategy必须遵循LocaleStrategy协议、timeWindowStrategy必须遵循TimeWindowStrategy协议,但你的泛型仅约束到Codable,没有明确绑定到对应的策略协议。
修正后的代码
// MARK - Locale protocol LocaleStrategy: Codable { var locale: String? { get set } } struct LocaleStrategyNone: LocaleStrategy { var locale: String? = nil } struct LocaleStrategyCountry: LocaleStrategy { var locale: String? } // MARK - TimeWindow protocol TimeWindowStrategy: Codable { var timeWindowInSeconds: Int? { get set } } struct TimeWindowStrategyNone: TimeWindowStrategy { var timeWindowInSeconds: Int? = nil } struct TimeWindowStrategyInSeconds: TimeWindowStrategy { var timeWindowInSeconds: Int? } // MARK - Project protocol ProjectProtocol: Codable { var localeStrategy: LocaleStrategy { get set } var timeWindowStrategy: TimeWindowStrategy { get set } } // 修改泛型参数名并修正约束为对应策略协议 struct Project<L: LocaleStrategy, T: TimeWindowStrategy>: ProjectProtocol { var localeStrategy: L var timeWindowStrategy: T } let localeStrategyCountry = LocaleStrategyCountry(locale: "USA") let timeStrategyNone = TimeWindowStrategyNone() let project = Project(localeStrategy: localeStrategyCountry, timeWindowStrategy: timeStrategyNone) let localeStrategyNone = LocaleStrategyNone() let timeWindowStrategyInSeconds = TimeWindowStrategyInSeconds(timeWindowInSeconds: 3) let project2 = Project(localeStrategy: localeStrategyNone, timeWindowStrategy: timeWindowStrategyInSeconds) let projects: [ProjectProtocol] = [project, project2]
关键修正点
- 将泛型参数名改为
L、T(也可使用更具语义的名称,如LocaleImpl、TimeWindowImpl),彻底避免与协议名冲突。 - 泛型约束从
Codable调整为对应的LocaleStrategy和TimeWindowStrategy协议,让编译器明确泛型类型符合ProjectProtocol的成员类型要求。 - 之前点击「添加协议存根」无效是因为编译器被重名的泛型参数干扰,无法正确识别协议所需的成员类型,导致生成的存根不符合要求,重复点击自然会出现重定义错误。
内容的提问来源于stack exchange,提问作者h.and.h
相关产品推荐
相关产品推荐

