一.Swift和OC的區(qū)別?
- 1.swift是靜態(tài)語言之剧,有類型推斷郭卫,OC是動態(tài)語言。
- 2.swift面向協(xié)議編程背稼,OC面向對象編程
- 3.swift注重值類型贰军,OC注重引用類型。
- 4.swift支持泛型,OC只支持輕量泛型
- 5.swift支持靜態(tài)派發(fā)(效率高)词疼、動態(tài)派發(fā)(函數表派發(fā)俯树、消息派發(fā))方式,OC支持動態(tài)派發(fā)(消息派發(fā))方式贰盗。
- 6.swift支持函數式編程
- 7.swift的協(xié)議不僅可以被類實現许饿,也可以被struct和enum實現
- 8.swift有元組類型、支持運算符重載
- 9.swift支持命名空間
- 10.swift支持默認參數
- 11.swift比oc代碼更加簡潔
二舵盈、swift的派發(fā)機制
- 1.函數的派發(fā)機制:靜態(tài)派發(fā)(直接派發(fā))陋率、函數表派發(fā)、消息派發(fā)
- 2.swift派發(fā)機制總結:
**1.swift中所有值類型:struct秽晚、enum使用直接派發(fā)瓦糟。
**2.swift中協(xié)議的extensions(類似于OC的分類)使用直接派發(fā),初始聲明函數使用函數表派發(fā)
**3.swift中class中extensions使用直接派發(fā)赴蝇,初始化聲明函數使用函數表派發(fā)菩浙,dynamic修飾的函數使用消息派發(fā)。
**4.swift中NSObject的子類用@nonobjc或final修飾的函數使用直接派發(fā)扯再,初始聲明函數使用函數表派發(fā)芍耘,dynamic修飾的extensions使用消息派發(fā) - 3.swift中函數派發(fā)查看方式:可將swift代碼轉換為SIL(中間碼)
swiftc -emit-silgen -O example.swift
三、swift顯示指定派發(fā)方式熄阻?
- 1.添加final關鍵字的函數使用直接派發(fā)
- 2.添加static關鍵字函數使用直接派發(fā)
- 3.添加dynamic關鍵字函數使用消息派發(fā)
- 4.添加@objc關鍵字的函數使用消息派發(fā)
- 5.添加@inline關鍵字的函數告訴編譯器可以使用直接派發(fā)
四斋竞、Struct和Class區(qū)別?
- 1.Struct不支持繼承秃殉、Class支持繼承
- 2.Struct是值類型坝初,Class是引用類型
- 3.Struct無法修改自身屬性值,函數需要添加mutating關鍵字
- 4.Struct初始化方法是基于屬性的
- 5.Struct不需要deinit方法钾军,因為值類型不關心引用計數鳄袍,Class需要deinit方法。
五吏恭、Swift中的常量和OC中的常量有啥區(qū)別拗小?
OC中的常量(const)是編譯期決定的,Swift中的常量(let)是運行時確定的
六樱哼、swift中mutating的作用哀九?
swift中協(xié)議是可以被Struct和enum實現的,mutating關鍵字是為了能在被修飾的函數中修改struct或enum的變量值搅幅。對Class完全透明阅束。
七、final關鍵詞的用法
final關鍵詞的作用:它修飾的類茄唐、方法息裸、變量是不能被繼承或重寫的,編譯器會報錯。它可以顯示的指派函數的派發(fā)機制呼盆。
八年扩、lazy關鍵詞的用法
lazy關鍵詞的作用:指定延遲加載(懶加載),懶加載存儲屬性只會在首次使用時才會計算初始值屬性宿亡。
lazy修飾的屬性非線程安全的常遂。