Swift-Initialization

閱讀時間約 11 分鐘

swift讀書筆記

Documentation
Edit descriptiondocs.swift.org

objective-c 的init 會return value,swift 不會。

所有的property都必須在Init()裡面設定初始值,或設定stored property,這種情況給值下不會觸發property observers。如果是初始化時沒辦法確定值,或可能為nil,型別可設成?

如果property值不會改變的話,建議直接給一個預設值,而不是在Init()裡設定。這種做法讓init()、deinit()都更簡潔。

特殊寫法:在init的時候assign constant property

class SurveyQuestion {
let text: String
var response: String?
init(text: String) {
self.text = text
}
func ask() {
print(text)
}
}

概念近似於Flutter的final,由於實際上是常數,只能賦值一次。

Flutter final與const的差異

Constant

Value must be known at compile-time, const birthday = "2008/12/25"
Can’t be changed after initialized.

FINAL

Value must be known at run-time, final birthday = getBirthDateFromDB()
Can’t be changed after initialized.

Default Initializer

任何class和struct都會有至少一個initializer(沒特別寫就是default)。default initializer創造新的instance並對裡面的property 賦值。

class ShoppingListItem {
var name: String?
var quantity = 1
var purchased = false
}
var item = ShoppingListItem()

Memberwise initializers for struct

如果沒有寫custom init的方法,struct會自動產生memberwise initializer。

struct Size {
var width = 0.0, height = 0.0
}
let twoByTwo = Size(width: 2.0, height: 2.0)

當呼叫memberwise initializer時,可以省略任何具有預設值的property的值。在上面的範例中,struct Size的屬性都有預設值。可以任意省略其中一個屬性或兩個屬性,並且initializer將使用省略的預設值。例如:height width

let zeroByTwo = Size(height: 2.0)
print(zeroByTwo.width, zeroByTwo.height)
// Prints "0.0 2.0"


let zeroByZero = Size()
print(zeroByZero.width, zeroByZero.height)
// Prints "0.0 0.0"

class 如何使用 memberwise initializer??

Xcode > 選取class

Refactor > Generate Memberwise Initializer

Initializer delegation

initializer可以呼叫其他的initializer來完成初始化,避免重複的code。

Value types比較單純,因為不支援繼承,所以只能呼叫自己提供的initializer,可以使用self.init來呼叫其他initializer。Class 的initialization 必須確保繼承來的property也完成初始化。

如果value types寫了custom initializer,就不能再存取default / memberwise initializer。這是避免有其他人用成自動產生的initializer就跳過在custom initializer的額外設定。如果想要三種都保留的話,可以把custom initializer寫在extension裡。

raw-image

沒特別寫有自動產生default 和 memberwise兩種init 方法

raw-image

只剩custom init

raw-image

把custom init寫在extension,集滿三種init

Class Initializations: Designated Initializers and Convenience Initializers

Designated initializers 是 class主要的 init方法,通常情況只會有一個。但也有可能從superclass繼承來,就會有多個。任何class都必須最少有一個。

Convenience initializers 是 class 次要的 init方法,可以用他來呼叫Designated initializers。不一定要有。

初始化代理流程

  1. designated initializer必須呼叫上層的designated initializer。

2. convenience initializer 只能呼叫同一個層級的initializer。

3. convenience initializer最終必須呼叫designated initializer。

A simple way to remember this is:

  • Designated initializers 方向往上
  • Convenience initializers 橫向發展
raw-image

兩階段初始化

class初始化有兩階段。第一階段,先把所有stored property賦予初始值。第二階段,每個class在形成instance前,可以自訂自己的property值。兩階段是確保不會有property在初始化結束前就被存取,同時也確保property的值不會意外的被其他init改掉。

意外的小知識:objc跟swift很像都是二階段初始化,差別是objc第一階段全部塞0或nil。

第一階段

*先呼叫class的initializer

*分配記憶體給等下的instance。這時候還在準備中。

*designated initializer確保所有的property都有值。分配給這部分的property的記憶體已準備好。

*designated initializer往上☝️交給上層的designated initializer重複剛剛的任務,一直到最上層的class。

*到頂端後,所有的property都已經有值,instance的記憶體也準備完成。第一階段結束。

