【问题标题】:How to create an Array or Dictionary whose values can only be String, Int and Boolean? [duplicate]如何创建其值只能是 String、Int 和 Boolean 的数组或字典? [复制]
【发布时间】:2026-01-03 19:20:04
【问题描述】:

我有一个要求,我需要创建一个数组,其值只能是字符串、整数或布尔值。 如果我尝试添加 Double 或任何其他值类型,Swift 编译器应该会报错。

【问题讨论】:

    标签: arrays swift dictionary


    【解决方案1】:
    protocol Elem {} 
    extension Int: Elem {}  
    extension String: Elem {} 
    extension Bool: Elem {} 
    let arr = [Elem]()
    

    【讨论】:

    • 谢谢。既然你是第一个,我不得不接受你的回答
    • 提到测试代码 sn-p,我这样做了,它应该可以正常工作,请接受我的编辑:)
    【解决方案2】:

    你可以通过声明一个虚拟协议来做到这一点

    protocol SpecialType {}
    

    并让请求的类型符合该协议

    extension String : SpecialType{}
    extension Int : SpecialType{}
    extension Bool : SpecialType{}
    

    现在,如果您尝试添加 Double,编译器会报错

    let specialDict : [String:SpecialType] = ["1" : "Hello", "2": true, "3": 2.0]
    // value of type 'Double' does not conform to expected dictionary value type 'SpecialType'
    

    【讨论】:

    • 我们可以用SpecialType扩展[String:Any][[String:Any]]吗?
    • 这不是必须的。只需将Any 替换为SpecialType。集合ArrayDictionary 会正确考虑。
    • 不,我的意思是,如果我想检查数据的类型是数组还是字典.. 我们可以在数组或字典中使用同样的东西吗?
    • 我不明白。集合类型是泛型的。无论如何都会检查关联的类型。
    • @EICaptainv2.0 ,是和不是。 Swift 根本不支持当前版本的那种扩展,但是有一个支持它的提案。一旦支持,语法应该是extension Array: SpecialType where Element == String(这应该会导致编译器错误)