【问题标题】:Generic dictionary value type in SwiftSwift 中的通用字典值类型
【发布时间】:2014-07-14 12:32:22
【问题描述】:

我正在尝试创建一个字典变量,其值是两种类型之一。我尝试的一个例子应该更清楚:

var objects: <T where T: Float, T: Bool>[String: T]

这会引发编译器错误,即只有语法函数类型可以是泛型的。我想知道是否可能,我只是不知道正确的语法?

【问题讨论】:

    标签: generics dictionary swift


    【解决方案1】:

    你想要的工具是一个带有关联数据的枚举。

    enum Stuff {
      case FloatyThing(Float)
      case BoolyThing(Bool)
    }
    
    let objects = ["yes!"   : Stuff.BoolyThing(true),
                   "number" : Stuff.FloatyThing(1.0)]
    

    这会捕获“一个浮点型或布尔型的对象”,并提供更好的文档和类型安全性。

    要卸载数据,请使用 switch 语句:

    if let something = objects["yes!"] {
      switch something {
        case .FloatyThing(let f): println("I'm a float!", f)
        case .BoolyThing(let b): println("Am I true?", b)
      }
    }
    

    switch 语句的使用可确保您涵盖所有可能的类型,并防止您意外地将数据卸载为错误的类型。很高兴编译器可以帮助你这么多。

    有关更多信息,请参阅 Swift 编程语言中的“枚举和结构”。

    我还推荐 Alexandros Salazar 的 Error Handling in Swift,这是一个很好的例子,说明如何使用它来处理常见问题。

    【讨论】:

    • 如何判断值是什么类型,或者开启值?
    • 更新了更多背景。这是 Swift 中一个非常强大的功能,我希望它会非常普遍。
    • 你能写一个if语句来检查类型吗?例如。 if something is .FloatyThing(let f)
    • 我不知道 'if' 语法,但 switch 语法并不复杂:switch f { case .FloatyThing(let x): print(x); default: break }。也就是说,这听起来像是你想重新考虑你的算法的情况。忽略其他情况是错误的一个简单来源。甚至说“我知道这种情况存在,我故意什么都不做”比跳过你没想到的事情要好。
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2015-04-23
    • 1970-01-01
    相关资源
    最近更新 更多