Я пытаюсь создать «безопасный» оператор подписи для коллекции - тот, который игнорирует части диапазонов, выходящие за пределы доступных индексов для коллекции.Почему мое расширение протокола Swift не переносит существующую функцию того же типа?
Желаемое поведение - вернуть Slice во всех случаях; когда нет перекрытия между диапазоном индексов и диапазоном сбора, и пустой массив должен быть возвращен.
Это показалось простым расширением по технике, представленной в this answer. documentation of the collection subscript operator is very straightforward:
subscript(bounds: Range<Self.Index>) -> Slice<Self> { get }
Но когда я принимать те же типы в моей функции-оболочки, я получаю следующее:
версия Копирование/вставка:
extension Collection where Indices.Iterator.Element == Index {
subscript(safe bounds: Range<Self.Index>) -> Slice<Self> {
let empty = Slice(base: self, bounds: (startIndex..<startIndex))
guard bounds.lowerBound < endIndex else { return empty }
guard bounds.upperBound >= startIndex else { return empty }
let lo = Swift.max(startIndex, bounds.lowerBound)
let hi = Swift.min(endIndex, bounds.upperBound)
return self[lo..<hi]
}
}
Почему я не могу подстрочный сборник таким образом? Почему компилятор подтверждает, что я использую правильный тип Range<Self.Index>
(указанный в документации), но все еще рассматривая его как ошибку?
Обратите внимание, что ограничение 'где Indices.Iterator.Element == Index' не используемый в вашем пользовательском индексе. Возможно, вам стоит рассмотреть возможность переноса его в неограниченное расширение 'Collection' (при условии, что у вас есть другие методы, которые используют ограничение в вашем текущем). – Hamish
Чтобы более точно ответить на вопрос Хэмиша: 'self [lo ..
». Конечно, сообщение об ошибке (как часто) очень вводит в заблуждение. – matt@Hamish Я думаю, мне нужно это ограничение для другой функции в моем расширении ([в этом ответе] (http://stackoverflow.com/a/30593673/2063546)), но даже тогда - согласно моему комментарию там - я не понимаю его построения. – Ian