Глядя на this question, я пытаюсь реализовать эквивалент CollectionType
под названием CollectionOf
, но у меня возникают проблемы с одним из ограничений:Как реализовать CollectionOf в Swift
struct CollectionOf<T, Index: ForwardIndexType>: CollectionType {
init<C: CollectionType where C.Generator.Element == T, C.Index == Index>(_ collection: C) {
// etc.
}
// etc.
}
Это не компилируется. Давайте проигнорируем тот факт, что я еще не реализовал членов CollectionType
. Я доберусь до этого. Проблема, с которой я сталкиваюсь, заключается в том, что компилятор мне не нравится init
. Он жалуется: «Индекс ограничения одного типа не соответствует требуемому протоколу ForwardIndexType». Ясно, что так оно и есть.
Возможно, у нас есть ошибка компилятора. Возможно, мой синтаксис неверен. Как бы то ни было, как я могу реализовать CollectionOf
?
EDIT
Настоящая рабочая реализация. Из-за проблемы, отмеченной выше, он страдает серьезным недостатком, что Index typealias
от CollectionType
не ограничен таким же, как у обернутого CollectionType
. Это означает, что я вынужден бросить, что теоретически может вызвать проблему во время выполнения, а не во время компиляции, что наносит ущерб цели статической типизации.
struct CollectionOf<T, I: ForwardIndexType>: CollectionType {
private let _generate:() -> GeneratorOf<T>
private let _startIndex:() -> I
private let _endIndex:() -> I
private let _subscript: (I) -> T
init<C: CollectionType where C.Generator.Element == T>(_ collection: C) {
_generate = { GeneratorOf(collection.generate()) }
_startIndex = { collection.startIndex as I }
_endIndex = { collection.endIndex as I }
_subscript = { i in collection[i as C.Index] }
}
var startIndex: I {
return _startIndex()
}
var endIndex: I {
return _endIndex()
}
func generate() -> GeneratorOf<T> {
return _generate()
}
subscript (i: I) -> T {
return _subscript(i)
}
}
Не могли бы вы дать мне пример? Когда я пытаюсь это сделать, компилятор все еще жалуется на ограничение одного типа, то есть 'init' все еще делает не компилировать. –
Этот код работал для меня. Вы реализовали остальную часть CollectionType? Я обнаружил, что компилятор дает забавные сообщения об ошибках, когда протоколы не полностью соответствуют. –
Нет кубиков. Если вы посмотрите на код, который я разместил выше в моем редактировании, и измените подпись 'init', как указано в моем комментарии выше, он не компилируется. Такая же ошибка. –