如何将Int转换为String.CharacterView.Index

nek*_*ari 8 string subscript swift2 swift2.2

这让我疯了.

在雨燕2.2,这使得它不可能下标StringInt.例如:

let myString = "Test string"
let index = 0
let firstCharacter = myString[index]
Run Code Online (Sandbox Code Playgroud)

这将导致编译错误,说

'subscript'不可用:不能使用Int下标String,请参阅文档注释以供讨论

我看到的一个解决方法是将整数转换为索引类型,但我无法弄清楚如何...

ZGs*_*ski 12

这不是必然的下标,只需要一个额外的步骤来获得与以前相同的结果.下面,我和你做了同样的事情,但是在Swift 2.2中

let myString = "Test string"
let intForIndex = 0
let index = myString.startIndex.advancedBy(intForIndex)
let firstCharacter = myString[index]
Run Code Online (Sandbox Code Playgroud)

Swift 3.x + 4.x.

let myString = "Test string"
let intForIndex = 0
let index = myString.index(myString.startIndex, offsetBy: intForIndex)
let firstCharacter = myString[index]
Run Code Online (Sandbox Code Playgroud)

编辑1:

更新了代码,以便您可以使用在Int其他位置传递到"index"值的代码.


语法编辑:

我将不断更新此答案以支持最新版本的Swift.


Cod*_*ent 10

它也让我感到烦恼,所以我写了一个扩展来处理它:

extension String {
    subscript (index: Int) -> Character {
        let charIndex = self.startIndex.advancedBy(index)
        return self[charIndex]
    }

    subscript (range: Range<Int>) -> String {
        let startIndex = self.startIndex.advancedBy(range.startIndex)
        let endIndex = startIndex.advancedBy(range.count)

        return self[startIndex..<endIndex]
    }
}

// Usage
let str = "Hello world"

print(str[0])       // H
print(str[0..<5])   // Hello
Run Code Online (Sandbox Code Playgroud)

针对Swift 4.x进行了更新:

extension String {
    subscript (index: Int) -> Character {
        let charIndex = self.index(self.startIndex, offsetBy: index)
        return self[charIndex]
    }

    subscript (range: Range<Int>) -> Substring {
        let startIndex = self.index(self.startIndex, offsetBy: range.startIndex)
        let stopIndex = self.index(self.startIndex, offsetBy: range.startIndex + range.count)
        return self[startIndex..<stopIndex]
    }

}

let s = "??? family"

print(s[0])      // ???
print(s[2..<8])  // family
Run Code Online (Sandbox Code Playgroud)