是浮动,双重,诠释一个AnyObject?
我读了Swift的内联文档,我有点困惑。
1) Any
一种协议都是所有types都隐含地符合的。
2) AnyObject
是所有类都隐式符合的协议。
3) Int
, Float
, Double
是结构
这是一个示例代码:
import UIKit func passAnyObject(param: AnyObject) { print(param) } class MyClass {} struct MyStruct {} let a: Int = 1 let b = 2.0 let c = NSObject() let d = MyClass() let e = MyStruct() passAnyObject(a) passAnyObject(b) passAnyObject(c) passAnyObject(d) //passAnyObject(e) // Argument type 'MyStruct' does not conform to expected type 'AnyObject' if a is AnyObject { // b, d, e is also AnyObject print("\(a.dynamicType) is AnyObject") }
我不明白为什么Int
, Double
, Float
是AnyObject
? 为什么编译器不说什么? 这些types被声明为结构体。 Struct MyStruct
不能传递给顶端的方法,因为它不符合AnyObject
。
你能帮我理解为什么Int
, Double
和Float
是AnyObject
或为什么编译器认为他们是?
因为你已经导入了基础,当传递给一个带有AnyObject
的函数时, Int
, Double
和Float
被转换为NSNumber
。 typesString
被转换为NSString
。 这样做是为了让调用基于cocoa和Cocoa Touch的界面更轻松。 如果您删除import UIKit
(或import Cocoa
for OS X),您将看到:
error: argument type 'Int' does not conform to expected type 'AnyObject'
你打电话时
passAnyObject(a)
这里描述了将值types隐式转换为对象。
Swift 3(Xcode 8 beta 6)的更新:
将Int
, Double
, String
或Bool
传递给AnyObject
types的参数现在会导致错误,例如types为'Int'的参数不符合预期types'AnyObject' 。
使用Swift 3,隐式types转换已被删除。 现在有必要把Int
, Double
, String
和Bool
as AnyObject
来传递给AnyObject
types的参数:
let a = 1 passAnyObject(a as AnyObject)
好找! UIKit
实际上将它们转换为NSNumber
– 也被@vacawama提及。 原因是,有时你正在使用返回或使用AnyObject
代码,这个对象可以被当作一个Int
或其他“结构体”来施放( as!
)。