オプションの初期化子を使用してカスタムデータ型を@AppStorageに保存しますか?

ニックサルノ

カスタムデータ型をに格納しようとしていAppStorageます。これを行うには、モデルはに準拠しますRawRepresentable(このチュートリアルに従います)。正常に動作していますが、@AppStorage変数を初期化するときに初期UserModelが必要です。変数をオプションにしたいので、ユーザーがサインアウトしている場合はnilにすることができます。これは可能ですか?

クラス/ビュー内で、次のように初期化できます。

@AppStorage("user_model") private(set) var user: UserModel = UserModel(id: "", name: "", email: "")

しかし、私はこのように初期化したい:

@AppStorage("user_model") private(set) var user: UserModel?

モデル:

struct UserModel: Codable {
        
    let id: String
    let name: String
    let email: String
    
    enum CodingKeys: String, CodingKey {
        case id
        case name
        case email
    }
    
    init(from decoder: Decoder) throws {        
        let values = try decoder.container(keyedBy: CodingKeys.self)
        
        do {
           id = try String(values.decode(Int.self, forKey: .id))
        } catch DecodingError.typeMismatch {
           id = try String(values.decode(String.self, forKey: .id))
        }
        self.name = try values.decode(String.self, forKey: .name)
        self.email = try values.decode(String.self, forKey: .email)
    }
    
    init(id: String, name: String, email: String) {
        self.id = id
        self.name = name
        self.email = email
    }
    
}

// MARK: RAW REPRESENTABLE

extension UserModel: RawRepresentable {
    
    // RawRepresentable allows a UserModel to be store in AppStorage directly.
    
    public init?(rawValue: String) {
        guard let data = rawValue.data(using: .utf8),
            let result = try? JSONDecoder().decode(UserModel.self, from: data)
        else {
            return nil
        }
        self = result
    }

    var rawValue: String {
        guard let data = try? JSONEncoder().encode(self),
            let result = String(data: data, encoding: .utf8)
        else {
            return "[]"
        }
        return result
    }
    
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(id, forKey: .id)
        try container.encode(name, forKey: .name)
        try container.encode(email, forKey: .email)
    }
    
}
pawello2222

以下のコードは、適合性を追加したために機能しますUserModel: RawRepresentable

@AppStorage("user_model") private(set) var user: UserModel = UserModel(id: "", name: "", email: "")

UserModel?以下を機能させたい場合は、同じことを行う必要があります。

@AppStorage("user_model") private(set) var user: UserModel? = nil

考えられる解決策は次のとおりです。

extension Optional: RawRepresentable where Wrapped == UserModel {
    public init?(rawValue: String) {
        guard let data = rawValue.data(using: .utf8),
              let result = try? JSONDecoder().decode(UserModel.self, from: data)
        else {
            return nil
        }
        self = result
    }

    public var rawValue: String {
        guard let data = try? JSONEncoder().encode(self),
              let result = String(data: data, encoding: .utf8)
        else {
            return "[]"
        }
        return result
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: UserModel.CodingKeys.self)
        try container.encode(self?.id, forKey: .id)
        try container.encode(self?.name, forKey: .name)
        try container.encode(self?.email, forKey: .email)
    }
}

注:私はあなたがすでに持っていた実装を再利用しましたUserModel: RawRepresentable-この場合、いくつかの修正が必要になるかもしれません。

また、準拠Optional: RawRepresentableしているため、UserModel 公開する必要もあります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

OptParse-Applicativeを使用してユーザーオプションをカスタムデータ型に解析する

分類Dev

エディターからのプロパティを使用してカスタムSKSpriteNodeを初期化します

分類Dev

カスタムフィルターを含むいくつかのオプションを使用してドロップダウンを作成します

分類Dev

Wordpressで、ファイルアップロードオプションを使用してカスタムフォームをコーディングし、MySqlにレコードを保存するにはどうすればよいですか?

分類Dev

OWLAPI:HermiT推論システムは、インポートされたオントロジーからのデータ型に対して「UnsupportedDatatypeException」を使用します

分類Dev

gnome-screenshotを使用してスクリーンショットをカスタムの場所に保存する方法はありますか?

分類Dev

C ++ 17では、初期化子を含むifステートメントを使用してオプションを解凍できますか?

分類Dev

html5ジオロケーションを使用してFirebaseリアルタイムデータベースにマーカー座標を追加します

分類Dev

jQueryを使用して、データベースから動的選択オプションに選択オプションを入力します

分類Dev

ポリラインのsetTagを使用してGoogleマップにカスタムデータを保存する方法

分類Dev

Magento 2は、カスタムオプションを使用してプログラムでカートに製品を追加します

分類Dev

初期化中にオプション値をすばやく設定して、デフォルトの初期化子の継承を防止します

分類Dev

