Как исправить ошибку «Невозможно вызвать createEvent со списком аргументов типа« (eventStore: EventStoring) »» - PullRequest
0 голосов
/ 28 января 2019

Я работаю с 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)'

Обновление Поскольку я адаптировал рекомендацию от Дэна, возникла другая проблема того же родав моей реализации, поэтому я обновил свой вопрос

1 Ответ

0 голосов
/ 28 января 2019

Полагаю, с помощью Дана я нашел решение для двух проблем, но пока не тестировал его полностью:

Сначала я изменил тип свойства storeGenericStoreManager как Дан рекомендовал

class GenericStoreManger<StoreEvent: EventStoreEvent> {

    var store: StoreEvent.MatchingEventStore

    func createEvent() -> StoreEvent {
    let eventStoreEvent: EventStoreEvent = StoreEvent.createEvent(eventStore: store)

    // Then some code where I configure the event...

    try store.save(eventStoreEvent as! StoreEvent.MatchingEventStore.Event, span: .thisEvent, commit: true)
}

    ...

}

, и затем я изменил способ получения возвращаемого значения в extension EKEvent: EventStoreEvent, чтобы он работал и с подклассами EKEvent

extension EKEvent: EventStoreEvent {
    typealias MatchingEventStore = EKEventStore

    static func createEvent(eventStore: MatchingEventStore) -> Self {
        return self.init(eventStore: eventStore) 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...