SwiftUI — unit 1

工程師卡卡
5 min readJul 26, 2021

--

Swift UI 練習紀錄

import Foundation

自動Swift 与 Foundation 之間的類型轉換,ArrayDictionary中如果装有非 AnyObject 或者不能转为 AnyObject 的内容的话,做强制的转换将会抛出编译错误

  • String - NSString
  • Int, Float, Double, Bool 以及其他与数字有关的类型 - NSNumber
  • Array - NSArray
  • Dictionary - NSDictionary

import CoreLocation

是iOS SDK中一個提供裝置位置的框架。可以使用三種技術來獲取位置:GPS、蜂窩或WiFi。

  1. 建立獲得定位資訊的變數,並設置屬性。
  2. 設置委任方法以獲得定位資訊。
  3. 向使用者取得定位權限。
  4. 設置應用程式需要的定位服務規則。
  5. 開始與結束更新定位位置。

座標驗證 CLLocationCoordinate2D

import MapKit

  1. 建立地圖視圖,並設置屬性。
  2. 加入地點圖示。
  3. 設置委任方法並自定義大頭針樣式

import Combine

透過組合事件處理運算符來自訂異步事件的處理。監聽資料的變化(api),響應式法則的框架。

rx pattern

詳細介紹

private var

此變數不能從此類別外讀取和修改

private(set) var age 表示 age 的 setter 權限為 private,但 getter 權限維持預設的 internal

tip: getter 是 internal,setter 是 public 將產生錯誤。 可同時指定 getter & setter 的權限。只有 setter 要注明 (set),getter 不須加上 (get)

讓 property 變成唯讀的唯讀

ObservableObject protocol

需要發布的動作 @publish

Codable protocol

它會將EncodableDecodable兩者結合

Hashable protocol

它的資料可以產生一個叫 hash value 的數字(雜湊值)。到時候我們可利用 hash value 判斷是否為同一筆資料。比方 String 遵從 Hashable,因此 peter & hook 將產生不同的 hash value,我們由此知道 name1 & name2 不一樣。

Identifiable protocol

它本身就會宣告用來區分的 property id,因此我們生成 List 時可以省略參數 id,不用再指定 id。

struct Song: Identifiable {   
var id = UUID()

var name: String
var singer: String
}

泛型(generic)

可以讓你自定義出一個適用任意型別的函式及型別。可以避免重複的程式碼且清楚的表達程式碼的目的。

guard 檢查條件是否成立否則離開

有時也可以搭配 return, break,continue,一旦某個 guard 出錯即顯示錯誤,不再往下執行,guard let 的常數 在這個型別內都可以重複使用。

  • guard let 的 else { } 程式將在 optional 無值時執行,跟 if let 相反,if let 的 { } 程式將在 optional 有值時執行。
  • guard let 後的常數可在 guard let else { } 後繼續使用,if let 後的常數只能在 if let 的 { } 裡使用。
func showName(name: String?) {   
if let newName = name {
print("my name is \(newName)")
}
print("my name is \(newName)")
}

KeyPath

\ + 型別 + 屬性

初版 SwiftUI 的狀態管理

@State

單畫面
宣告,要加上private,當值更新 UI也會更新(簡單的型別)。

@stateObject

多個畫面
在生命週期當中可以管理這個資料
@StateObject保證只會被創建一次。

@EnvironmentObject

環境物件,有點像context api
SwiftUI 的环境可以让我们从外部源中获取值,这对于读取 Core Data 上下文和视图的 presentation mode 来说很有用。 不过这里我们将把自定义对象注入环境中,然后稍后再读取出来。通过这种方式,我们能在复杂应用之中轻易地共享数据。

@ObservedObject

與state不一樣,適合比較複雜的型別(透過class來定義), 且與多個畫面有連動時, 這時候會建議使用@ObservedObject這個屬性裝飾器來實現。@ObservedObject 不管存储,会随着 View 的创建被多次创建。

為了能夠使用@ObservedObject這個屬性裝飾器, 我們在宣告型別時, 需要先遵從ObservableObject這個協議(protocol). 另外, 我們必須告訴SwiftUI, 哪些參數是我們有興趣的(內容變更時需要重新載入), 所以必須在這些參數前面加上@Published這個關鍵字。

@Binding

使用var來宣告變數,從父層接收值,不會再去更新父層

final

--

--

工程師卡卡
工程師卡卡

Written by 工程師卡卡

Frontend developer Swift baby level

No responses yet