您可以通过使用.dynamicType
属性来获取值的类型对象的引用。这相当于Python中的type()
函数,并在Swift文档中提到了语言参考:类型:元类型类型。
var intArray = [1, 2, 3]
let typeOfArray = intArray.dynamicType
使用这个类型对象,我们可以创建一个相同数组类型的新实例。
var newArray = typeOfArray()
newArray.append(5)
newArray.append(6)
println(newArray)
[5, 6]
我们可以看到,通过尝试追加一个浮点数,这个新的值的类型仍然相同([Int]
):
newArray.append(1.5)
error: type 'Int' does not conform to protocol 'FloatLiteralConvertible'
如果我们导入Cocoa并使用混合类型的数组字面量,我们可以看到创建了一个
NSArray
:
import Cocoa
var mixedArray = [1, "2"]
let mixedArrayType = mixedArray.dynamicType
var newArray = mixedArrayType()
var mutableArray = newArray.mutableCopy() as NSMutableArray
mutableArray.addObject(1)
mutableArray.addObject(1.5)
mutableArray.addObject("2")
println(mutableArray)
(1, "1.5", 2)
然而,目前似乎没有一种通用的方法可以生成类型对象的字符串描述,因此它可能无法起到你所要求的调试作用。
从NSObject
派生的类型确实有一个.description()
方法,正如在SiLo的答案中使用的那样。
println(mixedArrayType.description())
__NSArrayI
然而,这种操作在 Swift 内置的数组等类型中并不存在。
println(typeOfArray.description())
error: '[Int].Type' does not have a member named 'description'
func show<T>(x:T) { println("\(x) is of type \(T)" }
。如果在编译时不知道类型,我不确定是否可能,因为似乎 C 值没有必要的运行时元数据。(可惜我无法尝试,因为苹果仍未批准我的开发者帐户。) - Jeremy