我读到了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
s?为什么编译器什么都不说?这些类型被声明为结构。无法将结构MyStruct
传递给顶部的方法,因为它不符合AnyObject
。
你能帮助我理解为什么Int
,Double
和Float
是AnyObject
,或者为什么编译器认为它们是AnyObject
吗?
发布于 2015-09-14 04:59:43
很好的发现!UIKit
实际上将它们转换为NSNumber
-- @vacawama也提到过。这样做的原因是,有时您正在处理返回或使用AnyObject
的代码,然后此对象可以转换(as!
)为Int
或其他“结构”。
发布于 2020-01-20 19:18:55
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或基础框架。为什么编译器没有给出任何错误?甚至它还会打印结果。
输出:
%1是Int!
二是一个字符串!
3是一个整数!
四是一个字符串!
有谁有主意吗?
https://stackoverflow.com/questions/32554357
复制相似问题