Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Swift中的泛型字典值类型_Generics_Dictionary_Swift - Fatal编程技术网

Generics Swift中的泛型字典值类型

Generics Swift中的泛型字典值类型,generics,dictionary,swift,Generics,Dictionary,Swift,我试图创建一个字典变量,其值是两种类型之一。我尝试的一个例子应该让这一点更清楚: var objects: <T where T: Float, T: Bool>[String: T] var对象:[字符串:T] 这会引发一个编译器错误,即只有语法函数类型可以是泛型的。我想知道这是否可能,我只是不知道正确的语法?您想要的工具是一个带有相关数据的枚举 enum Stuff { case FloatyThing(Float) case BoolyThing(Bool) }

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

var objects: <T where T: Float, T: Bool>[String: T]
var对象:[字符串:T]

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

您想要的工具是一个带有相关数据的枚举

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推荐了一个非常好的例子,说明如何使用此方法来处理常见问题。

如何确定值的类型,或如何打开值?更新了一些背景信息。这是Swift中一个非常强大的功能,我希望它非常常见。你能写一个if语句来检查类型吗?例如,
if某物是.FloatyThing(let f)
我不知道它的'if'语法,但是开关语法并不复杂:
switch f{case.FloatyThing(let x):print(x);默认值:break}
。也就是说,这听起来像是一个需要重新思考算法的案例。忽略其他情况很容易导致错误。甚至说“我知道这个案子存在,我故意什么也不做”都比跳过你没想到的事情要好。