swift 觀念QA
===
class 和struct 的區別
1. class 為類, struct 為結構體,
類是引用類型, 結構體為值類型, 結構體不可以繼承
struct 是 value type,class 是 reference type。
2. Swift 最棒的特点之一就是它内置了对整体结构的不可变性的支持
不过,真的需要用到可变性时,你应该怎么做呢?
A: struct function 要修改自己的屬性要加上mutating關鍵字。
String 與NSString 的關係與區別
NSString 與String 之間可以隨意轉換,
String是結構體,值類型, NSString是類,引用類型.
通常,沒必要使用NSString類,除非你要使用一些特有方法,例如使用pathExtension屬性
associatedtype 的作用
簡單來說就是protocol使用的泛型
例如定義一個列表協議
protocol ListProtcol {
associatedtype Element
func push(_ element:Element)
func pop(_ element:Element) -> Element?
}
什麼時候使用final
final用於限制繼承和重寫.如果只是需要在某一個屬性前加一個final.
如果需要限制整個類無法被繼承,那麼可以在類名之前加一個final
Optional(可選型) 是用什麼實現的
Optional是一個泛型枚舉
大致定義如下:
enum Optional<Wrapped> {
case none
case some(Wrapped)
}
除了使用let someValue: Int? = nil之外,還可以使用let optional1: Optional<Int> = nil來定義
?? 的作用
可選值的默認值, 當可選值為nil 的時候, 會返回後面的值. 如
let someValue = optional1 ?? 0
lazy 的作用
懶加載,當屬性要使用的時候,才去完成初始化
如
什麼是retain cycle/ Reference Cycle?
Swift透過ARC記憶體管理回收沒有被參考到的變數,常數,但有些情形會是物件間 相互參考,雖然失去外部參考。沒有人可以存取,但是記憶體始終不會被釋放。
什麼情況下會發生?
如何解決引用循環
1. 轉換為值類型, 只有類會存在引用循環, 所以如果能不用類, 是可以解引用循環的,
2. delegate 使用weak 屬性.
3. 閉包中, 對有可能發生循環引用的對象, 使用weak 或者unowned, 修飾
如果給Array中的元素(element)是String type, 增加一個extension 我們可以怎麼做?
A: 使用where 子句, 限制Element 為String
extension Array where Element == String {
var isStringElement:Bool {
return true
}
}
["1", "2"].isStringElement
//[1, 2].isStringElement// error