如何通过协议限制Swift枚举的原始类型必须为Int?
解决方案
要实现强制要求遵循协议的枚举原始类型必须为Int,并且得到明确的编译器错误提示,你可以让协议直接继承RawRepresentable并通过where子句约束RawValue必须等于Int,这样就能把协议的关联类型和枚举的原始类型绑定起来:
protocol IntRawValueEnum: RawRepresentable where RawValue == Int {}
之后定义遵循该协议的枚举时,只要原始类型不是Int,编译器就会直接抛出明确的错误:
正确示例
enum ValidEnum: IntRawValueEnum { case first = 1 case second = 2 }
错误示例(非Int原始类型)
// 编译器会报错:Type 'InvalidEnum' does not conform to protocol 'IntRawValueEnum' // 同时会提示具体原因:Candidate has non-matching RawValue type 'String' enum InvalidEnum: IntRawValueEnum { case hello = "world" }
为什么原来的写法不生效?
你之前的协议只是单独定义了一个关联类型RawValue,这个类型和枚举本身的原始类型(来自RawRepresentable协议的关联类型)没有任何绑定关系。哪怕枚举的实际原始类型是String,只要你在枚举里手动指定typealias RawValue = Int来满足协议要求,编译器也会通过,这显然达不到强制约束的目的。
而通过让协议继承RawRepresentable并约束RawValue == Int,就直接把协议的要求和枚举的原始类型绑定在了一起,编译器会严格检查枚举的原始类型是否符合要求,错误提示也会清晰指出类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Whirlwind
相关产品推荐
相关产品推荐

