Я реализую расширение Swift CollectionType, которое дает возможность находить подпоследовательность в коллекции и находить диапазон этой подпоследовательности. Мой код, работающий на детской площадке, таков:
extension CollectionType where Generator.Element:Equatable, Index:ForwardIndexType, SubSequence.Generator.Element == Generator.Element {
func search<S: CollectionType where S.Generator.Element == Generator.Element, S.Index:ForwardIndexType>(pattern: S) -> Self.Index? {
return self.lazy.indices.indexOf{
self[$0..<self.endIndex].startsWith(pattern)
}
}
func rangeOf<S: CollectionType where S.Generator.Element == Generator.Element, S.Index:ForwardIndexType, Index:ForwardIndexType>(pattern: S) -> Range<Index>? {
if let start = self.search(pattern) {
var end = start
for _ in pattern.startIndex..<pattern.endIndex {
end = end.advancedBy(1)
}
return start..<end
} else {
return nil
}
}
}
Вот простые примеры тестов на игровой площадке:
let fibs = [1, 1, 2, 3, 5, 8, 13]
if let fidx = fibs.search([3, 5]) {
print(fibs[..<fidx]) // prints "[1, 1, 2]\n"
print(fidx..<fidx.advancedBy([1,1,5].count)) // prints "3..<6\n"
}
if let rng = fibs.rangeOf([5,8,13]) {
print(rng) // prints "4..<7\n"
}
Однако в функции rangeOf вместо цикла
for _ in pattern.startIndex..<pattern.endIndex {
end = end.advancedBy(1)
}
Я ожидал, что смогу использовать инструкцию
end = start.advancedBy(pattern.count, limit: self.endIndex)
Или возможно
end = start.advancedBy(pattern.endIndex - pattern.startIndex, limit: self.endIndex)
(Я признаю, что параметр limit является избыточным; его отсутствие не имеет значения в дальнейшем.) Ни один из этих двух последних параметров не компилируется с ошибкой cannot invoke 'advancedBy' with an argument list of type '(S.Index.Distance, limit: Self.Index)'
. Мой вопрос: почему ни одна из этих двух форм неприемлема? (Полагаю, есть и другие обоснованные вопросы относительно того, правильно ли я сформировал ограничения типов для расширения и для функций, но, поскольку работает одна версия, я пока игнорирую это.)
1 ответ
end = start.advancedBy(pattern.count, limit: self.endIndex)
Не компилируется, потому что коллекции self
и pattern
нуждаются в не имеют того же типа Index
.
Он компилируется, если вы добавляете ограничение S.Index == Index
к методу rangeOf()
.
Похожие вопросы
Новые вопросы
swift
Swift — это язык программирования общего назначения, разработанный Apple Inc., впервые выпущенный в 2014 году для своих платформ и Linux. Swift имеет открытый исходный код. Используйте тег только для вопросов о языковых функциях или необходимости кода в Swift. Используйте теги [ios], [ipados], [macos], [watch-os], [tvos], [swiftui], [cocoa-touch] и [cocoa] для (не зависящих от языка) вопросов о платформах или рамки.