#swift
#swift
Вопрос:
У меня есть два массива. Я хочу использовать их, чтобы создать новый. Затем новый список будет использоваться в представлении списка. Итак, как это выглядит? У меня есть две модели, которые являются основой для списков:
Фото:
class Photo: Object, Identifiable, Decodable {
@objc dynamic var albumId: Int = 0
@objc dynamic var id: Int = 0
@objc dynamic var title: String = ""
@objc dynamic var url: String = ""
@objc dynamic var thumbnailUrl: String = ""
override static func primaryKey() -> String? {
return "id"
}
}
Альбом:
class Album: Object, Decodable {
@objc dynamic var id: Int = 0
@objc dynamic var userId: Int = 0
@objc dynamic var title: String = ""
override static func primaryKey() -> String? {
return "id"
}
}
Дочерним элементом обоих является ListItem . Таким образом, переменные списков элементов используют переменные из классов Photo и Album . Надеюсь, я хорошо это объяснил. Если нет, пожалуйста, спросите.
class ListItem {
var id: Int = 0 Album id
var title: String = "" Photo title
var albumTitle: String = "" Album title
var thumbnailUrl: String = "" Photo thumbnailUrl
}
Ответ №1:
Вы можете использовать zip
для объединения 2 массивов вместе, а затем вызвать map
для создания ListItem
s из каждого элемента.
let list = zip(photos, albums).map { photo, album in ListItem(id: album.id, title: photo.title, albumTitle: album.title, thumbnailUrl: photo.thumbnailUrl)}
Ответ №2:
Если я правильно понял ваш вопрос, у вас есть отношение «один ко многим» между альбомом и фотографией, поэтому для каждой фотографии мы должны искать правильный альбом и создавать новый список
Это можно сделать с помощью этого кода
let list: [ListItem] = photoArray.compactMap { photo in
guard let album = albumArray.first(where: { $0.id == photo.id }) else {
return nil
}
return ListItem(id: album.id, title: photo.title, albumTitle: album.title, thumbnailUrl: photo.url)
}