Swift UI 練習紀錄
import Foundation
自動Swift 与 Foundation 之間的類型轉換,Array
和 Dictionary
中如果装有非 AnyObject
或者不能转为 AnyObject
的内容的话,做强制的转换将会抛出编译错误
String
-NSString
Int
,Float
,Double
,Bool
以及其他与数字有关的类型 -NSNumber
Array
-NSArray
Dictionary
-NSDictionary
import CoreLocation
是iOS SDK中一個提供裝置位置的框架。可以使用三種技術來獲取位置:GPS、蜂窩或WiFi。
- 建立獲得定位資訊的變數,並設置屬性。
- 設置委任方法以獲得定位資訊。
- 向使用者取得定位權限。
- 設置應用程式需要的定位服務規則。
- 開始與結束更新定位位置。
import MapKit
- 建立地圖視圖,並設置屬性。
- 加入地點圖示。
- 設置委任方法並自定義大頭針樣式
import Combine
透過組合事件處理運算符來自訂異步事件的處理。監聽資料的變化(api),響應式法則的框架。
private var
此變數不能從此類別外讀取和修改
private(set) var age
表示 age 的 setter 權限為 private,但 getter 權限維持預設的 internal
tip: getter 是 internal,setter 是 public 將產生錯誤。 可同時指定 getter & setter 的權限。只有 setter 要注明 (set),getter 不須加上 (get)
ObservableObject protocol
需要發布的動作 @publish
Codable protocol
它會將Encodable
和Decodable
兩者結合
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
\ + 型別 + 屬性
@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來宣告變數,從父層接收值,不會再去更新父層