我阅读了 Swift 的内联文档,但有点困惑。
1) Any
是所有类型都隐式遵守的协议(protocol)。
2) AnyObject
是所有类都隐式遵守的协议(protocol)。
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
?为什么编译器什么都不说?这些类型被声明为结构。结构 MyStruct
不能传递给顶部的方法,因为它不符合 AnyObject
。
你能帮我理解为什么 Int
、Double
和 Float
是 AnyObject
或者为什么编译器认为它们是?
最佳答案
因为您导入了 Foundation,Int
、Double
和 Float
在传递给时会转换为 NSNumber
采用 AnyObject
的函数。类型 String
被转换为 NSString
。这样做是为了在调用基于 Cocoa 和 Cocoa Touch 的界面时让生活更轻松。如果您删除 import UIKit
(或 import Cocoa
for OS X),您将看到:
error: argument type 'Int' does not conform to expected type 'AnyObject'
当你打电话时
passAnyObject(a)
描述了值类型到对象的这种隐式转换 here.
Swift 3 更新(Xcode 8 beta 6):
将 Int
、Double
、String
或 Bool
传递给 AnyObject 类型的参数
现在会导致错误,例如 Argument of type 'Int' does not conform to expected type 'AnyObject'。
在 Swift 3 中,隐式类型转换已被移除。现在需要将 Int
、Double
、String
和 Bool
转换为 as AnyObject
为了将它传递给 AnyObject
类型的参数:
let a = 1
passAnyObject(a as AnyObject)
关于ios - Float、Double、Int 是 AnyObject 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32554357/