Как я могу реализовать универсальный класс, который соответствует протоколу со связанным типом? - PullRequest
0 голосов
/ 12 декабря 2018

Следующий код swift дает ошибку Protocol 'DataSource' can only be used as a generic constraint because it has Self or associated type requirements.Как это можно исправить?

protocol DataSource {
    associatedtype DataItem
    func getItem(at index: Int) -> DataItem
}

struct DataSourceAgent: DataSource {
    typealias DataItem = Int
    func getItem(at index: Int) -> DataItem {
        return 0
    }
}

class SomeClass<T> {
    private var dataSource: DataSource!
    init(dataSource: DataSource) {
        self.dataSource = dataSource
    }
    func getSomeStuff() -> T {
        return dataSource.getItem(at: 0)
    }
}

let sc = SomeClass<Int>(dataSource: DataSourceAgent())

Snapshot of errors from playground

1 Ответ

0 голосов
/ 12 декабря 2018

Вы не можете использовать протокол со связанным типом так же, как и обычный протокол, но вы можете использовать DataSource в качестве ограничения типа в SomeClass следующим образом:

class SomeClass<T, D:DataSource> where D.DataItem == T {
    private let dataSource:D

    init(dataSource: D) {
        self.dataSource = dataSource
    }
    func getSomeStuff() -> T {
        return dataSource.getItem(at: 0)
    }
}

let sc = SomeClass<Int, DataSourceAgent>(dataSource: DataSourceAgent())
print(sc.getSomeStuff())
...