[解決済み] プログラミング言語Swiftで文字列のn文字目を取得する
質問
文字列の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)] }
}
を変換するために
Substring
を
String
を使用すると、単純に
する
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
で使用されるNSAttributedString
とNSRegularExpression
は、部分文字列のオフセットと長さを格納します。 をUTF-16のコード単位で表す。
String.unicodeScalars
は、Unicodeスカラーのコレクションです。 このAPIは、低レベルの操作を行う場合に使用します。 文字データの
String.characters
は、拡張された書記素 クラスタであり、ユーザーが認識する近似値である。 の文字が含まれます。人間が読むことのできるテキストを含む文字列を処理する場合の注意点。 一文字ずつの処理は極力避けたい。 可能です。代わりに高レベルのロケールセンシティブなユニコードアルゴリズムを使用する、など。
String.localizedStandardCompare()
,String.localizedLowercaseString
,String.localizedStandardRangeOfString()
などです。
関連
-
[解決済み] これを解決するにはどうしたらいいのでしょうか。UILabel.textは、メインスレッドからのみ使用する必要があります。
-
[解決済み] 文字列リテラルの前にある'b'文字は何を意味するのでしょうか?
-
[解決済み] Swiftで文字列が別の文字列を含んでいるかどうかを確認するには?
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] 文字列の長さを取得する
-
[解決済み] SwiftでStringを配列に分割する?
-
[解決済み】文字列中のある文字の出現回数をカウントする
-
[解決済み】文字列から最後の文字を削除する。Swift言語
-
[解決済み】Swiftで弱参照の配列を宣言するには?
-
[解決済み】なぜ、Swiftの文字列では、?のような絵文字が奇妙に扱われるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Thread 1: signal SIGABRTエラーを解決するには?[クローズド]
-
[解決済み] メインスレッドチェッカー バックグラウンドスレッドで呼び出された UI API: -[UIApplication applicationState].
-
[解決済み] swiftにおけるconvenience initとinitの違いは何ですか、より良い明示的な例
-
[解決済み] Swift: print() vs println() vs NSLog()
-
[解決済み] Swiftのコンストラクタ
-
[解決済み] 2倍値を小数点以下x桁に丸める処理を素早く行う。
-
[解決済み] Swiftで乱数を生成する方法とは?
-
[解決済み】Swiftでオブジェクトが与えられた型かどうかを確認する
-
[解決済み】Swiftの`let`と`var`の違いは何ですか?
-
[解決済み】ReactiveCocoaとRxSwiftの比較 - 長所と短所?