У меня есть два способа написания одного и того же кода, один из которых не нравится компилятору Swift. Не могли бы вы объяснить, почему?
Контекст:
let guaranteedValue: String
let cursorPositionFromEnd: Int
Рабочий код:
let stringFromEndUntilCursorPosition = String(guaranteedValue.reversed()[0..<cursorPositionFromEnd])
Нерабочий код:
let reversedOriginalString = guaranteedValue.reversed()
let stringFromEndUntilCursorPosition = String(reversedOriginalString[0..<cursorPositionFromEnd])
Сообщение об ошибке компилятора: «Невозможно добавить значение типа ReversedCollection<String>
с индексом типа Range<Int>
»
Другая попытка работы:
let reversedOriginalString = guaranteedValue.reversed()[0..< cursorPositionFromEnd]
let stringFromEndUntilCursorPosition = String(reversedOriginalString)
По сути, идея заключается в том, что вы можете использовать только обратный диапазон (но, вероятно, не только), если вы добавляете индекс при возврате функции, но это не работает, если вы сначала ссылаетесь на переменную с помощью let или var, а затем пытаетесь подписать это.
Я также понимаю, что он, вероятно, будет работать в «нерабочем коде», если Range будет иметь тип String.Index или что-то новое, как это делается.
Может кто-нибудь объяснить, почему? Это ошибка в компиляторе Swift, у которого уже есть достаточно «искривленной» строковой логики?