Строка, подстрока, диапазон, NSRange в Swift 4

Я использую следующий код для получения подстроки String из NSRange:

func substring(with nsrange: NSRange) -> String? {
    guard let range = Range.init(nsrange)
        else { return nil }
    let start = UTF16Index(range.lowerBound)
    let end = UTF16Index(range.upperBound)
    return String(utf16[start..<end])
}

(через: https://mjtsai.com/blog/2016/12/19/nsregularexpression-and-swift/)

Когда я компилирую с помощью Swift 4 (Xcode 9b4), я получаю следующие ошибки для двух строк, объявляющих start и end:

'init' is unavailable
'init' was obsoleted in Swift 4.0

Я в замешательстве, так как я не использую init.

Как я могу это исправить?


person koen    schedule 01.08.2017    source источник


Ответы (2)


Используйте Range(_, in:) для преобразования NSRange в Range в Swift 4.

extension String {
    func substring(with nsrange: NSRange) -> Substring? {
        guard let range = Range(nsrange, in: self) else { return nil }
        return self[range]
    }
}
person Charles Srstka    schedule 01.08.2017
comment
Xcode заставляет меня исправить код следующим образом: func substring(with nsrange: NSRange) -> String? { guard let range = Range(nsrange, in: self) else { return nil } return String(self[range]) } - person koen; 02.08.2017
comment
Если вы заставите функцию возвращать подстроку вместо строки, вам не нужно будет преобразовывать результат. - person Charles Srstka; 02.08.2017
comment
Ах, я не знал, что Substring - это тип, я думал, что это опечатка. - person koen; 02.08.2017
comment
Подстрока — это тип среза. Это означает, что он содержит ссылку на исходную строку, а также диапазон, который представляет подстрока. Преимущество среза заключается в том, что вам не нужно делать копию данных, как если бы вы возвращали новую строку, поэтому производительность выше. - person Charles Srstka; 02.08.2017

С Swift 4 мы можем получить подстроки таким образом.

  1. Подстрока из индекса

    let originStr = "Test"
    let offset = 1
    let str = String(originStr.suffix(from: String.Index.init(encodedOffset: offset)))
    
  2. Подстрока для индекса

    let originStr = "Test"
    let offset = 1
    String(self.prefix(index))
    
person Nguyen Van Dung    schedule 21.09.2017
comment
Нужен ли второй пример редактирования? Должно ли index быть offset - person Peter Wiley; 22.07.2018
comment
Кроме того, это не ответ на вопрос - person koen; 16.03.2019