关键字 Any 和 AnyObject 的用法和区别

256 阅读2分钟

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

在日常 swift 开发中你肯定会经常看到这两个关键字 AnyAnyObject,它们都是 swift 中的匿名类型,允许你将任何值转换为特定类型。

但是它们也有一些不同点,今天就来介绍一下这两个关键字的作用和用法。

Any

Any 指的是类、结构或枚举等的任何实例。比如我有个元素为 Any 的数组,并在初始化的时候放入一些数据:

class MyClass {}
struct MyStruct {}
enum MyEnum {
    case myCase
}

var anyArray: [Any] = [
    1,
    "string",
    3.0,
    MyClass(),
    MyStruct(),
    MyEnum.myCase
]

从上图中可以看出,anyArray 添加了 IntStringDouble 类型,以及我自定义的 classstructenum

这印证了上边所说的,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新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!