子テーマfunctions.phpを介してWordpressプラグインのカスタム投稿タイプにオプションを追加します

分類Dev

asp.netコアのjQueryを使用して、選択を動的に作成し、データベースから選択オプションを追加します

分類Dev

mysqlを使用してリストにデータを入力する選択したオプションから2つの値を出力します

分類Dev

カスタムデータベースを使用したAWSAppSyncはサブスクリプションをサポートしていますか?

分類Dev

データベースcodeigniterに保存する際のオプションの問題を選択します

分類Dev

ループバックのオプションを使用してカスタム検証を定義できますか?

分類Dev

Swiftは、カスタム名のパラメーターなしでカスタム初期化子を作成します

分類Dev

Jqueryを使用して複数の選択オプションからカスタム属性値を取得する

分類Dev

setDefaultCloseOperationのカスタムオペレーションを作成しますか?

分類Dev

'select'要素を使用してディレクティブ内のカスタムオプションをトランスクルージョンする

分類Dev

カスタムデコレータを使用して1つの引数に入る複数の共通オプションを持つコマンド

分類Dev

カスタムYOCTOレイヤーの構成フラグメントを使用してカーネル構成オプションを追加します

分類Dev

WordPressのオプション選択を使用してカスタムメニューを作成する方法

分類Dev

Magentoの値を使用してカスタムオプションをエコーする

分類Dev

Vue.jsは、カスタムディレクティブを使用してコンポーネントオプション(prop)を追加します

分類Dev

Firestoreはタイムスタンプにどのデータ型を使用しますか?

分類Dev

tf.multiplyを使用してカスタムグラデーションをどのように実行しますか?

Related 関連記事

  1. 1

    OptParse-Applicativeを使用してユーザーオプションをカスタムデータ型に解析する

  2. 2

    エディターからのプロパティを使用してカスタムSKSpriteNodeを初期化します

  3. 3

    カスタムフィルターを含むいくつかのオプションを使用してドロップダウンを作成します

  4. 4

    Wordpressで、ファイルアップロードオプションを使用してカスタムフォームをコーディングし、MySqlにレコードを保存するにはどうすればよいですか?

  5. 5

    OWLAPI:HermiT推論システムは、インポートされたオントロジーからのデータ型に対して「UnsupportedDatatypeException」を使用します

  6. 6

    gnome-screenshotを使用してスクリーンショットをカスタムの場所に保存する方法はありますか?

  7. 7

    C ++ 17では、初期化子を含むifステートメントを使用してオプションを解凍できますか?

  8. 8

    html5ジオロケーションを使用してFirebaseリアルタイムデータベースにマーカー座標を追加します

  9. 9

    jQueryを使用して、データベースから動的選択オプションに選択オプションを入力します

  10. 10

    ポリラインのsetTagを使用してGoogleマップにカスタムデータを保存する方法

  11. 11

    Magento 2は、カスタムオプションを使用してプログラムでカートに製品を追加します

  12. 12

    初期化中にオプション値をすばやく設定して、デフォルトの初期化子の継承を防止します

  13. 13

    子テーマfunctions.phpを介してWordpressプラグインのカスタム投稿タイプにオプションを追加します

  14. 14

    asp.netコアのjQueryを使用して、選択を動的に作成し、データベースから選択オプションを追加します

  15. 15

    mysqlを使用してリストにデータを入力する選択したオプションから2つの値を出力します

  16. 16

    カスタムデータベースを使用したAWSAppSyncはサブスクリプションをサポートしていますか?

  17. 17

    データベースcodeigniterに保存する際のオプションの問題を選択します

  18. 18

    ループバックのオプションを使用してカスタム検証を定義できますか?

  19. 19

    Swiftは、カスタム名のパラメーターなしでカスタム初期化子を作成します

  20. 20

    Jqueryを使用して複数の選択オプションからカスタム属性値を取得する

  21. 21

    setDefaultCloseOperationのカスタムオペレーションを作成しますか?

  22. 22

    'select'要素を使用してディレクティブ内のカスタムオプションをトランスクルージョンする

  23. 23

    カスタムデコレータを使用して1つの引数に入る複数の共通オプションを持つコマンド

  24. 24

    カスタムYOCTOレイヤーの構成フラグメントを使用してカーネル構成オプションを追加します

  25. 25

    WordPressのオプション選択を使用してカスタムメニューを作成する方法

  26. 26

    Magentoの値を使用してカスタムオプションをエコーする

  27. 27

    Vue.jsは、カスタムディレクティブを使用してコンポーネントオプション(prop)を追加します

  28. 28

    Firestoreはタイムスタンプにどのデータ型を使用しますか?

  29. 29

    tf.multiplyを使用してカスタムグラデーションをどのように実行しますか?

ホットタグ

アーカイブ