У меня есть объект User
@objc(User)
public class User: NSManagedObject {
@NSManaged public var firstname: String
@NSManaged public var lastname: String
@NSManaged public var country: String
@NSManaged public var friends: NSSet // of User objects
var full: String {
firstname + " " + lastname
}
var friendsArray: [User] {
friends.allObjects as? [User] ?? []
}
}
, и в какой-то момент я хочу сопоставить большой массив пользователей (80k объектов) с массивом моделей View
struct ItemViewModel: Hashable {
let id: UUID
let friendsName: [String]
}
Без ленивый, это занимает много времени, поэтому я выбрал использование ленивого:
func prepareViewModel(users: [User]) -> [ItemViewModel] {
users.map { user in
let friendsName = user.friendsArray.lazy.filter{["en", "fr"].contains($0.country)}.map(\.full)
return ItemViewModel(id: UUID(), friendsName: friendsName)
}
}
Но я получаю сообщение об ошибке:
Cannot convert value of type 'LazyMapSequence<LazyFilterSequence<LazySequence<[User]>.Elements>.Elements, String>'
(aka 'LazyMapSequence<LazyFilterSequence<Array<User>>, String>') to expected argument type '[String]'
Это имеет смысл, потому что теперь массив имен друзей позже будет лениво обрабатываться. Я попытался преобразовать структуру модели представления для хранения:
struct ItemViewModel: Hashable {
let id: UUID
let friendsName: LazyMapSequence<LazyFilterSequence<[User]>, String>
}
Но теперь это не Hashable
, есть ли способ сохранить автосоответствие Hashable
при использовании LazyMapSequence<LazyFilterSequence<[User]>, String>
в качестве типа для ItemViewModel
и любые советы по повышению производительности logi c