我的應用程式包含各種食物的影像,其中用戶點擊影像并將該食物添加到Set<Food>.
我想在名為 的類中顯示此 Set 中的所有專案Favorites,作為:Text("You like: \(favorites.comidas)")但我無法使其作業
class Favorites: ObservableObject {
var foods: Set<Food>
}
class Favorites: ObservableObject {
var foods: Set<Food>
init() {
// load the saved data
foods = []
}
func contains(_ food: Food) -> Bool {
foods.contains(food)
}
func add(_ food: Food) {
objectWillChange.send()
foods.insert(food)
save()
}
func delete(_ food: Food) {
objectWillChange.send()
foods.remove(food)
save()
}
}
struct Food: Identifiable, Hashable {
var id: Int
let name: String
let foodImage: [String]
// Equatable
static func == (lhs: Food, rhs: Food) -> Bool {
lhs.id == rhs.id
}
}
@EnvironmentObject var favorites: Favorites
let food: Food
var body: Some View {
Image(food.foodImage[0])
.onTapGesture {
if favorites.contains(food) {
favorites.delete(food)
} else {
favorites.add(food)
}
}
}
uj5u.com熱心網友回復:
你沒有展示你的Food結構,但我會假設它有一個屬性,name.
ListFormatter是你的朋友有這樣的任務。它的string(from:[])函式接受一個陣列并以格式良好的串列回傳它。您可以使用從集合中獲取字串map陣列。name
對于輸入陣列["pizza","tacos","chocolate"],它將給出“披薩、炸玉米餅和巧克力”
var favoriteList: String {
let formatter = ListFormatter()
let favorites = formatter.string(from:self.favorites.foods.map{$0.name})
return favourites ?? ""
}
Text然后你可以在視圖中使用這個函式:
Text("You like \(self.favoriteList)")
請注意, aSet是無序的,因此最好對陣列進行排序,以便獲得一致的字母順序:
var favoriteList: String {
let formatter = ListFormatter()
let favorites = formatter.string(from:self.favorites.foods.map{$0.name}.sorted())
return favourites ?? ""
}
感謝 Leo Dabus 在評論中的提示,在 Xcode 13 及更高版本中,您可以使用.formatted-
var favoriteList: String {
return self.favorites.foods.map{$0.name}.sorted().formatted() ?? ""
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/493464.html
