如何在Swift中确定变量的类型

时间:2014-06-07 03:45:52

标签: swift

是否有一个函数来确定Swift中的变量类型?我认为在Python中可能会有像type()这样的东西。

我想要一种判断变量是否是Swift中的Foundation对象或C变量的方法。像NSString vs String,或NSArray vs array。这样我就可以在控制台中将其注销,并清楚地看到它是什么。

例如,我想知道下面第一个array的推断类型:

var array = [1,2,3]  // by default NSArray or array?
var array:[Int] = [1,2,3]
var array:NSArray = [1,2,3]
var array:Array<Any> = [1,2,3]

我已经看到了判断给定变量是否是this question中某种给定类型的答案,但我会说出来&#39 ;与我想问的完全不同。

5 个答案:

答案 0 :(得分:25)

您可以使用.dynamicType属性获取对值的类型对象的引用。这相当于Python的type()函数,并提到了in the Swift documentation under Language Reference: Types: Metatype Type

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()方法,使用in SiLo's answer

println(mixedArrayType.description())
__NSArrayI

然而,在Swift的内置数组等类型中并不存在这种情况。

println(typeOfArray.description())
error: '[Int].Type' does not have a member named 'description'

答案 1 :(得分:21)

选项+点击您要检查的变量。

enter image description here

答案 2 :(得分:10)

有可能这样做,虽然它不一定简单也没用:

func getClassName(obj : AnyObject) -> String
{
    let objectClass : AnyClass! = object_getClass(obj)
    let className = objectClass.description()

    return className
}

let swiftArray = [1, 2, 3]
let swiftDictionary = ["Name": "John Doe"]
let cocoaArray : NSArray = [10, 20, 30]
var mutableCocoaArray = NSMutableArray()

println(getClassName(swiftArray))
println(getClassName(swiftDictionary))
println(getClassName(cocoaArray))
println(getClassName(mutableCocoaArray))

输出:

_TtCSs22ContiguousArrayStorage00007F88D052EF58
__NSDictionaryM
__NSArrayI
__NSArrayM

您最好在Swift中使用isas个关键字。许多基础类使用类集群(正如您可以看到__NSArrayI(不可变)和__NSArrayM(可变)。

注意有趣的行为。 swiftArray默认使用Swift Array<Int>swiftDictionary默认为NSMutableDictionary。有了这种行为,我就不会真正依赖任何特定类型的东西(先检查)。

答案 3 :(得分:5)

有人在上面提到了这一点,但我认为它应该作为答案而不是评论的可见性。您现在可以简单地使用type(of:___):

var red, green, blue: Double
print(type(of: green))

产量

  

答案 4 :(得分:0)

我在debuging期间使用断点但是如果你需要在运行时检查它们是否与某种类型匹配,那么drewag是正确的

你可以做的另一件事是使用断言测试数据类型这只能在调试中工作但是通过断言你可以设置条件,如果遇到应用程序崩溃

可能类似于assert(let tArray == oldArray as? NSArray[] //if not NSArray app crashes)