raw-image

第二階段

*從上往下,每個designated initializer都有自訂instance的空間。這個時機點可以存取self、修改property、呼叫instance method。

*最後!!換convenience initializer自訂instance&存取self。

raw-image

繼承Initialization

只能繼承designated initializer,不能繼承convenience initializer。如果subclass的convenience initializer跟superclass一樣,那這個subclass就永遠無法直接call到superclass的convenience initializer。

Failable Initializer

init keyword (init?)

在失敗的時候創造一個optional的type。雖然寫法是return nil,成功的時候不必寫return 物件。因爲嚴格來說,initialization並沒有真正return東西。不能同時存在同參數的init和init?。

Creates an integer from the given floating-point value, if it can be represented exactly.

init?(exactly source: Double)
let wholeNumber: Double = 12345.0
let pi = 3.14159


if let valueMaintained = Int(exactly: wholeNumber) {
print("\(wholeNumber) conversion to Int maintains value of \(valueMaintained)")
}
// Prints "12345.0 conversion to Int maintains value of 12345"


let valueChanged = Int(exactly: pi)
// valueChanged is of type Int?, not Int


if valueChanged == nil {
print("\(pi) conversion to Int doesn't maintain value")
}

Required Initializers

標示required 讓 subclass都必須實行這個init。有required就不必再寫override。

class SomeClass {
required init() {
// initializer implementation goes here
}
}

Setting Default property with functions and closures

class SomeClass {
let someProperty: SomeType = {
// create a default value for someProperty inside this closure
// someValue must be of the same type as SomeType
return someValue
}()
}

最後會有一個()結尾,這是告訴swift要馬上執行這個closure。沒有寫的話只是單純把closure assign給這個變數。

不能在closure裡用self的東西,因為這時候instance裡的其他部分都還沒初始化完成。

跟computed Property的差別

raw-image
  1. 寫法不同,computed property只能用var,後面也不需跟著()
  2. computed property每次叫到都會重新計算結果,stored property只會初始化一次。
