Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
899 views
in Technique[技术] by (71.8m points)

swiftui - Using @AppStorage for string map

How can I use @AppStorage for a string map in a SwiftUI app?

This is what I want to do:

@AppStorage("ratings") var ratings: [String: Double] = []

But this gives me the error message “No exact matches in call to initializer”. When looking at the documentation, it looks like only a few data types are supported. It is possible to encode it as Data?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Looking at the documentation for @AppStorage the only values that you can currently store using this property wrapper are

  • Int
  • Double
  • String
  • Bool
  • URL
  • Data

And their optional counterparts. You can also store values that conform to RawRepresentable, like enums that conform to Int or String.

If you want to store a dictionary using this method then you would have to convert it to data and store it that way.

@AppStorage("ratings")
var ratings: Data = Data() // we need to initialize it with something

Then we can save to it using

let data = ["Hello": 5.0]
guard let ratings = try? JSONEncoder().encode(data) else { return }
self.ratings = ratings

And if we want to retrieve it we can do the following:

guard let decodedRatings = try? JSONDecoder().decode([String:Double].self, from: ratings) else { return }
print(decodedRatings)

Otherwise you will have to use UserDefaults directly, you can always use onChange and State to manage it. See this example of how to use onChange. You may need to create a custom init for your view so as to populate the State the value from UserDefaults.

Though you could write your own property wrapper, this article by John Sundell explains in detail how to do it.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...