Это очень сложно выразить словами, но я создал минимальный пример.Тип структуры, которая соответствует общему протоколу с ассоциированным типом, который также является протоколом
Вот суть, если вы предпочитаете ... https://gist.github.com/anonymous/67d83fb2f286cf84539b58be96a971d3
Протокол «элемент данных»
У меня есть протокол, который определяет Sortable
объекты со свойством number
как так.
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
}
}
«Рабочий» протокол
Тогда у меня есть протокол, который может сделать что-то с этим Sortable
типов. Но поскольку он имеет требование Само это должно быть определено в качестве протокола с соответствующим типом и в структурах как родовой собственности ...
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}
}
}
Обработчик
Наконец структуру, которая тянет все вместе ...
struct DataHandler<T: Sortable> {
let items: [T]
let sortedItems: [T]
init(unsortedItems: [T]) {
items = unsortedItems
let sorter = AscendingSorter<T>()
sortedItems = sorter.sort(items: unsortedItems)
}
}
делая это все работы
Все это работает.
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
Это выводит массив элементов в правильном порядке, в зависимости от того, какого типа сортировщика я создаю в обработчике
Проблемы
То, что я пытаюсь сделать сейчас чтобы найти объявление свойства для этой структуры sorter
, которая может принимать в нее ЛЮБОЙ тип Сортировщика, но все, что я пробовал делать, до сих пор не удалось.
Есть ли способ сделать это?
В структуры я хотел бы иметь ...
let sorter: SomeTypeHere
А потом в INIT установить его как ...
sorter = AscendingSorter()
, но ни одна комбинация я не пытался в этом работал.
Благодаря
Есть ли 'Sorte Протокол r' должен иметь «ассоциированный тип»? Почему бы не сделать метод sort (items:) 'generic (например, func sort (items: [T]) -> [T]')? Другими словами, должен ли каждый экземпляр «AscendingSorter» или «DescendingSorter» иметь один конкретный тип «Sortable», который он может сортировать? Хотя, как говорится, метод 'sort (items:)' даже должен быть методом экземпляра - я не понимаю, почему вам нужно будет использовать любое состояние экземпляра. –
Hamish
@ Хамиш, я вижу. Подожди. Я отдам это. – Fogmeister
BTW, Swift 2.3 не имеет проблем с кодом, который вы указали выше. – NRitH