站在汇编角度深入了解 Swift(十七)

354 阅读1分钟
  • 在 AppDelegate 上面默认有个 @UIApplicationMain 标记,这表示
    • 编译器自动生成入口代码(main函数代码),自动设置 AppDelegate 为 App 的代理
  • 也可以删掉 @UIApplicationMain,自定义入口代码:新建一个 main.swift 文件

Substring

  • String 可以通过下标、prefix、suffix 等截取子串,子串类型不是 String,而是 Substring
  • Substring 和它的 base,共享字符串数据
  • Substring 转为 String 时,会重新分配新的内存存储字符串数据
var a = "123456789"
var b = a.prefix(3)
print(type(of: a), type(of: b))
print(b.base)
--------------执行结果---------------
String Substring
123456789

String 与 Character

  • for c in "abc" 这个时候 c 就是 Character 类型

Swift、OC桥接转换表

var a: NSString = "abc"
var b: String = "abc"
var c: NSMutableString = "abc"

print(a as String == b)
print((b as NSString).isEqual(to: a))
print(c as String == b)
--------------执行结果---------------
true
true
true

Swift、OC桥接转换表

只能被 class 继承的协议

  • 这个在前面的博客中写过
protocol Runnable1: AnyObject {}
protocol Runnable2: class {}
@objc protocol Runnable3 {}
  • 被 @objc 修饰的协议,还没写完可以暴露给 oc 去遵守实现

dynamic

  • 被 @objc dynamic 修饰的内容会具有动态性,比如调用方法会走 runtime 这套流程

KVC、KVO

  • Swift 支持 KVC、KVO 的条件
    • 属性所在的类】监听器最终继承自 NSObject
    • 用 @objc dynamic 修饰对应的属性

关联对象

  • 在 Swift 中,class 依然可以使用关联对象
  • 默认情况下,extension 不可以增加存储属性
private static var ageKey: Bool = false
var age: Int {
    set {
        objc_setAssociatedObject(self, &Self.ageKey, newValue, .OBJC_ASSOCIATION_ASSIGN)
    }
    get {
        objc_getAssociatedObject(self, &Self.ageKey) as! Int
    }
}

资源名管理

  • R.swift

多线程开发

  • 这个可以参考 OC 中的多线程开发
  • 如果想使用 dispatch_once,可以使用类型属性,或者全局变量/常量

思考

  1. Int? 占几个字节?