Swift 4 'substring (from :)' устарел: используйте подстрочный индекс среза с оператором 'частичный диапазон от'

Я только что преобразовал свое маленькое приложение, но обнаружил эту ошибку: 'substring (from :)' устарела: используйте подстрочный индекс среза с оператором 'частичный диапазон от'

мой код:

    let dateObj = dateFormatterFrom.date(from: dateStringa)


    if dateObj != nil {
        cell.detailTextLabel?.text = dateFormatterTo.string(from:(dateObj!))
    } else {
        let index = thisRecord.pubDate.index(thisRecord.pubDate.startIndex, offsetBy: 5)
        cell.detailTextLabel?.text = thisRecord.pubDate.substring(from: index)
    }

person Raffaele Spadaro    schedule 21.09.2017    source источник
comment
Это не дубликата этого вопроса. Этот вопрос касается «частичного диапазона до», и этот вопрос касается «частичного диапазона от». Они не одинаковы, они построены с разными операторами, и на этот вопрос нет ответа ни для построения «частичного диапазона до», ни для иного взятия суффикса строки.   -  person rob mayoff    schedule 27.09.2017
comment
Возможный дубликат Как использовать индексы среза строк в Swift 4?   -  person Kaibo    schedule 01.11.2019


Ответы (7)


Следуйте приведенному ниже примеру, чтобы исправить это предупреждение: Вспомогательные примеры для Swift 3, 4 и 5.

let testStr = “Test Teja”

let finalStr = testStr.substring(to: index) // Swift 3
let finalStr = String(testStr[..<index]) // Swift 4

let finalStr = testStr.substring(from: index) // Swift 3
let finalStr = String(testStr[index...]) // Swift 4 

//Swift 3
let finalStr = testStr.substring(from: index(startIndex, offsetBy: 3)) 

//Swift 4 and 5
let reqIndex = testStr.index(testStr.startIndex, offsetBy: 3)
let finalStr = String(testStr[..<reqIndex])

//**Swift 5.1.3 - usage of index**

let myStr = "Test Teja == iOS"

let startBound1 = String.Index(utf16Offset: 13, in: myStr)
let finalStr1 = String(myStr[startBound1...])// "iOS"

let startBound2 = String.Index(utf16Offset: 5, in: myStr)
let finalStr2 = String(myStr[startBound2..<myStr.endIndex]) //"Teja == iOS"
person Teja Kumar Bethina    schedule 23.02.2018
comment
у меня 'нижний индекс' недоступен: не может нижний индекс String с целым диапазоном, см. документацию comm - person famfamfam; 20.11.2018
comment
@famfamfam Какой XCode вы используете. Это зависит от вашей версии Swift. Приведенный выше код только для SWIFT 3 и 4. - person Teja Kumar Bethina; 21.11.2018
comment
извините, я использую 4.2 - person famfamfam; 21.11.2018
comment
Обновил мой ответ для поддержки Swift 5.1.3 - person Teja Kumar Bethina; 09.07.2020
comment
@TejaKumarBethina Ваше обновление 5.1.3 неверно. Вы не должны использовать инициализатор String Index(utf16Offset:) для смещения индекса, поскольку в большинстве случаев он используется неправильно. Попробуйте let myStr = "????????????iOS" let startBound1 = String.Index(utf16Offset: 3, in: myStr) let finalStr1 = String(myStr[startBound1...]) // даст ????????iOS вместо iOS и let startBound2 = String.Index(utf16Offset: 5, in: myStr) let finalStr2 = String(myStr[startBound2..<myStr.endIndex]) // даст ????iOS вместо S - person Leo Dabus; 30.12.2020

Вместо substring используйте suffix. Используйте, как показано ниже:

cell.detailTextLabel?.text = String(thisRecord.pubDate.suffix(from: index))
person Vini App    schedule 21.09.2017
comment
0 голос "против" принять Нет работы, скажите мне: невозможно присвоить значение типа String.SubSequence (также известное как Substring) для типа String? Раф - person Raffaele Spadaro; 21.09.2017

