Использование LazyMapSequence, когда массив строк исключен - PullRequest
0 голосов
/ 30 мая 2020

У меня есть объект 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

...