Jest to bardzo trudne do ujęcia w słowa, ale stworzyłem minimalny przykład.Typ struktury zgodnej z protokołem generycznym z powiązanym typem, który jest również protokołem
Oto sedno jeśli wolisz ... https://gist.github.com/anonymous/67d83fb2f286cf84539b58be96a971d3
Protokół „element danych”
Mam protokół, który określa Sortable
obiektów z właściwością number
jak tak.
protocol Sortable: Comparable {
var number: Int {get}
static func < (lhs:Self, rhs: Self) -> Bool
static func == (lhs:Self, rhs: Self) -> Bool
}
struct BasicSortable: Sortable {
let number: Int
static func < (lhs:BasicSortable, rhs: BasicSortable) -> Bool {
return lhs.number < rhs.number
}
static func == (lhs:BasicSortable, rhs: BasicSortable) -> Bool {
return lhs.number == rhs.number
}
}
W „pracownik” protokół
Wtedy mam protokół, który może coś zrobić z tymi Sortable
typów. Ale ponieważ ma wymogu Samo to musi być zdefiniowany jako protokół z przynależnym typu oraz w elemencie jak własność generycznego ...
protocol Sorter {
associatedtype Item: Sortable
func sort(items: [Item]) -> [Item]
}
// Two different sorters
struct AscendingSorter<T:Sortable>: Sorter {
typealias Item = T
func sort(items: [T]) -> [T] {
return items.sorted()
}
}
struct DescendingSorter<T:Sortable>: Sorter {
typealias Item = T
func sort(items: [T]) -> [T] {
return items.sorted{$0 > $1}
}
}
handler
wreszcie struct, która ściąga wszystko razem ...
struct DataHandler<T: Sortable> {
let items: [T]
let sortedItems: [T]
init(unsortedItems: [T]) {
items = unsortedItems
let sorter = AscendingSorter<T>()
sortedItems = sorter.sort(items: unsortedItems)
}
}
Making to wszystko działa
To wszystko działa.
let array = [
BasicSortable(number: 1),
BasicSortable(number: 8),
BasicSortable(number: 13),
BasicSortable(number: 3),
BasicSortable(number: 4),
BasicSortable(number: 14),
BasicSortable(number: 5),
BasicSortable(number: 12),
BasicSortable(number: 3),
]
let handler = DataHandler(unsortedItems: array)
handler.sortedItems
ten wypisuje tablicę elementów w odpowiedniej kolejności w zależności od rodzaju sortowania tworzę w Handler
Problem
Co staram się zrobić to teraz aby znaleźć deklarację właściwości dla tej struktury sorter
, która może przyjąć dowolny typ sortera, ale wszystko, co próbowałem w tym przypadku, zawiodło.
Czy istnieje sposób, aby to zrobić?
W struct chciałbym mieć ...
let sorter: SomeTypeHere
A potem w init ustawić go jak ...
sorter = AscendingSorter()
ale żadna kombinacja Próbowałem w ten sposób pracował.
Dzięki
Czy "Sorte" protokół r' musi mieć 'typ powiązany '? Dlaczego nie zrobić ogólnej metody 'sort (items:)' (np. Func sort (items: [T]) -> [T] ')? Innymi słowy, czy każda instancja 'AscendingSorter' lub' DescendingSorter' musi mieć pojedynczy konkretny typ "Sortable", który może sortować? Pomimo tego, że jest to powiedziane, czy metoda sort (items:) 'musi być metodą instancji - nie widzę powodu, dla którego musiałbyś użyć dowolnego stanu instancji. –
Hamish
@Hamish oh, rozumiem. Wytrzymać. Dam ci to. – Fogmeister
BTW, Swift 2.3 nie ma problemu z kodem, który napisałeś powyżej. – NRitH