首页 文章

如何制作一个包含特定值的Swift词典?

提问于
浏览
3

通常我会像这样创建我的swift字典:

var myDict: [String: String]

但是,我如何创建一个可以包含值,只有String或Bool的Dictionary?

如果我像下面的代码一样声明字典

var myDict: [String: Any]

然后我的数组现在能够容纳任何我不想要的对象 . 有没有办法声明Dictionary只接受 StringBool 值类型?

[EDIT] - 用例是:我需要一个键和值的字典 . 但我只想将值限制为Strings或Bools . 没有其他的 . 目标是最终使用此Dictionary转换为JSON格式以发送到某个服务器 . 基于下面的答案,我唯一的选择是枚举还是类/结构?我想知道是否有办法让Bool和String符合某些协议?

这个想法可能是这样声明字典

var myDict : [String: stringOrBool]

并填写这样的字典

myDict["firstKeyStringValue"] = "my first string value" // This should work
myDict["firstKeyBoolValue"] = true // This should work
myDict["someOtherKey"] = 123 // This should fail

Edit 2 基于下面的答案,我选择了协议方法,因为它在语法上更容易 . 但正如鲶鱼在评论中提到的那样,它可能会占用更多的内存 .

3 回答

  • 6
    protocol StringOrBool {
    }
    
    extension Bool: StringOrBool {
    }
    
    extension String: StringOrBool {
    }
    
    var myDict: [String : StringOrBool] = [:]
    
    myDict["testKey"] = "sd"   // works
    myDict["testKey2"] = false // works
    myDict["testKey2"] = 2     // fails
    
  • 1

    你可以做点什么

    enum StuffThatGoesInMyDictionary {
        case Text(String)
        case Boolean(Bool)
    }
    

    然后让你的字典成为

    var myDict: [String : StuffThatGoesInMyDictionary]
    
  • 6

    此解决方案基于Catfish_Man的答案,我只是将其设为通用 .

    有了这个枚举

    enum XORWrapper<A,B> {
        case Value0(A)
        case Value1(B)
    }
    

    您可以声明一个包含2个泛型类型值的值(例如 StringBool ) .

    let boolOrString: XORWrapper<String, Bool>
    

    然后你可以用第一个Type填充它(例如 String

    boolOrString = XORWrapper.Value0("Hello world")
    

    或与第二个(例如 Bool

    boolOrString = XORWrapper.Value1(true)
    

相关问题