这里每天分享一个 iOS 的新知识,快来关注我吧
前言
在日常 swift 开发中你肯定会经常看到这两个关键字 Any 和 AnyObject,它们都是 swift 中的匿名类型,允许你将任何值转换为特定类型。
但是它们也有一些不同点,今天就来介绍一下这两个关键字的作用和用法。
Any
Any 指的是类、结构或枚举等的任何实例。比如我有个元素为 Any 的数组,并在初始化的时候放入一些数据:
class MyClass {}
struct MyStruct {}
enum MyEnum {
case myCase
}
var anyArray: [Any] = [
1,
"string",
3.0,
MyClass(),
MyStruct(),
MyEnum.myCase
]
从上图中可以看出,anyArray 添加了 Int、String、Double 类型,以及我自定义的 class、struct 和 enum。
这印证了上边所说的,Any 可以指代任何类型的实例,因为函数也是一种实例(在 swift 中函数是一等公民),因此函数也可以被添加进去:
func myFunc(args: String) {
print("args is \(args)")
}
anyArray.append(myFunc)
使用数组中的元素时可以直接用 as 转换为对应的类型:
for any in anyArray {
switch any {
case let a as Int:
print("\(a) is Int type")
case let a as String:
print("\(a) is String type")
case let a as Double:
print("\(a) is Double type")
case let a as MyClass:
print("\(a) is MyClass type")
case let a as MyStruct:
print("\(a) is MyStruct type")
case let a as MyEnum:
print("\(a) is MyEnum type")
case let a as ((String) -> ()):
print("\(a) is Function type")
default:
print("\(any) is Other type")
}
}
AnyObject
AnyObject 相当于 Objective-C 中的 id,指类的任何实例,强调的是类,不能代表结构体和枚举,比如定义一个元素为 AnyObject 的数组:
var anyObjectArray: [AnyObject] = [
MyClass(),
MyClass1(),
]
那么这个数组只能添加类的实例,如果添加了值类型,则会报错:
使用数组中的元素时可以直接用 as 转换为对应的类型:
for c in anyObjectArray {
switch c {
case let _c as MyClass:
print("\(_c) is MyClass")
case let _c as MyClass1:
print("\(_c) is MyClass1")
default:
print("\(c) is Other Class")
}
}
另外当你的协议(protocol)想要限制只能与类一起使用时,也可以使用 AnyObject:
protocol MyAnyObjectProtocol: AnyObject {
// MyAnyObjectProtocol 只能被类遵守
}
Any 和 AnyObject 的区别
Any 可以表示任何类型的实例,包括函数类型。
AnyObject 可以表示任何类类型的实例。
点击下方公众号卡片,关注我,每天分享一个关于 iOS 的新知识
本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!