2016-10-26 2 views
2

Почему это не работает в Swift 3? Как его преобразовать?Swift 3 - inout String не конвертируется в строку

var valorTemp: String = "44,52" 
valorTemp = valorTemp.substring(with: Range<String.Index>(valorTemp.startIndex...valorTemp.characters.index(valorTemp.endIndex, offsetBy: -2))) 

Когда я изменяю ... к .. < это работает хорошо, но я не думаю, что результат может быть таким же

var valorTemp: String = "44,52" 
valorTemp = valorTemp.substring(with: Range<String.Index>(valorTemp.startIndex..<valorTemp.characters.index(valorTemp.endIndex, offsetBy: -2))) 

Спасибо!

+0

PS: Первый код показывает мне, что ошибка «inout String не конвертируется в String» в Xcode 8 –

ответ

2

В Swift 3 операторы двух диапазонов ... и ..< возвращают два разных типа. При применении к String.Index, ClosedRange<String.Index> и Range<String.Index>.

И substring(with:) определен только для Range<String.Index>, и вы не можете преобразовать ClosedRange<String.Index> в Range<String.Index> с синтаксисом инициализатора.

Вы можете попробовать с явным использованием ..< (просто нужно изменить нижнюю границу):

valorTemp = valorTemp.substring(with: valorTemp.startIndex..<valorTemp.characters.index(valorTemp.endIndex, offsetBy: -1)) 

Или еще, индекс для String имеет некоторые перегрузки в том числе и для Range<String.Index> и ClosedRange<String.Index>:

valorTemp = valorTemp[valorTemp.startIndex...valorTemp.characters.index(valorTemp.endIndex, offsetBy: -2)] 

В вашем случае использование substring(to:) было бы хорошей альтернативой (необходимо использовать «модифицированный» индекс):

valorTemp = valorTemp.substring(to: valorTemp.characters.index(valorTemp.endIndex, offsetBy: -1)) 
Смежные вопросы