1. ホーム
  2. swift

[解決済み] プログラミング言語Swiftで文字列のn文字目を取得する

2022-03-20 08:40:12

質問

文字列のn番目の文字を取得するにはどうすればよいですか?試しにブラケット( [] )アクセサを使用することができますが、うまくいきません。

var string = "Hello, world!"

var firstChar = string[0] // Throws error

ERROR: 'subscript' is unavailable: cannot subscript String with an Int, see documentation comment for discussion

解決方法は?

注意 ご覧ください Leo Dabusの回答 は、Swift 4 と Swift 5 のための適切な実装です。

Swift 4 以降

Substring 型は、Swift 4 で導入され、サブストリングの 元の文字列とストレージを共有することで、より高速で効率的な処理を行うことができます。

試してみる こちら

extension StringProtocol {
    subscript(offset: Int) -> Character { self[index(startIndex, offsetBy: offset)] }
    subscript(range: Range<Int>) -> SubSequence {
        let startIndex = index(self.startIndex, offsetBy: range.lowerBound)
        return self[startIndex..<index(startIndex, offsetBy: range.count)]
    }
    subscript(range: ClosedRange<Int>) -> SubSequence {
        let startIndex = index(self.startIndex, offsetBy: range.lowerBound)
        return self[startIndex..<index(startIndex, offsetBy: range.count)]
    }
    subscript(range: PartialRangeFrom<Int>) -> SubSequence { self[index(startIndex, offsetBy: range.lowerBound)...] }
    subscript(range: PartialRangeThrough<Int>) -> SubSequence { self[...index(startIndex, offsetBy: range.upperBound)] }
    subscript(range: PartialRangeUpTo<Int>) -> SubSequence { self[..<index(startIndex, offsetBy: range.upperBound)] }
}

を変換するために SubstringString を使用すると、単純に する String(string[0..2]) しかし、それは その部分文字列を保持する予定がある場合。そうでない場合は にしておくと効率的です。 Substring .

<ストライク どなたか統合する良い方法を見つけて頂ければ幸いです。 この2つの拡張機能を1つにまとめました。私は StringProtocol のため、成功しませんでした。 index メソッドはそこに存在しません。 注:この回答はすでに編集されており、適切に実装され、現在は部分文字列でも機能します。ただ、StringProtocol型をサブスクリプトする際にクラッシュしないように、有効な範囲を使用することを確認してください。範囲外の値でクラッシュしない範囲での添え字を使用するには、次のようにします。 実装


なぜ内蔵されていないのですか?

エラーメッセージには "議論はドキュメントのコメントを参照してください"。 . Appleは、ファイル内で次のような説明をしています。 UnavailableStringAPIs.swift :

文字列の整数への添え字は使用できません。

という概念があります。 i 文字列内の文字 ライブラリやシステムによって解釈が異なる コンポーネントを使用します。 正しい解釈を選択する必要があります。 ユースケースや関係するAPIに応じて、このように String は整数を添え字として使用することはできません。

Swift は文字にアクセスするためのいくつかの異なる方法を提供します。 文字列の中に格納されているデータです。

  • String.utf8 は、UTF-8のコード単位の集まりで 文字列を使用します。文字列をUTF-8に変換する場合は、このAPIを使用します。 POSIX系のAPIの多くは、文字列をUTF-8コード単位で処理します。

  • String.utf16 は、UTF-16のコード単位の集まりで 文字列を使用します。 ほとんどのCocoaおよびCocoa touchのAPIでは、文字列の処理は をUTF-16コード単位で表示します。 例えば NSRange で使用される NSAttributedStringNSRegularExpression は、部分文字列のオフセットと長さを格納します。 をUTF-16のコード単位で表す。

  • String.unicodeScalars は、Unicodeスカラーのコレクションです。 このAPIは、低レベルの操作を行う場合に使用します。 文字データの

  • String.characters は、拡張された書記素 クラスタであり、ユーザーが認識する近似値である。 の文字が含まれます。

人間が読むことのできるテキストを含む文字列を処理する場合の注意点。 一文字ずつの処理は極力避けたい。 可能です。代わりに高レベルのロケールセンシティブなユニコードアルゴリズムを使用する、など。 String.localizedStandardCompare() , String.localizedLowercaseString , String.localizedStandardRangeOfString() などです。