【问题标题】:Swift 4 'substring(from:)' is deprecated: Please use String slicing subscript with a 'partial range from' operatorSwift 4 'substring(from:)' 已弃用:请使用带有 'partial range from' 运算符的字符串切片下标
【发布时间】:2018-03-02 09:26:01
【问题描述】:

我刚刚转换了我的小应用程序,但我发现了这个错误: 'substring(from:)' 已弃用:请使用带有 'partial range 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)
    }

【问题讨论】:

  • 不是该问题的重复。这个问题是关于“partial range upto”的,这个问题是关于“partial range from”的。它们是不一样的,它们是用不同的运算符构造的,而且这个问题没有关于构造“部分范围高达”或以其他方式获取字符串后缀的答案。

标签: swift substring deprecated swift4


【解决方案1】:

按照以下示例修复此警告: 支持 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"

【讨论】:

  • i got 'subscript' is available: cannot subscript String with an integer range, see the documentation comm
  • @famfamfam 您使用的是哪个 XCode。这取决于您工作的 Swift 版本。以上代码仅适用于 SWIFT 3 和 4。
  • 抱歉我使用的是 4.2
  • 更新了我的答案以支持 Swift 5.1.3
  • @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..&lt;myStr.endIndex]) // 会导致“?iOS”而不是“S”
【解决方案2】:

使用suffix 代替substring。使用如下:

cell.detailTextLabel?.text = String(thisRecord.pubDate.suffix(from: index))

【讨论】:

  • 0 否决票接受没有工作,说我:无法将类型“String.SubSequence”(又名“子字符串”)的值分配给类型“字符串?”拉夫
【解决方案3】:

这意味着你应该使用新的部分范围运算符作为你的上限:

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...]))

【讨论】:

    【解决方案4】:

    在 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])
        }
    }
    

    【讨论】:

    • 太烦人了,他们选择了一种简单而优雅的语法,以至于你必须编写扩展才能获得可行的东西。使用正则表达式时超级烦人。。感谢您发布此内容:)
    • @Adrian 请注意,当使用最后一种方法(范围)时,它将不必要地从 startIndex 偏移两个索引。 let endIndex = index(startIndex, offsetBy: r.count) 请注意,这将仅从已偏移的本地 startIndex 偏移范围计数
    【解决方案5】:

    我的大部分字符串都有 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)
        }
    }
    

    【讨论】:

    • 请注意,如果您传递的 Int 大于字符串计数,则会崩溃。更容易使用 Collection 前缀方法,它不会崩溃并返回子字符串或在返回之前用它初始化一个新字符串 func left(_ to: Int) -&gt; String { return String(prefix(to)) }
    【解决方案6】:
    str[..<index]
    str[index...]
    

    上面的代码是“部分范围从” 看看这个How can I use String slicing subscripts in Swift 4?

    【讨论】:

      【解决方案7】:

      如果您希望获得具有特定偏移量且没有上限的子字符串,请执行以下操作:

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

      这样,您可以从现有的 String thisRecord.pubDate 创建一个新的 String 对象,从指定索引到原始 String 的结束索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 2018-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多