是浮动,双重,诠释一个AnyObject?

我读了Swift的内联文档,我有点困惑。

1) Any一种协议都是所有types都隐含地符合的。

2) AnyObject是所有类都隐式符合的协议。

3) IntFloatDouble是结构

这是一个示例代码:

 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") } 

我不明白为什么IntDoubleFloatAnyObject ? 为什么编译器不说什么? 这些types被声明为结构体。 Struct MyStruct不能传递给顶端的方法,因为它不符合AnyObject

你能帮我理解为什么IntDoubleFloatAnyObject或为什么编译器认为他们是?

因为你已经导入了基础,当传递给一个带有AnyObject的函数时, IntDoubleFloat被转换为NSNumber 。 typesString被转换为NSString 。 这样做是为了让调用基于cocoaCocoa 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)的更新:

IntDoubleStringBool传递给AnyObjecttypes的参数现在会导致错误,例如types为'Int'的参数不符合预期types'AnyObject'

使用Swift 3,隐式types转换已被删除。 现在有必要把IntDoubleStringBool as AnyObject来传递给AnyObjecttypes的参数:

 let a = 1 passAnyObject(a as AnyObject) 

好找! UIKit实际上将它们转换为NSNumber – 也被@vacawama提及。 原因是,有时你正在使用返回或使用AnyObject代码,这个对象可以被当作一个Int或其他“结构体”来施放( as! )。