一、可选链(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
}
}
网友评论