比起 class,struct 少了繼承,但卻多了從 stored property 自動生成 memberwise initializer 的特異功能,方便我們在建立 struct 資料時傳入每個屬性的初始值。
接下來讓我們以可愛寶寶的 Baby 型別為例說明。
struct Baby {
var name: String
var age: Int
}
var cuteBaby = Baby(name: "peter", age: 18)
Baby 有兩個屬性,name 和 age。由於 struct 自動生成以每個屬性名字 為參數的 memberwise initializer,因此我們可在產生寶寶時傳入每個屬性的內容。
開發 SwiftUI App 時,我們時常利用 List 或 ForEach 顯示 array 的資料。不過當我們將 array 的最後一個成員移除時,卻可能造成可怕的 Index out of range 閃退問題。讓我們看看以下鬼滅之刃殺鬼的例子。
假設 Ghost 的型別如下。
struct Ghost: Identifiable {
let id = UUID()
var number: Int
var name: String
}
畫面的設計如下,按下殺鬼 button 時將殺鬼,將 array 的最後一個成員移除。
struct ContentView: View {
@State private var ghosts = [
Gh …
WWDC 即將到來,除了令人期待的新技術,Apple 還推出歡迎天下學生豪傑參加的 Swift Student Challenge,入選的話就能得到以下獎品:
彼得潘已經不是學生,無法參加 Swift Student Challenge,不過還是滿好奇怎麼樣才能參加比賽。根據 Apple 的比賽文件,作品需滿足以下條件:
必須以 iPadOS 的 Swift Playgrounds,macOS 的 Swift Playgrounds 或 Xcode 的 playground 開發,因此不能是 Xcode project。
以 IG API 為例,利用 API 回傳的 JSON 輸入 array 的假資料,將 array 的每一筆資料顯示在 table view 或 collection view。
以下範例抓取 Apple IG 的資料,網址如下。
https://www.instagram.com/apple/?__a=1
為了方便閱讀 JSON 資料,我們利用 JSON Editor Online 排版美美的 JSON 資料。
定義 IG 的資料型別 Post,在 static computed property data 裡輸入 array 資料。值得注意的,圖片網址會過期,所以只有當下可以測試,過一段時間後會抓不到圖片。
struct Post {
let caption: String
let …
利用 optional binding 的 if let 我們可以安全地讀取 optional 的內容,例如以下例子。
let numberString = "10"
if let number = Int(numberString) {
print(number * number)
}
值得注意的,if let 天生的使命是為了讀取 optional,因此它的 = 右邊一定要是 optional,就像以上例子 Int(numberString) 產生的資料型別是 Int?。
如果不是 optional,將產生紅色錯誤,比方以下例子。
錯誤訊息說 Initializer for conditional binding must have Optional type,因為 = 右邊的 Int(number) 不是 optional,它的型別是 Int。
因此我們可以直接讀取它的內容,根本不需要用 if let。
let number = 10.3let intNumber = Int(number)print(intNumber)
其它類似問題的例子:
Int("130")!
的型別是 Int,不是 optional。
彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com