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

如何通过协议限制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:22:12