iOS Swift5 Как реализовать несколько общих протоколов c в классе? - PullRequest
0 голосов
/ 08 мая 2020

Я занимаюсь рефакторингом существующего кода и хотел бы попробовать создать общий протокол c, чтобы иметь возможность добавлять и искать данные по Int или по дате. В настоящее время у меня есть много функций, которые выглядят очень похожими:

func add(_ value: UInt8, at index: Int)
func add(_ value: UInt8, at date: Date)

func gridIndex(from index: Int) -> RowColumn
func gridIndex(from date: Date) -> RowColumn

Я хочу определить общий c протокол, подобный приведенному ниже, а затем иметь один класс, унаследованный от нескольких типов протокола c generi.

Как я могу получить класс Swift5 для реализации нескольких общих c протоколов?

protocol IndexedStorage {
    associatedtype dataType
    associatedtype keyType

    func add(_ value: dataType, at: keyType)
    func gridIndex(from: keyType) -> RowColumn
}

protocol IndexedStorageByInt: IndexedStorage { //  where dataType == UInt8, keyType == Int {
    typealias dataType = UInt8
    typealias keyType = Int
}
protocol IndexedStorageByDate: IndexedStorage {
    typealias dataType = UInt8
    typealias keyType = Date

}

Я пробовал:

extension DataCanvas: IndexedStorage {
}
extension DataCanvas: IndexedStorageByInt {
//... 
}
extension DataCanvas: IndexedStorageByDate {
//...
}

Мне нужен эквивалент:

extension DataCanvas: IndexedStorage<UInt8, Int>, IndexedStorage<UInt8, Date> {
    func add(_ value: UInt8, at: Int) {...}
    func add(_ value: UInt8, at: Date) {...}
    func gridIndex(from: Int) -> RowColumn
    func gridIndex(from: Date) -> RowColumn
}
...