Swift3&amp; Xcode8:'下标&#39;不可用:不能使用CountableClosedRange <int>,

时间:2016-09-21 08:55:18

标签: swift

错误1 : 当我尝试从stringValue

中获取元数据中的Swift3时出现上述错误
let myMetadata: AVMetadataMachineReadableCodeObject = metadataObjects[0] as! AVMetadataMachineReadableCodeObject

// take out the system and check-digits
let myBarcode = myMetadata.stringValue[1...11] //error 

错误2: 在String的扩展中,我写这些以获取right(x)left(x)函数来获取子字符串:

extension String {

    // length of string
    var length: Int {
        return self.characters.count
    }

    //  right(x) and left(x) function to get substring
    func right(_ i: Int) -> String?
    {
        return self[self.length-i ... self.length-1 ] //error  
    }

    func left(_ i: Int) -> String?
    {
        return self[0 ... i-1] //error     
    }
}

enter image description here

2 个答案:

答案 0 :(得分:29)

将此扩展程序用于可数范围的[0...4]下标

extension String {

  subscript (r: CountableClosedRange<Int>) -> String {
    get {
      let startIndex =  self.index(self.startIndex, offsetBy: r.lowerBound)
      let endIndex = self.index(startIndex, offsetBy: r.upperBound - r.lowerBound)
      return self[startIndex...endIndex]
    }
  }
}

或更安全的版本,它检查边界并返回nil而不是超出范围的异常:

extension String {

    subscript (r: CountableClosedRange<Int>) -> String? {
        get {
            guard r.lowerBound >= 0, let startIndex = self.index(self.startIndex, offsetBy: r.lowerBound, limitedBy: self.endIndex),
                let endIndex = self.index(startIndex, offsetBy: r.upperBound - r.lowerBound, limitedBy: self.endIndex) else { return nil }
            return self[startIndex...endIndex]
        }
    }
}

Swift 4更改:您需要从结果中创建一个新字符串

return String(self[startIndex...endIndex])

答案 1 :(得分:0)

我从@vadian的答案中汲取了灵感,并创建了一组(Swift 4)扩展名,这些扩展名使提取子字符串变得轻而易举。这些不进行边界检查,这通常是我的偏爱,因为我不应该将健全性检查推迟到此类较低级别的实用程序。

extension String {

    subscript (_ index: Int) -> String {
        return String(self[self.index(startIndex, offsetBy: index)])
    }

    subscript (_ range: CountableRange<Int>) -> String {
        let lowerBound = index(startIndex, offsetBy: range.lowerBound)
        let upperBound = index(startIndex, offsetBy: range.upperBound)
        return String(self[lowerBound..<upperBound])
    }

    subscript (_ range: CountableClosedRange<Int>) -> String {
        let lowerBound = index(startIndex, offsetBy: range.lowerBound)
        let upperBound = index(startIndex, offsetBy: range.upperBound)
        return String(self[lowerBound...upperBound])
    }

    subscript (_ range: CountablePartialRangeFrom<Int>) -> String {
        return String(self[index(startIndex, offsetBy: range.lowerBound)...])
    }

    subscript (_ range: PartialRangeUpTo<Int>) -> String {
        return String(self[..<index(startIndex, offsetBy: range.upperBound)])
    }

    subscript (_ range: PartialRangeThrough<Int>) -> String {
        return String(self[...index(startIndex, offsetBy: range.upperBound)])
    }

}