Swift中是否有确定变量类型的函数?我猜Python中可能有大约type()个.

我想用一种方法来判断一个变量是否是SWIFT中的基础对象或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]

我已经看到了判断given变量是否是this question中的given类型的答案,但我要说的是,这与我想问的完全不同.

推荐答案

通过使用.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]

通过try 附加一个float,我们可以看到这个新值具有相同的类型([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'

Swift相关问答推荐

如何取消正在视图修改器中运行的任务

为什么第二项任务不在第一项任务完成之前开始?(并发队列)

如何访问用户选定目录下的(只读)文件?

为什么枚举上的.allCases.forEach不是循环(继续和中断不起作用)?

SwiftData/PersistentModel.swft:540:致命错误:不支持的关系密钥路径ReferenceWritableKeyPath

如何在SWIFT Memory中处理对VAR数组的更新(对COW感到困惑)

如何使 onKeyPress 与 TextField 快速配合使用?

Swift计时器未触发

本地对象的异步/等待引用捕获总是安全的还是理论上不安全?

如何从我的 macOS 应用程序打开 (.log) 文件?

如何在 AppDelegate for Cocoa macOS 中创建 mainMenu 和菜单项?

从 Swift 列表中的行中检索值

如何让不同的组件拥有不同的动画?

如何在 Swift 中将 XPC 自定义类列入白名单?

理解 Swift 2.2 Select 器语法 - #selector()

使用 Alamofire 4.0 (Swift 3) 下载文件

如何快速制作虚线?

如何在 GCD 中停止 DispatchWorkItem?

如何快速识别字符串中的大写和小写字符?

如何停止 NSTimer.scheduledTimerWithTimeInterval