2016-12-01 4 views
1

Swift String操作が非常に複雑で扱いにくいのはなぜですか?SwiftでStringの一部を反復処理する

逆の文字列を繰り返し処理しますが、最初の文字は無視しなければなりません。さて、これは次のように行うことができる:

var firstTime = true 
for i in textBefore.characters.reversed() { 
    if firstTime { 
    firstTime = false 
    } else { 
     if String(i).personalFunction() { 
     // something 
     } else { 
     // something else 
     } 
    } 
} 

しかし、本当に私はちょうどのような何かやりたい:私たちはintとしてインデックスを取得することはできませんだから、なぜ

textBefore = textBefore.characters.reversed() 
for i in 1...textBefore.characters.count { 
    if textBefore.get(i).personalFunction() { 
    // something 
    } else { 
    // something else 
    } 
} 

を。そして、なぜtextBefore.characters.reversed()がStringでなく、単にStringに逆関数があるのでしょうか。これらすべての問題は、SwiftのStringsを使って作業することにとてもイライラさせ、文字列をcharの配列に変換するという愚かなことをします:Sまたは上記の私の提案する解決策のようなもの...古いファッションです...私はこのスティッフルのために私の脳を正しい方向に向けるために、スピーディーなグルを必要としています。

+1

「なぜ、」文字列内の文字にアクセスするにはUTF-8デコードのためO(1)ではありません。最悪の場合、それはO(n)です。ほとんどの言語では、バイトへの直接アクセスが可能です(UTF-8は無視され、複雑なものやマルチバイト文字が表示された場合は微妙なバグが挿入される)か、スペース効率の良いデータ構造で動作します。 O(1)だが文字あたり4バイト(UTF-16など)未満のものを使用するものは、ラテンの言語以外の言語で作業しているときに驚くべきコーナーケースの扉を開きます。 –

+1

(Swiftがスクリプト言語になりたいと言い、それがそうであると言えば、文字列の部分とのより良いインターフェースを開発する必要があるでしょう。Swiftには最高の解決策があります。単純なケースでは簡単にしますが、他のケースではバグがあります)。 –

+0

@RobNapierこれは意味がありますが、ほとんどの場合、これらの問題は問題がありません。今すぐSwiftは開発者の95%に問題をもたらし、5%は回避策を講じなければならなかった問題はありません。そして、95%〜20%や何かが、適切に機能するように回避策(拡張など)を行う可能性があります。 – Warpzit

答えて

7

string.charactersは文字の集合です。逆コレクションの最初の要素をスキップする 逆の順序で要素にアクセスするために使用reversed()、およびdropFirst()

let string = "ab" 

for ch in string.characters.reversed().dropFirst() { 
    print(ch) 
    // `ch` is a Character. Use `String(ch)` if you need a String. 
} 

が出力:

 
b 

a 
+0

これには非常に良い解決策です。 – TheValyreanGroup

+0

そして、おかげさしですが、私はまだあなたが期待している通常の文字列関数は、他のほとんどの言語とはまったく違っていると感じています。 – Warpzit

+0

@Warpzit:逆の文字列の最初の要素をスキップしたい、最初の文字列ではなく、私はそれを誤解していました。 - はい、Swiftの文字列は難しいかもしれませんが、他の言語が完全なUnicodeサポートをサポートしていますか? '' ''または '' "'は*の1文字*であるか?私の経験則は、文字列をシーケンスで処理し、それらを繰り返し処理することです。明示的なインデックス( "高価")で添え字を避ける。 –

1

あなたはです。は、あなたの2番目のようなことをします。 forと入力した後は、文字列から直接インデックスを取得できます。 Swiftでは、文字列は単なる文字の配列です。

textBefore = String(textBefore.characters.reversed()) 
for i in 1...textBefore.characters.count { 
    if textBefore[i].personalFunction() { 
    // something 
    } else { 
    // something else 
    } 
} 
+0

私は文字列型であるためにtextBefor [i]が必要です。 – Warpzit

+0

'String()'に最初の行のキャストをラップします。私の編集を参照してください。しかし、とにかくMartinの答えはよかったです:p – TheValyreanGroup

+0

私はtextBefore [i]をStringに変換できません。添え字警告を与えるでしょう。 – Warpzit