是Float,Double,Int是AnyObject吗?

时间:2015-09-13 20:43:55

标签: ios swift swift2

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

1)Any是一种所有类型都隐式符合的协议。

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?为什么编译器什么都没说?这些类型被声明为结构。结构MyStruct无法传递到顶部的方法,因为它不符合AnyObject

您能否帮助我理解为什么IntDoubleFloatAnyObject或编译器认为它们为什么?

3 个答案:

答案 0 :(得分:33)

由于您已导入基金会,IntDoubleFloat在转移到NSNumber的函数时会转换为AnyObject。类型String会转换为NSString。这样做是为了在调用 Cocoa Cocoa Touch 的界面时简化生活。如果删除import UIKit(或OS {的import Cocoa),您会看到:

error: argument type 'Int' does not conform to expected type 'AnyObject'

致电

passAnyObject(a)

here.

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

Swift 3(Xcode 8 beta 6)的更新:

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

使用Swift 3,隐式类型转换已被删除。现在需要使用Int投射DoubleStringBoolas AnyObject,以便将其传递给AnyObject类型的参数:

let a = 1
passAnyObject(a as AnyObject)

答案 1 :(得分:1)

好找! UIKit实际上将它们转换为NSNumber - @vacawama也提到过。这样做的原因是,有时您正在处理返回或使用AnyObject的代码,然后可以将此对象转换为as!或其他&#34 ;结构"

答案 2 :(得分:0)

class Test {

static func test() {
    let anyObjectsValues: [AnyObject] = [1, "Two", 3, "Four"] as [AnyObject]
    anyObjectsValues.forEach { (value) in
        switch value {
        case is Int:
            print("\(value) is an Int!")
        case is String:
            print("\(value) is a String!")
        default:
            print("\(value) is some other type!")
        }
    }
}

}

我还没有导入UIKit或Foundation框架。为什么编译器没有给出任何错误?甚至可以打印结果。

输出:

1是一个整数!

两个是一个字符串!

3是一个整数!

四个是一个字符串!

有人有主意吗?