---
# System prepended metadata

title: swift 觀念QA

---

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