Это означает, что вы должны использовать новый оператор частичного диапазона в качестве верхней границы:

let str =  "Hello World !!!"
if let index = str.range(of: "Hello ")?.upperBound {
   let string = String(str[index...])  // "World !!!"
}

В твоем случае

cell.detailTextLabel?.text = String(thisRecord.pubDate[index...]))
person Leo Dabus    schedule 06.10.2017

В Swift 5 это:

extension String {

    func index(from: Int) -> Index {
        return self.index(startIndex, offsetBy: from)
    }

    func substring(from: Int) -> String {
        let fromIndex = index(from: from)
        return String(self[fromIndex...])
    }

    func substring(to: Int) -> String {
        let toIndex = index(from: to)
        return String(self[..<toIndex])
    }

    func substring(with r: Range<Int>) -> String {
        let startIndex = index(from: r.lowerBound)
        let endIndex = index(from: r.upperBound)
        return String(self[startIndex..<endIndex])
    }
}
person Ankit Thakur    schedule 18.11.2019
comment
‹Rant› Это так раздражает, что они выбрали простой и элегантный синтаксис, вместо того, чтобы писать расширения, чтобы получить что-то работоспособное. Чертовски раздражает при работе с регулярными выражениями. ‹/Rant›. Спасибо за публикацию :) - person Adrian; 25.02.2020
comment
@Adrian обратите внимание, что при использовании последнего метода (диапазона) он без необходимости смещает оба индекса из startIndex. let endIndex = index(startIndex, offsetBy: r.count) Обратите внимание, что это смещает только счетчик диапазона от локального startIndex, который уже был смещен - person Leo Dabus; 30.12.2020

Большинство моих строк содержат A-Za-z и 0-9. Нет необходимости в сложной работе с индексами. Это расширение String основано на знакомых функциях LEFT / MID и RIGHT.

extension String {

    // LEFT
    // Returns the specified number of chars from the left of the string
    // let str = "Hello"
    // print(str.left(3))         // Hel
    func left(_ to: Int) -> String {
        return "\(self[..<self.index(startIndex, offsetBy: to)])"
    }

    // RIGHT
    // Returns the specified number of chars from the right of the string
    // let str = "Hello"
    // print(str.left(3))         // llo
    func right(_ from: Int) -> String {
        return "\(self[self.index(startIndex, offsetBy: self.length-from)...])"
    }

    // MID
    // Returns the specified number of chars from the startpoint of the string
    // let str = "Hello"
    // print(str.left(2,amount: 2))         // ll
    func mid(_ from: Int, amount: Int) -> String {
        let x = "\(self[self.index(startIndex, offsetBy: from)...])"
        return x.left(amount)
    }
}
person Vincent    schedule 13.10.2017
comment
Обратите внимание, что это приведет к сбою, если вы передадите Int больше, чем количество строк. Намного проще использовать метод префикса Collection, который не дает сбоев и не возвращает подстроку или не инициализирует новую строку перед ее возвратом func left(_ to: Int) -> String { return String(prefix(to)) } - person Leo Dabus; 07.12.2017
comment
stackoverflow.com/questions/24092884/ - person Leo Dabus; 08.12.2017

str[..<index]
str[index...]

Приведенный выше код представляет собой "частичный диапазон от". Посмотрите на этот Как я могу использовать индексы нарезки строк в Swift 4?

person Kaibo    schedule 20.10.2019

Если вы хотите получить подстроку с определенным смещением без верхней границы, сделайте следующее:

let index = thisRecord.pubDate.index(thisRecord.pubDate.startIndex, offsetBy: 5)
cell.detailTextLabel?.text = String(thisRecord.pubDate[index...]

Таким образом, вы создаете новый String объект из вашего существующего String thisRecord.pubDate, беря что-нибудь от указанного индекса до конечного индекса исходного String.

person Dominik Babić    schedule 20.07.2018