Тип значения ключевого пути «Data.Element.ID» не может быть преобразован в контекстный тип «ID». - PullRequest
0 голосов
/ 16 апреля 2020

Я получаю ошибку Key path value type 'Data.Element.ID' cannot be converted to contextual type 'ID' при попытке создать инициализатор в расширении ниже, когда передаваемые данные содержат элементы, которые уже наследуются от Identifiable.

struct List<Data, ID> where Data: RandomAccessCollection, ID: Hashable {
    private let data: [Data.Element]
    private let id: KeyPath<Data.Element, ID>

    init(data: Data, id: KeyPath<Data.Element, ID>) {
        self.data = data.map { $0 }
        self.id = id
    }
}

extension List where Data.Element: Identifiable {
    init(data: Data) {
        self.data = data.map { $0 }
        self.id = \Data.Element.id // Compilation Error: Key path value type 'Data.Element.ID' cannot be converted to contextual type 'ID'
    }
}

1 Ответ

1 голос
/ 16 апреля 2020

Data.Element.ID не гарантируется для типа List.ID. Вы можете исправить это, добавив еще одно ограничение типа типа.

extension List where Data.Element: Identifiable, Data.Element.ID == ID {
    init(data: Data) {
        self.data = data.map { $0 }
        self.id = \.id
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...