2016-12-14 4 views
0

Я пытаюсь сделать простую вещь на самом деле - извлеките жестко закодированные части строки. Например, из «123» мне нужно «1», от «0123» - «01». Теперь я только что прочитал, наверное, все учебники по [довольно странно с моей точки зрения] реализации Range в Swift, но до сих пор не может получить этот простой код работает, как я хочу, чтобы:String.Substring в Swift 3, когда start = end

let start2 = string.startIndex 
    let end2 = string.index(string.endIndex, offsetBy: -3) 
    minutes = Int(string.substring(with: start2..<end2)) 

Проблема заключается в том, что в случае «123» start2 равен end2, а подстрока возвращает nil в этом случае. Есть идеи?

P.S. Великие боги, эта операция была тривиальной даже в ассемблере 20 лет назад

+1

Проблема не 'подстрока()' (который возвращает пустую строку в вашем дело). Но 'Int (" ")' возвращает 'nil' для пустой строки. - Какой результат вы ожидаете, если start2 == end2? –

+0

Что я ожидаю? 1 символ конечно –

+0

'.. <' создает * полуоткрытый * диапазон *, который * исключает * верхнюю границу. С закрытым диапазоном 'start2 ... end2' вы получите один символ. –

ответ

0

Вы хотите отбросить последние два символа.

Существует несколько решений. Одним из них является

let string = "0123" 
let minutes = Int(String(string.characters.dropLast(2)))! 

или

let range = string.index(string.endIndex, offsetBy: -2)..<string.endIndex 
let minutes = Int(string.substring(to: range.lowerBound))! 

И так как вы хотите Int в любом случае, почему бы не просто

let minutes = Int(string)!/100 
+0

Что такое .lowerBound? Часть строки оставлена ​​в диапазоне? –

+0

@ArnieSchwarzvogel Да, точно – vadian

+0

Спасибо. Тем не менее у меня нет объяснений, как инженеры Swift придумали много новых терминов там, где все было просто и работает все время:/ –

Смежные вопросы