В Swift 5, как отобразить необработанные биты, возвращаемые из range.UpperBound или range.LowerBound в удобочитаемом виде (с целочисленными значениями)? - PullRequest
0 голосов
/ 02 апреля 2020

Я начинаю экспериментировать в Swift Playgrounds, чтобы познакомиться с языком. Повторяю мой вопрос: в Swift 5, как мне отобразить необработанные биты, возвращаемые из range.UpperBound или range.LowerBound в удобочитаемом виде (с целочисленными значениями)?

В качестве примера, скажем, у меня есть строка var myStr = "Hello World!" и я посмотрел, существует ли подстрока в myStr по порядку. Если да, то я хотел бы напечатать индексы этого найденного диапазона:

    var myStr = "Hello World!"
    if let rangeFound = myStr.range(of: "ello"){
        print(rangeFound) //Im getting: Index(_rawBits: 65536)..<Index(_rawBits: 327680)
        print("Found ello from \(rangeFound.lowerBound) to \(rangeFound.upperBound)")
        //prints: Found ello from Index(_rawBits: 65536) to Index(_rawBits: 327680)
    }

Вместо того, чтобы печатать необработанные биты, я хотел бы напечатать читаемые индексы ... "от 1 до 4" I я не пытаюсь использовать эти числа в другом диапазоне, только пытаюсь напечатать читаемые индексы. Спасибо

1 Ответ

0 голосов
/ 02 апреля 2020

Символ Unicode может состоять из более чем одного байта, поэтому индекс не может быть просто Int.

Обходной путь для получения целочисленных индексов - это преобразование в NSRange

let myStr = "Hello World!"
if let rangeFound = myStr.range(of: "ello"){
    let nsRange = NSRange(rangeFound, in: myStr)
    print("Found ello from \(nsRange.location) to \(nsRange.location + nsRange.length - 1)")
}
...