在 swift 中获取泛型的参数化类型?
Getting the parameterised type of a generic in swift?
如何在 swift 中获取泛型的参数化类型?例如检查类型的大小。
这是您要找的吗?
func foo<T>(arg : T) {
println(sizeof(T))
// Or: println(sizeofValue(arg))
}
foo(1.2) // 8
foo(Int8(1)) // 1
不完全清楚你的意思,但是 sizeof
将与占位符一起使用:
func f<T>(t: T) -> Int {
return sizeof(T)
}
f(1) // returns 1, the sizeof Int
f("hello") // returns 24, the sizeof String
请记住,在泛型 function/type 中,占位符 是 类型。将编译器视为遍历并在占位符出现的任何地方插入实际类型的名称。
我想,例如,当你有 Array<Int>
值时,你想要的是 Int
类型。
我相信没有通用的方法可以做到这一点。
某些类型具有 typealias
通用参数,您可以使用该名称获取它。例如:
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
如何在 swift 中获取泛型的参数化类型?例如检查类型的大小。
这是您要找的吗?
func foo<T>(arg : T) {
println(sizeof(T))
// Or: println(sizeofValue(arg))
}
foo(1.2) // 8
foo(Int8(1)) // 1
不完全清楚你的意思,但是 sizeof
将与占位符一起使用:
func f<T>(t: T) -> Int {
return sizeof(T)
}
f(1) // returns 1, the sizeof Int
f("hello") // returns 24, the sizeof String
请记住,在泛型 function/type 中,占位符 是 类型。将编译器视为遍历并在占位符出现的任何地方插入实际类型的名称。
我想,例如,当你有 Array<Int>
值时,你想要的是 Int
类型。
我相信没有通用的方法可以做到这一点。
某些类型具有 typealias
通用参数,您可以使用该名称获取它。例如:
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