これは私を狂わせています。
Swift 2.2では、String
をInt
で下付き文字にすることはできません。例:
let myString = "Test string"
let index = 0
let firstCharacter = myString[index]
これにより、コンパイルエラーが発生します。
'subscript'は使用できません:文字列をIntで添え字にすることはできません。説明については、ドキュメントのコメントを参照してください
私が見ている回避策の1つは、整数をインデックスタイプに変換することですが、その方法がわかりません。
それは私も悩まされたので、私はそれに対処するための拡張機能を書きました:
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
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
添え字が必ずしも不可能というわけではありません。以前と同じ結果を得るには、さらに1つの手順が必要です。以下、私はあなたと同じことをしましたが、Swift 2.2
let myString = "Test string"
let intForIndex = 0
let index = myString.startIndex.advancedBy(intForIndex)
let firstCharacter = myString[index]
Swift 3.x + 4.x
let myString = "Test string"
let intForIndex = 0
let index = myString.index(myString.startIndex, offsetBy: intForIndex)
let firstCharacter = myString[index]
編集1:
他の場所で「インデックス」値に渡されたInt
を使用できるようにコードを更新しました。
構文の編集:
Swiftの最新バージョンをサポートするために、この回答を一貫して更新します。
Swift 4:の例
let myString = "Test string"
let index = 0
let firstCharacter = myString[String.Index(encodedOffset: index)]