Swift中AnyObject、Any、AnyClass、T.self、T.Type、type(of:)、Self的使用和区别

简介: Swift中AnyObject、Any、AnyClass、T.self、T.Type、type(of:)、Self的使用和区别
  • AnyObject: 代表任意类的instance,是所有类都隐式遵守的协议;
  • Any: 代表任意类型,包括funcation类型或者optional 类型;
  • AnyClass: 代表任意实例的类型,本质是AnyObject.Type;
  • T.self: 如果T是实例对象,返回的就是它本身,T 如果是类,那么返回的是 Metadata;
  • T.Type: 一种类型,T.self 是 T.Type 类型
  • type(of:): 用来获取一个值的动态类型
  • Self:指的是当前类型(可以做约束使用)

AnyObject和AnyClass的关系:

public typealias AnyObject
public typealias AnyClass = AnyObject.Type

其他使用示例,具体解释见注释(根据代码运行结果、自行体会)

class Person {
    var name: String?
    required init() {}
    static func clsMethod() {
        print("clsMethod")
    }
}
func testWrapped() {
    print(AnyObject.self) //打印:AnyObject
    print(AnyClass.self) //打印: AnyObject.Type
    let imageView = UIImageView()
    let controller = UIViewController()
    let p = Person()
    func test() {}
    let views: [AnyObject] = [imageView, controller, p] //这里不可以存放test
    print(views) //打印: [<UIImageView: 0x7f96f9307b30; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x600001959a40>>, <UIViewController: 0x7f96f9307d50>, SwiftTest.Person]
    let anys: [Any] = [test, imageView, controller, p]
    print(anys) //打印: [(Function), <UIImageView: 0x7f96f9307b30; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x600001959a40>>, <UIViewController: 0x7f96f9307d50>, SwiftTest.Person]
    let v1: Person.Type = Person.self //Person.Type 元类型
    v1.clsMethod() //打印:clsMethod
    let v2: AnyClass = Person.self
    (v2 as! Person.Type).clsMethod() //打印:clsMethod
    let p2: Person.Type = type(of: p)
    let p3: Person = p2.init()
    p3.name = "lisi"
    print(p3.name ?? "") //打印:lisi
    p.name = "zhansan"
    let v3 = p.self
    print(v3.name ?? "") //打印:zhansan
    let p5: Person.Type = p2.self //p2.self是Person.Type类型
    let p6 = type(of: Person.self) //p6是Person.Type.Type类型
    let p7 = type(of: p2) //p7是Person.Type.Type类型
    print(p6 == p7) //打印:true
}

AnyObject可以作为协议的约束,只能被类所遵守

protocol ImageContainer: AnyObject {
    func test()
}
class Image: ImageContainer {
    func test() {
    }
}
struct Config: ImageContainer {
    //报错: Non-class type 'Config' cannot conform to class protocol 'ImageContainer'
}

Self通常对协议或者返回值做限制,示例中代表只有继承自UIView的类或者子类才可以实现协议

protocol ImageContainer where Self: UIView {
    func test() -> Self
}
class SubView: UIView, ImageContainer {
    func test() -> Self {
        return self
    }
}
class Image: ImageContainer {
    //报错:'ImageContainer' requires that 'Image' inherit from 'UIView'
}
相关文章
|
3月前
|
存储 Swift
Swift 语言:什么是闭包(Closure)?它们与函数的区别是什么?
Swift 语言:什么是闭包(Closure)?它们与函数的区别是什么?
82 1
|
3月前
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
134 0
|
10月前
|
安全 程序员 编译器
2 Swift 和 Objective-C的区别
Swift 和 Objective-C的区别
73 0
|
编译器 Swift 开发者
对Swift中some和any关键字的理解
在最新Swift版本中(Xcode14,Swift5.7),如果协议中有使用泛型,则如果要将此协议作为参数类型,必须使用any关键字进行修饰。其实在Swift5.1中也引入过一个some关键字,any和some都适用于协议,这两个关键字从语义上和写法上对泛型的使用进行了优化。
942 0
|
存储 Swift
Swift5.1—Any 和 AnyObject 的类型转换
Swift5.1—Any 和 AnyObject 的类型转换
270 0
|
安全 Swift C语言
Swift和OC的区别
Swift和OC的区别
254 0
12.Swift学习之Any、AnyObject与类型转化
Any、AnyObject Any是一个空协议集合的别名,它表示没有实现任何协议,因此它可以是任何类型,包括类实例与结构体实例。可以表示任何类型,包括函数类型。
1905 0
《从零开始学Swift》学习笔记(Day 55)——使用try?和try!区别
<span style="font-family:宋体;font-size: 10.5pt; mso-ascii-font-family: Arial; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Arial; mso-bidi-font-family: A
1226 0