let mixed: [Any] = ["one", 2, true, (4, 5.3), { () -> Int in return 6 }]当你利用 Any 作为实例的具体范例时,你须要在访问其属性和方法之前把它转换成已知范例
if let first = mixed.first as? String { print("The first item, '\(first)', is a string.")}// Prints "The first item, 'one', is a string."AnyObject范例
全部类都隐式依照AnyObject协议,这也限制了AnyObject是只适用于Class范例的缘故原由。AnyObject与OC中的id一样,它可以体现恣意类的实例,译器不会对向声明为 id 的变量举行范例查抄。因此,导入的OC范例经常利用AnyObject作为属性、方法参数和返回值的范例。
由于在Swift中的String,Array等范例都是struct范例界说的了,酿成了值范例,与OC中的引用范例不同,并不能是AnyObject来体现。因此在混编时须要利用AnyObject范例将Swift的值范例来转化为OC的引用范例。
看下面的例子:
let s: AnyObject = "This is a bridged string." as NSStringprint(s is NSString)// Prints "true"let v: AnyObject = 100 as NSNumberprint(type(of: v))// Prints "__NSCFNumber"再看一个例子
let swiftInt: Int? = 1let swiftString: String = "miao" var array: [AnyObject] = []array.append(swiftInt as AnyObject) //Int,Array是布局体,恣意范例用Any,以是范例不符合,要强转范例array.append(swiftString as AnyObject)我们在这里声明白一个 Int 和一个 String,按理说它们都应该只能被 Any 代表,而不能被 AnyObject 代表的。但是你会发现这段代码是可以编译运行通过的。那是不是说实在 Apple 的编程指南堕落了呢?不是如许的,你可以打印一下 array,就会发现内里的元素实在已经酿成了 NSNumber 和 NSString 了,这里发生了一个主动的转换。在 Swift 和 Cocoa 中的这几个对应的范例是可以举行主动转换的。由于我们显式地声明白须要 AnyObject,编译器以为我们须要的的是 Cocoa 范例而非原生范例,而帮我们举行了主动的转换。
AnyClass