web-dev-qa-db-ja.com

IntをString.CharacterView.Indexに変換する方法

これは私を狂わせています。

Swift 2.2では、StringIntで下付き文字にすることはできません。例:

let myString = "Test string"
let index = 0
let firstCharacter = myString[index]

これにより、コンパイルエラーが発生します。

'subscript'は使用できません:文字列をIntで添え字にすることはできません。説明については、ドキュメントのコメントを参照してください

私が見ている回避策の1つは、整数をインデックスタイプに変換することですが、その方法がわかりません。

9
nekonari

それは私も悩まされたので、私はそれに対処するための拡張機能を書きました:

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
10
Code Different

添え字が必ずしも不可能というわけではありません。以前と同じ結果を得るには、さらに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の最新バージョンをサポートするために、この回答を一貫して更新します。

12
ZGski

Swift 4:の例

let myString = "Test string"
let index = 0
let firstCharacter = myString[String.Index(encodedOffset: index)]
3
Linh Dao