美文网首页
Swift-可选链及类型、类型转换相关关键字

Swift-可选链及类型、类型转换相关关键字

作者: Sweet丶 | 来源:发表于2022-08-13 11:33 被阅读0次
    一、可选链(Optional Chining)
    // 1.对象方法或属性调用的可选链
    let age = person?.dog?.age
    
    // 2.获取集合类型中数据后再次取值或赋值的可选链
    let aa = data["billItem"]?["id"]
    data["billItem"]?["id"] = 900
    
    // 3.一个可选类型赋值的可选链
    var num1: Int? = nil
    num1? = 10 // 这句因为num1是nil,所以不会赋值成功
    var num2: Int? = 3
    num2? = 10 // 这句能赋值成功
    
    二、Any、AnyObject、is、as

    Any:代表任意类型。
    AnyObject:代表任意类类型。
    is: 用于判断实例是否是某个类型、或遵守某个协议。
    as: 用于变量定义、向父类转换中,如下例子。
    as? : 用于转换数据类型并且可能转换失败的情况,转换成功是可选类型,转换失败时nil。
    as!: 相当于as?之后再强制解包,这个是有风险的。

    // AnyObject例子:限定给类遵守的协议
    protocol XXXProtocol: AnyObject {}
    
    // is用于判断类型或遵守协议
    if rawValue is NSNull { return nil }
    switch curVC {
    case is UITabBarController:
        // ...
    case is UINavigationController:
    }
    
    // as的例子
    let num3 = num as CGFloat // 声明 num3 的类型为 CGFloat
    let animat = Dog() as Animat // 将子类向上转换为父类的父类类型 Animat
    let num = Int("123") as Any
    
    // as? 将数据转为字典,data为字典的可选类型
    let data = response["data"] as? [String: Any]
    // as! 下面是将"data"强制转换为字典,失败时会闪退
    let data2 = response["data"] as! [String: Any]
    
    三、X.self、X.Type、AnyClass、Self、type(of: T)

    X.self: 一个元类型(metadata)指针,metadata中存放着类型相关信息(可以是值类型和引用类型)。
    X.Type:一个类型,比如X.self属于X.Type类型。
    type(of: T): 一般用于获取实例的元类型指针,值等价于X.self
    AnyClass: Anyobject.self的值,代表任意类类型。

    // X.self:比如参数是一个元类型时使用
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
    
    // HBA是一个类,ZHXL是HBA的子类
    // hbaType是HBA的元类型指针
    let hbaType: HBA.Type = HBA.self
    
    // hba是一个HBA的实例
    let hba = HBA.init(no: "", name: "")
    
    // AnyClass的定义:public typealias AnyClass = AnyObject.Type
    // AnyClass=任意对象类型的元类型
    var anyClsType: AnyClass = AnyObject.self
    anyClsType = HBA.self
    anyClsType = ZHXL.self
    
    // 获取实例的类型: type(of: xxx)和.self等价
    // 对象类型、结构体类型、枚举类型都可以使用type(of: xxx)和.self
    print(type(of: hba) == hbaType) // true
    
    // ZLFrame是结构体类型
    let frameType: ZLFrame.Type = ZLFrame.self
    let frame = ZLFrame(rotateAngleY: 10)
    print(type(of: frame) == frameType) // true
    
    // Direction2是个枚举
    let directionType: Direction2.Type = Direction2.self
    let direction = Direction2.east
    print(type(of: direction) == directionType) // true
    

    Self: 1.在方法中声明中作为返回值代表返回自身类型的实例;2.在方法中使用时,代表当前类型。结构体、枚举、类中都可以使用。

    // Self可以在结构体、类、枚举中使用:
    // 1.约束方法的返回值类型;2.访问自身类型属性。3.访问自身类型方法
    // 下面以类为例子
    class Tiger: Animal {
        static let animalType = "猫科动物"
        
        // 要用Self为返回值的类型方法,必须要有required的初始化器
        required init(with: String) { }
    
        // 1.Self用于表示方法返回自身类型或者自身子类类型的实例
        static func getObject() -> Self {
            // 2.这里的Self用于表示方法调用者的类型
            let tiger = Self.init(with: "dandy")
    
            // 3.这里的Self用于访问自身的类型属性
            let animalType = Self.animalType
            print("初始化了一个\(animalType)")
            return tiger
        }
        
        // 4.实例方法返回Self并不要求有required的初始化器
        @discardableResult
        func getObject() -> Self {
            return self
        }
    }
    

    相关文章

      网友评论

          本文标题:Swift-可选链及类型、类型转换相关关键字

          本文链接:https://www.haomeiwen.com/subject/glufgrtx.html