Я экспериментировал со SwiftUI и столкнулся с проблемой при реализации модели данных для одного из моих списков. Мой план состоял в том, чтобы создать протокол CardProtocol
в качестве протокола данных для элементов моих списков, а затем иметь реализацию протокола CoreData, а также фиктивную реализацию для модульного тестирования и использования Canvas. Если вы используете сбор данных в SwiftUI List
, отдельные элементы должны соответствовать Identifiable
протоколу.
Код выглядит так:
import SwiftUI
import Combine
final class CardsModel: BindableObject {
var cards: [CardProtocol] = []
let didChange = PassthroughSubject<CardsModel, Never>()
}
protocol CardProtocol: Identifiable {
var id: Int { get set }
var firstName: String? { get set }
var lastName: String? { get set }
var email: String? { get set }
var phone: String? { get set }
}
Это даже не будет компилироваться, поскольку протокол Identifiable
имеет 2 связанных типа, которые необходимо указать, если протокол будет использоваться для определения переменной.
/// A type that can be compared for identity equality.
public protocol Identifiable {
/// A type of unique identifier that can be compared for equality.
associatedtype ID : Hashable
/// A unique identifier that can be compared for equality.
var id: Self.ID { get }
/// The type of value identified by `id`.
associatedtype IdentifiedValue = Self
/// The value identified by `id`.
///
/// By default this returns `self`.
var identifiedValue: Self.IdentifiedValue { get }
}
Точная ошибка error: protocol 'CardProtocol' can only be used as a generic constraint because it has Self or associated type requirements
. Теперь ID
не проблема и может быть исправлена, но IdentifiedValue
она по своей природе отличается в CoreData и фиктивной реализации.
Единственное разумное решение, которое я нашел, заключалось в том, чтобы удалить соответствие Identifiable
из протокола и повторно ввести его позже в представлении с помощью cardsModel.cards.identified(by: \.id)
. Есть ли лучший выход из этого, который позволил бы мне сохранить идентифицируемое соответствие на уровне протокола?
cardsModel.cards.identified(by: \.id)
кажется более чистым решением с меньшим количеством шаблонов - person Matteo Pacini   schedule 12.06.2019Identifiable
независимо. - person Daniele Bernardini   schedule 13.06.2019