Mam protokół, który wykorzystuje przypisany typ, jako takich:testowania protokół zgodności z powiązanymi typów
protocol Populatable {
typealias T
func populateWith(object: T)
}
i klas, które implementują protokołu:
class DateRowType: Populatable {
func populateWith(object: NSDate) {
print(object.description)
}
}
class StringRowType : Populatable {
func populateWith(object: String) {
print(object)
}
}
ale gdy próbuję rzucić lub Test zgodności, tak:
let drt = DateRowType()
let srt = StringRowType()
let rowTypes = [drt, srt]
let data = [NSDate(), "foo"]
for (i, p: Populatable) in enumerate(rowTypes) {
p.populateWith(data[i])
}
pojawia się błąd:
Protocol 'Populatable' can only be used as a generic constraint because it has Self or associated type requirements
Jaki jest prawidłowy sposób na sprawdzenie, czy obiekt jest zgodny z protokołem Populatable?
Uwaga: cały kod wymagany do wypróbowania tego jest zawarty w pytaniu, po prostu skopiuj bloki kodu na plac zabaw.
Chcę mieć inne klasy typów wierszy, które przyjmują inne typy jako parametr funkcji wypełnienia. Obecnie tablica zdarzeń jest heterogeniczna, ale w przyszłości może zawierać wiele typów implementujących protokół Populatable. – Senior
Każdy wiersz zostanie wypełniony przez inny typ, więc chcę, aby mój protokół był ogólny, aby jeden wiersz mógł go zaimplementować jako wypełnienie (obiekt: Zdarzenie), inny może zostać wypełniony (obiekt: Zespół) itp. Bez bycia generic I musiałbym sprawić, by użycie protokołu zapełniło się (obiekt: AnyObject), co eliminuje wiele radości z używania Swift. Zapełnienie – Senior
nie zajmuje Populatable, jest zawarte w protokole Populatable. Populatable definiuje metodę na innej klasie, w tym przypadku NSObject do używania jako kontrolerów WKInterfaceTable. – Senior