Миграция с swift2 на swift3 и изменения для advanceBy для Range‹String.Index›

Есть функция

func find(... rangeString1: Range<String.Index>, ...) ...

и эта функция есть в swift2

while i >= minimalIdentity{

var first = rangeString1.startIndex
var last = first.advancedBy(i, limit: rangeString1.endIndex)
...

Вопрос в том, как должен выглядеть

var last  

в Swift3

var first = rangeString1.lowerBound
var last = 

person VYT    schedule 07.07.2016    source источник
comment
Связано: stackoverflow.com/questions /38070273/.   -  person Martin R    schedule 08.07.2016
comment
@ Мартин Р Спасибо. Есть ли у swift 2 аналог last для дальности в swift3. Я вижу только upperBound, но это аналог endIndex в swift2?   -  person VYT    schedule 08.07.2016
comment
Да, как я уже упоминал в этом ответе, start/endIndex были переименованы в более низкую/верхнюю границу.   -  person Martin R    schedule 08.07.2016
comment
@Martin R Извините, я имею в виду - let last = range!.last, что дает индекс на 1 единицу меньше, чем - let end = range!.endIndex.   -  person VYT    schedule 08.07.2016
comment
В Swift 3 есть Range и CountableRange. Последний является коллекцией и имеет свойство last.   -  person Martin R    schedule 08.07.2016
comment
@Martin R Если я пытаюсь инициализировать диапазон как CountableRange‹String.Index› (вместо Range‹String.Index› в swift2), компилятор жалуется, что индекс не подтверждает протокол Strideable   -  person VYT    schedule 08.07.2016
comment
Да, это не работает со строковым индексом.   -  person Martin R    schedule 08.07.2016
comment
@Martin R Итак, у меня проблема не только с .last для диапазона для строки (я могу использовать косвенный способ с offsetBy, также известный как advanceBy, чтобы получить последнее значение). Но я также не могу получить счет из диапазона, и я понятия не имею, как его получить. У вас есть идея, как получить счет из диапазона?   -  person VYT    schedule 08.07.2016
comment
Вот еще один пример для Swift 3: stackoverflow.com/a/38228514/1187415. В Swift 3 вам всегда нужна исходная коллекция для выполнения вычислений с ее индексами.   -  person Martin R    schedule 08.07.2016


Ответы (2)


Какая бы строка ни принадлежала этим индексам, она отвечает за это в Swift 3:

let first = rangeString1.lowerBound
let last = myString.index(first, offsetBy: i, limit: rangeString1.upperBound)
person Tim Vermeulen    schedule 07.07.2016
comment
Я не могу использовать rangeString1.index, компилятор говорит, что Range‹Index› не имеет индекса члена - person VYT; 08.07.2016
comment
Ой, извините, я думал, что это ваша строка. В основном вам нужно вызывать его в строке, которой принадлежат индексы, см. Мое редактирование. - person Tim Vermeulen; 08.07.2016
comment
Если мне нужна строка, это плохая особенность swift3 по сравнению с swift2. Итак, мне нужно создать подстроку для Range‹Index›, а затем использовать ее, тогда как в swift2 я мог бы использовать непосредственно Range‹Index›. - person VYT; 08.07.2016
comment
Да, вам понадобится строка, которой принадлежат индексы. - person Tim Vermeulen; 08.07.2016
comment
Спасибо за объяснение! - person VYT; 08.07.2016

Просто используйте endIndex:

var last = rangeString1.endIndex
person Alexander    schedule 07.07.2016
comment
Я не могу, мне нужно advanceBy для итерации в цикле while - person VYT; 08.07.2016
comment
А, хорошо, в таком случае я вижу, что кто-то уже упоминал index(_:offsetBy:limit:) - person Alexander; 08.07.2016