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

时间:2015-05-05 21:05:03

标签: swift generics

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

class SomeModel {}

let someType = SomeModel.self
let array = Array<someType>()

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

但是我在最后一行收到someType isn't a typeuse of undeclared type 'someType'等错误。

3 个答案:

答案 0 :(得分:11)

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

let someType = SomeModel.self
let array = someFunc(someType())

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

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

答案 1 :(得分:4)

如果您需要在数组中存储多个类型值,这非常有效:

let array: [Any.Type] = [String.self, Int.self]

答案 2 :(得分:1)

现在,通过在类或协议上使用.Type,可以更轻松,更适应地实现这一点。请注意,只有该根类或协议可用的函数才可访问,因此您应确保定义了某种必需的初始化程序。例如:

protocol MyClass {
   init(someValue: Int)
}

class MyWrapper {

   let myClassType: MyClass.Type

   init(classType: MyClass.Type) {
      self.myClassType = classType
   }

   func new(with value: Int) -> MyClassType {
      return MyClassType.init(someValue: value)
   }

}

现在,您可以使用实现MyClass协议的特定类初始化这个相当愚蠢的工厂类,当您使用整数值调用new()函数时,它将生成该类的新实例并将其返回。