Я работаю с EventKit's
EKEventStore
и хочу издеваться над ним, а также с EKEvent.Но я не знаю, как правильно абстрагировать EKEvent's
init(eventStore: EKEventStore)
и другие методы.
protocol EventStoring {
associated type Event: EventStoreEvent where Event.MatchingEventStore == Self
func save(_ event: Event, span: EKSpan, commit: Bool) throws
// Other methods of EKEventStore I use
}
extension EKEventStore: EventStoring {
typealias Event = EKEvent
}
protocol EventStoreEvent {
associatedtype MatchingEventStore: EventStoring
static func createEvent(eventStore: MatchingEventStore) -> Self
}
extension EKEvent: EventStoreEvent {
typealias MatchingEventStore = EKEventStore
static func createEvent(eventStore: MatchingEventStore) -> Self {
return EKEvent(eventStore: eventStore) as! Self
}
}
Здесь ошибки: «Self» доступна только в протоколе или в результатеметод в классе; вы имели в виду 'EKEvent'
? "и: «Невозможно преобразовать возвращаемое выражение типа 'EKEvent'
в возвращаемый тип« Self »»
class GenericEventManger<StoreEvent: EventStoreEvent> {
var store: EventStoring
required init(with eventStore: EventStoring) {
self.store = eventStore
}
func createEvent() -> StoreEvent {
let eventStoreEvent: EventStoreEvent = StoreEvent.createEvent(eventStore: store)
// Then some code where I configure the event...
try store.save(eventStoreEvent, span: .thisEvent, commit: true)
}
}
В седьмой последней строке ошибка: Невозможно вызвать 'createEvent'
со списком аргументов типа '(eventStore: EventStoring)'
И в третьем последнем случае: невозможно вызвать 'save' со списком аргументов типа '(StoreEvent, span: EKSpan, commit: Bool)'
Обновление Поскольку я адаптировал рекомендацию от Дэна, возникла другая проблема того же родав моей реализации, поэтому я обновил свой вопрос