SwiftUIで行こう!-UserDefaults!
これを"@propertyWrapper"を使って書き換えてみようと思います。
import SwiftUI
struct ContentView: View {
@State var inputText:String = ""
@State var displayText:String = ""
var body: some View {
VStack {
Text("Hello, \(self.displayText)!")
TextField("Your name", text: $inputText , onCommit: {
UserDefaults.standard.set(self.inputText, forKey: "name")
self.displayText = self.inputText
self.inputText = ""
})
.padding()
}
.onAppear {
self.displayText = "World"
guard let userdefaultText = UserDefaults.standard.value(forKey: "name") as? String else { return }
self.displayText = userdefaultText
}
}
}
これが最初のコード。
propertyWrapperで変更していきます。
以前も書きましたが、"ContentView: View"とは別ファイルを作ります。
import SwiftUI
@propertyWrapper
struct UserDefault<T> {
var key: String
var defaultValue: T
var wrappedValue: T {
set { UserDefaults.standard.set(newValue, forKey: key) }
get { UserDefaults.standard.object(forKey: key) as? T ?? defaultValue }
}
}
@propertyWrapperでUserDefaultの定義をします。
これ参考にします。
"ContentView: View"を変更していきます。
propertyWrapperは
@UserDefault(key: "displayText", defaultValue: "World")
と宣言して、
実際に使う場合は以下のようにStaticで宣言しています。
static var displayText: String
全体のコードです。直す前のコードはコメントアウトしてます。
struct ContentView: View {
@State var inputText:String = ""
// @State var displayText:String = ""
@UserDefault(key: "displayText", defaultValue: "World")
static var displayText: String
var body: some View {
VStack {
Text("Hello, \(ContentView.displayText)!")
TextField("Your name", text: $inputText , onCommit: {
// UserDefaults.standard.set(self.inputText, forKey: "name")
ContentView.displayText = self.inputText
self.inputText = ""
})
.padding()
}
// .onAppear {
//
//
//// self.displayText = "World"
//// guard let userdefaultText = UserDefaults.standard.value(forKey: "name") as? String else { return }
//// self.displayText = userdefaultText
// }
}
}
まずは、保存が出来て、次に起動したときに保存したものが表示されるとこまで。(ダメなとこ:リアルタイムにText()で入力ができません。)
この記事が気に入ったらサポートをしてみませんか?