大家好,我是彼得潘,我將在 7 月推出兩門 iOS App 課程,分別針對有程式背景和無程式基礎的學生。我會一步一步慢慢教,搭配溫暖的冷笑話,帶著你開心地從無到有創作出自己的 App,歡迎有興趣的朋友們參考。有任何 iOS App 開發或程式設計的相關問題,也都歡迎跟我聯絡,謝謝。


比起 class,struct 少了繼承,但卻多了從 stored property 自動生成 memberwise initializer 的特異功能,方便我們在建立 struct 資料時傳入每個屬性的初始值。

自動產生 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,因此我們可在產生寶寶時傳入每個屬性的內容。


插畫家 Pablo Stanley 設計的 Open Peeps 圖庫

功能需求

  • 串接 Firebase,搭配以下 Library
  1. FirebaseAuth
  2. FirebaseFirestoreSwift-Beta
  3. FirebaseStorageSwift-Beta

利用 SPM 我們可以方便地安裝各種強大的第三方套件,比方下圖的 Firebase package。

不過一個 package 裡可能包含多個 library,假設我們原本只加入 Firebase package 裡的 FirebaseFirestoreSwift-Beta,之後如果還想加入 Firebase 其它的 library,要怎麼加呢 ?


為了測試 JSON 資料對應的 Decodable(或 Codable) 型別是否有問題,除了實際串接網路 API 抓資料,我們也可以先將 JSON 檔加入專案裡,方便沒有網路時進行測試。

JSON 檔存放的地方

JSON 檔加入專案時,可以放在以下三種地方。

1 Preview Content 裡的 asset 或放在 Preview Content 下

2 一般的 Assets


開發 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,入選的話就能得到以下獎品:

  • WWDC 帥氣的夾克 & 別針組。
  • 免費一年的 Apple 開發帳號。

彼得潘已經不是學生,無法參加 Swift Student Challenge,不過還是滿好奇怎麼樣才能參加比賽。根據 Apple 的比賽文件,作品需滿足以下條件:

  • 以 Swift playground 開發。

必須以 iPadOS 的 Swift Playgrounds,macOS 的 Swift Playgrounds 或 Xcode 的 playground 開發,因此不能是 Xcode project。

  • playground 壓縮成 zip 上傳,檔案的大小不能超過 …

以 IG API 為例,利用 API 回傳的 JSON 輸入 array 的假資料,將 array 的每一筆資料顯示在 table view 或 collection view。

抓取 API 回傳的 JSON 資料

以下範例抓取 Apple IG 的資料,網址如下。

https://www.instagram.com/apple/?__a=1

利用 JSON Editor Online 排版美美的 JSON 資料

為了方便閱讀 JSON 資料,我們利用 JSON Editor Online 排版美美的 JSON 資料。

研究 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 Neverland

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store