我阅读了Swift的内联文档,我有点困惑。
1)Any
是一种所有类型都隐式符合的协议。
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
?为什么编译器什么都没说?这些类型被声明为结构。结构MyStruct
无法传递到顶部的方法,因为它不符合AnyObject
。
您能否帮助我理解为什么Int
,Double
和Float
是AnyObject
或编译器认为它们为什么?
答案 0 :(得分:33)
由于您已导入基金会,Int
,Double
和Float
在转移到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)
描述了值类型到对象的隐式转换
将Int
,Double
,String
或Bool
传递给AnyObject
类型的参数现在会导致错误,例如参数类型'Int'不符合预期类型'AnyObject'。
使用Swift 3,隐式类型转换已被删除。现在需要使用Int
投射Double
,String
,Bool
和as 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是一个整数!
四个是一个字符串!
有人有主意吗?