Swift infomation - result0924/iosLearning GitHub Wiki

self vs Self

self The current value of struct  ex. 55, "hello", true

Self The current type of struct   ex. Int, String, Bool

Any vs AnyObject

Any: 任何類型
AnyObject: 任何class
Any包含的物件比AnyObject更多

Type Casting

  • is 確認類型 -> return bool
  • as? 嘗試轉型 -> return optional
  • as! 強制轉型 -> 回傳對應類型
  • as Bridge from Obj-C ex.(String to NSString)

Dictionary

如何在Dictionary的某個key的值設為nil
var dict = ["aaa": "bbb"]
dic["aaa"] = nil
此時連key都會不見
/// If you assign `nil` as the value for the given key, the dictionary
/// removes that key and its associated value.

要用
dict.updateValue(value: nil, forKey: "aaa")
才能正確設為nil

時間相關

inout

把一個掛有 didSet 的 property 丟入接受 inout 參數的方法,就算啥都沒做,didSet 仍會被觸動。
因為 inout 本身採取的做法是複製一份出來傳給方法修改,改完後再寫回去原本的地方,所以 didSet 就被觸發了。
一個理解原理但沒留心過的事實,從使用者的角度有點不太合乎邏輯,當留心。

Protocol 用途

  • 把特色獨立出來、套用通用的功能、提供設計的藍圖。
protocol SomeProtocol {
    var name: String { get set }
    var age: Int { get }
    static func == (lhs: Self, rhs: Self) -> Bool
}

extension SomeProtocol {
    var age: Int {
        18
    }
}

#### 屬性
- 所有屬性都用var宣告,只需要寫名稱、類型、以及是只要能get和set

#### 方法
- 只要定義名稱、參數、回傳值。
- 描述該如何設計某個東西。
- 可能是描述某種特性或一系列相關的功能。

#### extension
- 在extension中設定同樣的名稱的屬性或方法、conform的時候就不一定要設定

### conforms to other protocol
protocol SomeProtocol: Equatable {

}
- 不能透過extension來增加protocol的增加其它protocol的要求、
因為其它protocol的要求可能要影響現在已經順利conform的類型、
讓它們變成不符合規範的、這就像我們不能夠在class的extension裡面、
要求新增儲存屬性一樣、那些都會影響到現在已經順利執行的Code
extension可以做的是可以在不影響現在功能的情況上、再加上更多東西

Opaque

什麼是Opaque?
  • protocol 前面加上 some 、就建立了一個 Opaque 的類型。
  • Opaque 的類型一定是某「一個類型」。
  • 呼叫端拿到這個回傳值,也只知道他是某一個固定的類型。
為什麼需要Opaque?
  • 可以隱藏太複雜且對呼叫端沒有意義的類型
  • Opaque 的回傳幫助呼叫端專注在「可以做的事情」、而不是「類型」
  • 回傳的類型更換時不影響外部的code,因為無論是什麼,對外部來說都只能操作 protocol 定義出來的部分
只知道功能的類型
  • Protocol:在沒有 Selfassociatedtype 定義的時候、能直接被當作類型用

    • Generic :呼叫端決定一種類型
    • Opaque:定義時決定一種類型
  • 為什麼 Opaque 又被稱為反向的 Generic

    • 是對於定義和知道具體類型是什麼的位置相反。
    • Generic 是設計時不知道,由呼叫端定義這個類型,所以呼叫端知道實際上是什麼類型;
    • Opaque 是設計者知道明確類型,但選擇不讓外部知道。所以呼叫端沒有完整的類型資訊。
  • Opaque 把類型隱藏,除了可以讓我們不用自己寫出繁瑣的類型,還有什麼用處?

    • 讓呼叫端只拿到需要的資訊,專注在相關的設計。
  • Opaque 隱藏和把屬性與方法設成 private 有什麼不同?

    • private 是對所有外部都統一不公開,但外部還是知道是哪個類型︰
    • opaque 可以根據情境,公開不同的資訊。
  • SwiftUI 為什麼大量使用 some View

    • 省去建立 View 的人寫出「確切」類型的麻煩,因為這個類型對我們沒有意義,我們只想專注在我們確實的建立了「一個 View」。
Refer: Opaque類型判紹&使用情境 

static let

Stored type properties are lazily initialized on their first access. 
They’re guaranteed to be initialized only once, even when accessed by multiple threads simultaneously, 
and they don’t need to be marked with the lazy modifier.

Refer

Swift array sort string