Swift3和Xcode8:'subscript'不可用:不能使用CountableClosedRange <Int>下标String,

San*_*nju 10 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 
Run Code Online (Sandbox Code Playgroud)

错误2: 在String的扩展中,我将这些写入get right(x)left(x)function来获取子字符串:

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     
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

vad*_*ian 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]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

或更安全的版本,检查边界和返回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]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

return String(self[startIndex...endIndex])
Run Code Online (Sandbox Code Playgroud)