Trying (and failing) to implement the best conventions on OOP Swift
Please consider follow recommendations:

Make habit of extracting each struct/class/enum in separate files which brings more readability and clarity. Code looks less cluttered.

Please try getting used to of not using semicolons :)

You have defined Events as a class with empty implementations of functions. Are you sure you want to do that, I think it could be converted as a protocol instead
To be able to inject different type of calendar APIs, you should define your own protocol and make concrete implementations for each calendar (Adapter Pattern).

You must use dependency injection. For example even things like EKEventStore() should be injected.
final class iCal: Events {

    private let eventStore: EKEventStore

    init(with eventStore: EKEventStore = EKEventStore()) {
        self.eventStore = eventStore
    }
}


Using force unwrap is a bad practice, you should use guard let or if let to unwrap the optional value and only then use that unwrapped value for whatever purpose you want. By using forced unwrapping your app can crashes unexpectedly where it will find a nil value inside any optional variable.

Please make use of Swiftlint to make sure that your code is following standard convention. It will force you to think swift way :)

You should make class final when don't want to allow subclassing it (even if when you are not sure for now). If you do need subclassing later, you can remove final keyword.


All the best!