【问题标题】:Getting the parameterised type of a generic in swift?快速获取泛型的参数化类型?
【发布时间】:2015-03-01 09:58:31
【问题描述】:

如何快速获取泛型的参数化类型?例如检查类型的大小。

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    我想,例如,当你有Array<Int> 值时,你想要的是Int 类型。

    我相信没有通用的方法可以做到这一点。

    某些类型有typealiased 泛型参数,您可以使用该名称获取它。例如:

    let array: Array<UInt16> = [1,2,3]
    let elementType = array.dynamicType.Element.self // -> Swift.UInt16
    sizeof(elementType) // -> 2
    

    这是因为Array typealiased Element = T:

    struct Array<T> : MutableCollectionType, Sliceable, _DestructorSafeContainer {
    
        /// The type of element stored by this `Array`
        typealias Element = T
    

    即使没有typealias,也可以通过extension添加:

    extension Unmanaged {
        typealias Payload = T
    }
    
    let something: Unmanaged<NSString> = .passRetained("test")
    something.dynamicType.Payload.self // -> NSString
    

    【讨论】:

    • 这确实是我想要的。谢谢!
    【解决方案2】:

    这是你要找的吗?

    func foo<T>(arg : T) {
        println(sizeof(T))
        // Or: println(sizeofValue(arg))
    }
    
    foo(1.2)       // 8
    foo(Int8(1))   // 1
    

    【讨论】:

    • 不,我正在寻找一个函数(或其他机制),它接受现有的通用实例作为输入,并返回实例的参数化类型。
    • @Danra:也许您可以在问题中添加一些代码或伪代码,以展示您想要实现的目标。
    【解决方案3】:

    您的意思并不完全清楚,但sizeof 将与占位符一起使用:

    func f<T>(t: T) -> Int {
        return sizeof(T)
    }
    
    f(1)         // returns 1, the sizeof Int
    f("hello")   // returns 24, the sizeof String
    

    请记住,在泛型函数/类型中,占位符类型。将编译器想象为在占位符出现的任何地方都通过并插入实际类型的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多