見出し画像

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 }
  }
}

@propertyWrapperUserDefaultの定義をします。

これ参考にします。

"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()で入力ができません。)

この記事が気に入ったらサポートをしてみませんか?