【问题标题】:Store type in variable to use like a type later将类型存储在变量中,以便以后像类型一样使用
【发布时间】:2015-05-05 21:05:03
【问题描述】:

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

class SomeModel {}

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

在这种情况下,我当然可以改用Array&lt;SomeModel&gt;(),但我想概括它并让子类提供someType 的值。

但是,我在最后一行出现someType isn't a typeuse of undeclared type 'someType' 之类的错误。

【问题讨论】:

    标签: swift generics


    【解决方案1】:
    func someFunc<T>(model: T) -> Array<T> {
        let array = Array<T>()
        return array
    }
    
    let someType = SomeModel.self
    let array = someFunc(someType())
    

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

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

    【讨论】:

    • 不需要创建实例,直接func someFunc&lt;T&gt;(model: T.Type) -&gt; Array&lt;T&gt; {...
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如今,通过在类或协议上使用 .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() 函数时,它将生成该类的新实例并返回它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-21
        • 2018-09-23
        • 1970-01-01
        • 2013-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        相关资源
        最近更新 更多