Swift學習備忘

  • SwiftUI 變量觸發界面刷新

1.關於ObservableObject,Published和EnvironmentObject三個關鍵字的含義理解

2.兩種方法觸發界面刷新,方法一,如下

class UserOnboard: ObservableObject {
    @Published var onboardComplete : Bool = false
}

方法二:不帶關鍵字 Published,在屬性發生變化是,該屬性的類調用objectWillChange.send(),通知界面刷新

 

觸發刷新的代碼:

struct StartOnboardView: View {
    
    @EnvironmentObject var userOnboard: UserOnboard
    
    var body: some View {
        
        let contentView = StartView()
        let settings = UserSettings()
        
        if userOnboard.onboardComplete {
            return AnyView(contentView.environmentObject(settings))
        } else {
            if UserDefaults.standard.bool(forKey: "Loggedin") {
                settings.loggedIn = true
                return AnyView(TabbarVC())
            } else {
                settings.loggedIn = false
                return AnyView(OnboardingView())
            }
        }
    }
}

相關問題可以參考Stack Overflow:NSManagedObject changes do not trigger objectWillChangeI'm trying to use “objectWillChange.send()” in an protocol extension but it's not working, any idea why?SwiftUI ObservableObject used as EnvironmentObject odd behaviour

僅以此做個記錄,備忘

PS,像這種剛剛(也不叫剛剛)出來的技術和屬性,國內很少有說明和解釋的博客,估計過幾年各種博客搬運,都要氾濫了

 

  • List 在 UIKit 中對應的是 UITableView

  • 閉包相關 

List {
    Text("Static row 1")
    Text("Static row 2")

    ForEach(0..<5) {
        Text("Dynamic row \($0)")
    }

    Text("Static row 3")
    Text("Static row 4")
}

舉例說明list的簡單用法,順便引出閉包的相關問題

上面的ForEach 可以理解爲簡單的閉包

List {
    Text("Static row 1")
    Text("Static row 2")

    ForEach(0..<5) {(index:int)->void in
        Text("Dynamic row \(index)")
    }

    Text("Static row 3")
    Text("Static row 4")
}

Another example:

let array = ["1", "2", "3", "4", "5"]
array.forEach { (element) in
    print(element)
}

閉包表達式的一般格式

{ (parameters) -> (return type) in
    statements
  }

幾種簡寫

/*    原始閉包寫法    */

//從數組中篩選指出合適的數據組成新的數組
func getList(score:[Int], con:(Int)->Bool) -> [Int]{
    
    var newScore:[Int] = [Int]()
    for item in score {
        if con(item) {
            newScore.append(item)
        }
    }
    return newScore
}

let newAarray = getList(score: [75,60,95,45,85],  con:{(s:Int)->Bool in return s>80})
print(newAarray)


/*    簡寫一    */
let newAarray = getList(score: [75,60,95,45,85],  con:{(s:Int) in return s>80})

/*    簡寫二    */
let newAarray = getList(score: [75,60,95,45,85],  con:{s in return s>80})

/*    簡寫三    */
let newAarray = getList(score: [75,60,95,45,85],  con:{s in s>80})

/*    簡寫四    */
let newAarray = getList(score: [75,60,95,45,85],  con:{$0>80})
  • Swift解包

var num: Int?

這是Optional的聲明,意思不是"我聲明瞭一個Optional的Int值",而是”我聲明瞭一個Optional類型值,它可能包含一個Int值,也可能什麼都不包含”,也就是說實際上我們聲明的是Optional類型,而不是聲明瞭一個Int類型!

//if let 解包
func getHeight(_ height: Float?) -> Float? {

 if let unwrapedHeight = height {

 return unwrapedHeight / 100

 }

 return nil

}


//guard let解包
func getHeight(_ height: Float?) -> Float? {

 guard let unwrapedHeight = height else {

 return nil

 }

 return unwrapedHeight / 100

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章