是Float,Double,Int是AnyObject吗?

Tom*_*ulc 18 ios swift swift2

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

1)Any是所有类型隐式符合的协议.

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

3) ,,Int 是结构FloatDouble

这是一个示例代码:

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")
}
Run Code Online (Sandbox Code Playgroud)

我不明白是为什么Int,Double,FloatAnyObjectS' 为什么编译器什么都没说?这些类型被声明为结构.Struct MyStruct不能传递给顶部的方法,因为它不符合AnyObject.

你能帮助我了解为什么Int,Double并且FloatAnyObject为什么编译器认为他们是谁?

vac*_*ama 33

因为你已经基金会进口Int,Double以及Float转换为:NSNumber当传递给服用的功能AnyObject.类型String转换为NSString.这样做是为了在调用基于CocoaCocoa Touch的界面时使生活更轻松.如果删除import UIKit(或import CocoaOS X),您将看到:

error: argument type 'Int' does not conform to expected type 'AnyObject'
Run Code Online (Sandbox Code Playgroud)

你打电话的时候

passAnyObject(a)
Run Code Online (Sandbox Code Playgroud)

这里描述了值类型到对象的隐式转换.


更新Swift 3(Xcode 8 beta 6):

传递一个Int,Double,String,或Bool到类型的参数AnyObject现在在一个错误的结果,例如类型"INT"的参数不符合预期类型"AnyObject".

使用Swift 3,已删除隐式类型转换.现在有必要投Int,Double,StringBoolas AnyObject以它传递给类型的参数AnyObject:

let a = 1
passAnyObject(a as AnyObject)
Run Code Online (Sandbox Code Playgroud)

  • @robo,在这种情况下,编译器会为您创建一个`NSNumber`对象.例如,如果您将`Int`传递给`func test(val:AnyObject)`然后使用`if val is NSNumber {print("true")}`测试函数内部,它确实会打印`true`,因为`Int`成为`NSNumber`. (3认同)