Я экспериментировал с 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)
.Есть ли лучший выход из этого, который позволил бы мне поддерживать соответствие идентифицируемой информации на уровне протокола?