上篇文章我们知道@Status 的作用了
那么我们也可以自己定义类似的这种标签。。
首先我们先来看下不使用属性标签,向导页面如何写
// // PropertyWrapperView.swift // learn_swiftUi // // Created by liuan on 2020/9/4. // Copyright © 2020 liuan. All rights reserved. // import SwiftUI extension UserDefaults{ public enum Keys{ static let hadSHowUserGuide = "hadSHowUserGuide" } var hasShowUserGuide: Bool{ set{ set(newValue,forKey: Keys.hadSHowUserGuide) } get{ bool(forKey: Keys.hadSHowUserGuide) } } } struct PropertyWrapperView: View { @State private var showText = UserDefaults.standard.hasShowUserGuide ? "已经展示":"尚未展示" var body: some View { Button(action: { if(!UserDefaults.standard.hasShowUserGuide){ UserDefaults.standard.hasShowUserGuide = true self.showText = "已经展示" } }){ Text(self.showText) } } } struct PropertyWrapperView_Previews: PreviewProvider { static var previews: some View { PropertyWrapperView() } }第一次进来 现实尚未展示 ,点击后现实已经展示
如果改为标签呢
// // PropertyWrapperView.swift // learn_swiftUi // // Created by liuan on 2020/9/4. // Copyright © 2020 liuan. All rights reserved. // import SwiftUI //extension UserDefaults{ // public enum Keys{ // static let hadSHowUserGuide = "hadSHowUserGuide" // } // var hasShowUserGuide: Bool{ // set{ // set(newValue,forKey: Keys.hadSHowUserGuide) // } // get{ // bool(forKey: Keys.hadSHowUserGuide) // } // } //} @propertyWrapper struct UserDefaultsWrappler<T> { var key: String var defaultValue: T init(_ key:String, defaultValue: T){ self.key = key self.defaultValue = defaultValue } var wrappedValue: T { get{ return UserDefaults.standard.value(forKey: key)as? T ?? defaultValue } set{ UserDefaults.standard.set(newValue, forKey: key) } }} struct PropertyWrapperView: View { @UserDefaultsWrappler("hadShowUserGudie", defaultValue: false) static var hadSHownUserGudie: Bool @State private var showText = PropertyWrapperView.hadSHownUserGudie ? "已经展示":"尚未展示" var body: some View { Button(action: { if( !PropertyWrapperView.hadSHownUserGudie){ PropertyWrapperView.hadSHownUserGudie = true self.showText = "已经展示" } }){ Text(self.showText) } } } struct PropertyWrapperView_Previews: PreviewProvider { static var previews: some View { PropertyWrapperView() } }
