屬性包裝器: -? 屬性(簡(jiǎn)單值或者對(duì)象)更改后,按照規(guī)則,跟屬性綁定的UI都會(huì)重新渲染评肆,
@State 修飾簡(jiǎn)單的值,只適合于struct非区,當(dāng)然這個(gè)struct可以是常用的Double, Int, String等類型瓜挽,單個(gè)視圖的局部更新。
@Binding 雙向傳值征绸,當(dāng)前視圖和所有子視圖共享數(shù)據(jù)久橙,
當(dāng)前視圖修改值,會(huì)通過Binding通知所有子視圖進(jìn)行局部刷新管怠。
任何一個(gè)子視圖修改值淆衷,也會(huì)通過Binding傳遞到父視圖進(jìn)行局部刷新。
***@StateObject和@ObservedObject都是用來包裝實(shí)現(xiàn)了ObservableObject協(xié)議的屬性渤弛,唯一的區(qū)別就是該屬性的生命周期的管理問題祝拯。***
@StateObject? 修飾對(duì)象,當(dāng)前視圖和所有子視圖共享數(shù)據(jù)她肯,監(jiān)聽數(shù)據(jù)的所有視圖局部刷新佳头,生命周期由View管理,只初始化一次晴氨,View銷毀它就銷毀
@ObservedObject 修飾對(duì)象康嘉,當(dāng)前視圖和所有子視圖共享數(shù)據(jù),監(jiān)聽數(shù)據(jù)的所有視圖局部刷新籽前,生命周期由我們手動(dòng)管理亭珍,通常由父?jìng)鹘o子,可能會(huì)隨時(shí)釋放枝哄。并且需要遵循 ObservableObject協(xié)議,因?yàn)镺bservableObject繼承與AnyObject肄梨,所以只有class才有資格遵守該協(xié)議,比如 class User: ObservableObject { }//協(xié)議是空協(xié)議膘格,沒有任何必須實(shí)現(xiàn)
************ 上面2種修飾 比如 A顯示B峭范,B顯示C,C顯示D瘪贱,
那么A修飾了屬性property纱控,如果D想使用此屬性辆毡,那么需要A傳遞B,B傳遞C甜害,C傳遞D舶掖,可以共享********
@EnvironmentObject 修飾對(duì)象,將對(duì)象放在環(huán)境中尔店,當(dāng)前視圖和所有子視圖共享數(shù)據(jù)眨攘,監(jiān)聽數(shù)據(jù)的所有視圖局部刷新。
************ 上面1種修飾 比如 A顯示B嚣州,B顯示C鲫售,C顯示D,
那么A修飾了屬性property该肴,B和C不關(guān)心屬性情竹,只有D需要該屬性,那么就用此修飾匀哄,可以直接在D取該屬性********
@Environment 修飾對(duì)象秦效,全局屬性,系統(tǒng)屬性涎嚼,可以隨時(shí)取阱州,可以通過擴(kuò)展自定義整個(gè)工程的全局字典屬性。
簡(jiǎn)單舉例法梯,取日歷:@Environment(\.calendar) var calendar: Calendar
exp.