在swift中获取泛型的参数化类型?

时间:2015-03-01 09:58:31

标签: swift generics

如何在swift中获取泛型的参数化类型?例如,检查类型的大小。

3 个答案:

答案 0 :(得分:3)

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

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

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

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

这可行,因为Array typealased 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

答案 1 :(得分:0)

这是你在找什么?

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

foo(1.2)       // 8
foo(Int8(1))   // 1

答案 2 :(得分:0)

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

func f<T>(t: T) -> Int {
    return sizeof(T)
}

f(1)         // returns 1, the sizeof Int
f("hello")   // returns 24, the sizeof String

请记住,在通用函数/类型中,占位符类型。将编译器视为通过并在占位符出现的位置插入实际类型的名称。