将变量存储在变量中以便稍后使用

jam*_*one 22 generics swift

我正在尝试在变量中存储一个类型,以便我可以像以后的第一类类型一样使用它.

class SomeModel {}

let someType = SomeModel.self
let array = Array<someType>()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,确定我可以做,Array<SomeModel>()但我想概括它,让子类提供的值someType.

不过,我得到这样的错误,someType isn't a type或者use of undeclared type 'someType'在最后一行.

jam*_*one 12

func someFunc<T>(model: T) -> Array<T> {
    let array = Array<T>()
    return array
}

let someType = SomeModel.self
let array = someFunc(someType())
Run Code Online (Sandbox Code Playgroud)

看起来这样做我想要的.唯一的缺点是我必须创建一个要传递的所需类型的实例.在这种情况下,它的最小开销,但它似乎是一种浪费.

使用这样的泛型的另一件事是看起来泛型的可能类型是在编译时计算的,因此在运行时model.dynamicType不一定匹配T.在大多数情况下它会,但如果您正在做任何反射驱动的东西,请确保真正检查您的用例.

  • 你不需要创建一个实例,你可以简单地`func someFunc <T>(model:T.Type) - > Array <T> {...` (12认同)

Exe*_*eev 8

如果您需要在数组中存储多个类型值,则效果很好:

let array: [Any.Type] = [String.self, Int.self]
Run Code Online (Sandbox Code Playgroud)