6會員
35內容數
紀錄iOS開發上遇到的問題或是一些流程筆記。主要都是Swift。
留言0
查看全部
發表第一個留言支持創作者!
Michelle Chen的沙龍 的其他內容
其實16也會ㄏㄏ 相關討論: https://developer.apple.com/forums/thread/703145 重現步驟: 在iOS15以上,使用UIActivityViewController執行下列步驟會crash 1. 開啟UIActivityViewControlle
一般來說在swift把Date轉成String,會使用dateFormat轉換 使用HH:mm轉成24小時制需注意的地方
其實16也會ㄏㄏ 相關討論: https://developer.apple.com/forums/thread/703145 重現步驟: 在iOS15以上,使用UIActivityViewController執行下列步驟會crash 1. 開啟UIActivityViewControlle
一般來說在swift把Date轉成String,會使用dateFormat轉換 使用HH:mm轉成24小時制需注意的地方
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
本文介紹了 Swift 語言中的各種數學運算子,包括基本數學運算子、複合賦值運算子、比較運算子、邏輯運算子和範圍運算子。將提供使用這些運算子的方式及其優先順序規則,讓讀者能輕鬆理解如何在程序中實現數值與邏輯運算,並掌握 Swift 中的運算子使用技巧。
本文章介紹 Swift 語言中變數的建立方法,包括變數與常數的宣告、型別推斷、型別註記以及常見資料型別。本文詳細說明瞭可選型別的意義、變數命名的規則和作用域的概念,幫助讀者更有效地使用 Swift 語言進行程式設計。
使用者回報的超級奇怪線上問題,用數字鍵盤(NumberPad)更改欄位時,送出後尾數都會消失。例如:30 ⭢ 3,52 ⭢ 5。 尋尋覓覓了兩天終於被我找到這篇,apple的奇葩的bug 重現條件 iOS17 手機設定是繁體中文語系 前一個用過的鍵盤是Cangjie倉頡 or Suchen
Emergency lockout solutions provide critical assistance when you find yourself locked out of your home, car, or office. These services are designed to
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
Hahaha, I can't even say it with a straight face! / 哈哈哈!要得到我的原諒,等下輩子吧你!
三元條件運算子(Ternary Conditional Operator)是一種簡潔的寫法,用於在滿足條件時返回一個值,否則返回另一個值。 基本語法 其中,condition是要測試的條件,如果為true,則返回valueIfTrue,否則返回valueIfFalse。
Thumbnail
10月21日午夜,美國歌手Taylor Swift發布其全新錄音室專輯《Midnights》。此張專輯自宣布到發行過程不斷引發大量話題,在發行當下更不斷打破各項紀錄。作品以獨立流行為底,「失眠的13個夜晚」為概念,融合過往音樂風格和特色,打造出別具特色的低迴氛圍,著實是2022年底音樂界的一部佳作。
Thumbnail
10/22泰勒絲終於釋出新專輯的曲目 其中我最喜歡的就是Glitch適度的慵懶和性感 我用了我理解的方式翻譯啦 歡迎大家留言指正檢討我嗚嗚但溫柔一點 we were supposed to be just friends 我們應該只適合當朋友吧 you don't live in my part o
Thumbnail
泰勒絲(Taylor Swift )當初從藝人開始跨出純演藝圈,明白讓大家知道他,這個玉女,要踏進政治的髒水,來關心政治的時候,寫了這首歌,歌名是《只要還年輕》(Only the young),鼓勵尤其是年輕人更不要灰心喪志,因為這不是終局之戰,一切都才剛開始。 我稍微翻譯了一下歌詞(不是按照音
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
本文介紹了 Swift 語言中的各種數學運算子,包括基本數學運算子、複合賦值運算子、比較運算子、邏輯運算子和範圍運算子。將提供使用這些運算子的方式及其優先順序規則,讓讀者能輕鬆理解如何在程序中實現數值與邏輯運算,並掌握 Swift 中的運算子使用技巧。
本文章介紹 Swift 語言中變數的建立方法,包括變數與常數的宣告、型別推斷、型別註記以及常見資料型別。本文詳細說明瞭可選型別的意義、變數命名的規則和作用域的概念,幫助讀者更有效地使用 Swift 語言進行程式設計。
使用者回報的超級奇怪線上問題,用數字鍵盤(NumberPad)更改欄位時,送出後尾數都會消失。例如:30 ⭢ 3,52 ⭢ 5。 尋尋覓覓了兩天終於被我找到這篇,apple的奇葩的bug 重現條件 iOS17 手機設定是繁體中文語系 前一個用過的鍵盤是Cangjie倉頡 or Suchen
Emergency lockout solutions provide critical assistance when you find yourself locked out of your home, car, or office. These services are designed to
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
Hahaha, I can't even say it with a straight face! / 哈哈哈!要得到我的原諒,等下輩子吧你!
三元條件運算子(Ternary Conditional Operator)是一種簡潔的寫法,用於在滿足條件時返回一個值,否則返回另一個值。 基本語法 其中,condition是要測試的條件,如果為true,則返回valueIfTrue,否則返回valueIfFalse。
Thumbnail
10月21日午夜,美國歌手Taylor Swift發布其全新錄音室專輯《Midnights》。此張專輯自宣布到發行過程不斷引發大量話題,在發行當下更不斷打破各項紀錄。作品以獨立流行為底,「失眠的13個夜晚」為概念,融合過往音樂風格和特色,打造出別具特色的低迴氛圍,著實是2022年底音樂界的一部佳作。
Thumbnail
10/22泰勒絲終於釋出新專輯的曲目 其中我最喜歡的就是Glitch適度的慵懶和性感 我用了我理解的方式翻譯啦 歡迎大家留言指正檢討我嗚嗚但溫柔一點 we were supposed to be just friends 我們應該只適合當朋友吧 you don't live in my part o
Thumbnail
泰勒絲(Taylor Swift )當初從藝人開始跨出純演藝圈,明白讓大家知道他,這個玉女,要踏進政治的髒水,來關心政治的時候,寫了這首歌,歌名是《只要還年輕》(Only the young),鼓勵尤其是年輕人更不要灰心喪志,因為這不是終局之戰,一切都才剛開始。 我稍微翻譯了一下歌詞(不是按照音