2016-09-21 24 views
9

錯誤1: 當我試圖獲取元數據中的stringValue顯示上述錯誤在Swift3Swift3&Xcode8: '下標' 不可用:不能標串用CountableClosedRange <Int>,

let myMetadata: AVMetadataMachineReadableCodeObject = metadataObjects[0] as! AVMetadataMachineReadableCodeObject 

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

錯誤2: 在字符串的擴展我寫這些讓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

+0

感謝編輯Shobhakar蒂瓦里和@Nirav d – Sanju

回答

27

使用這個擴展爲下標

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

可數閉區間[0...4]或檢查的範圍,並返回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 change:您需要從t中創建一個新字符串他導致

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

它爲獲得字符串的左,右子? – Sanju

+0

它應該同時具有「右」和「左」功能。 – vadian

+0

我把這個方法放在我的擴展中,那些錯誤消失了。哇 !!謝謝@vadian – Sanju