1

I am using the below extension in swift 3, but I know it is incorrect because I still get errors. The point of the extension is to get a range of a string using the syntax string[0...2] That will return the string from 0. This is the error I am getting enter image description here

extension String {

subscript (i: Int) -> Character {
    return self[self.characters.index(self.startIndex, offsetBy: i)]
}

subscript (i: Int) -> String {
    return String(self[i] as Character)
}

subscript (r: Range<Int>) -> String {
    let start = characters.index(startIndex, offsetBy: r.lowerBound)
    let end = characters.index(start, offsetBy: r.upperBound - r.lowerBound)
    return self[(start ..< end)]
  }
}
manatee
  • 185
  • 1
  • 10

2 Answers2

4

In Swift 3, the closed range operator ... generates CountableClosedRange for Ints. So you need to define one more overload for subscript.

    subscript (r: CountableClosedRange<Int>) -> String {
        let start = characters.index(startIndex, offsetBy: r.lowerBound)
        let end = characters.index(start, offsetBy: r.upperBound - r.lowerBound)
        return self[(start ... end)]
    }
OOPer
  • 47,149
  • 6
  • 107
  • 142
0

Updated in Swift 4:

extension String{
    subscript (r: CountableClosedRange<Int>) -> String {
        let start = index(startIndex, offsetBy: r.lowerBound)
        let end = index(start, offsetBy: r.upperBound - r.lowerBound)
        return String(self[start...end])
    }
}
black_pearl
  • 2,549
  • 1
  • 23
  • 36