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

2022-08-13  本文已影响0人  Sweet丶
一、可选链(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
    }
}
上一篇 下一篇

猜你喜欢

热点阅读