Objective-C-文字列から最後の文字を削除


回答:


418

コントローラークラスで、Interface Builderでボタンをフックするアクションメソッドを作成します。そのメソッド内で、次のように文字列をトリミングできます。


if ([string length] > 0) {
    string = [string substringToIndex:[string length] - 1];
} else {
    //no characters to delete... attempting to do so will result in a crash
}






たった1行のコードでこれを行う手の込んだ方法が必要な場合は、次のように書くことができます。

string = [string substringToIndex:string.length-(string.length>0)];

派手な1行のコードスニペットの*説明:

削除する文字がある場合(文字列のすなわち長さが0より大きい)
     (string.length>0)を返す1 ので、コードのリターンを作る:
          string = [string substringToIndex:string.length-1];

削除する文字が存在しない場合(すなわちの長さ文字列は0より大きくない)を
     (string.length>0)返し0 、コードを返します。
          string = [string substringToIndex:string.length-0];
     これにより、クラッシュが防止されます。


8
ソリューションには1バグのオフがあります。[string substringToIndex:[string length]-1]である必要があります。
ジム・コレイア

DOES「文字列」「string.text」または単に文字列名を参照してください
オマール

ジムに感謝します。算数を計算するには早すぎました。:) Omar、stringは、変更するテキストを保持するstringという変数を指します。ディスク上のファイルまたはアプリケーションのデータからNSStringオブジェクトを作成するさまざまな方法については、ドキュメントをご覧ください。
マークシャル

1
@DonalRaffertyは、文字列がnilでないことを確認してください
Quantumpotato

文字列がnilの場合は問題ありません。整数値を返すメソッドを呼び出すと、Obj-Cで0が返されます(浮動小数点の戻り値には同じことが当てはまりません)。そのため、ifステートメントはaskingと同等string != nil && [string length] > 0です。Donalの文字列変数が過剰にリリースされている可能性があります。
Marc Charbonneau、2012年

53

NSMutableString(動的に変更するのでお勧めします)の場合は、次のように使用できます。

[myString deleteCharactersInRange:NSMakeRange([myRequestString length]-1, 1)];

8

ここに示すソリューションは、実際にはマルチバイトのUnicode文字(「合成文字」)を考慮していないため、無効なUnicode文字列になる可能性があります。

実際、の宣言をsubstringToIndex含むiOSヘッダーファイルには、次のコメントが含まれています。

ヒント:rangeOfComposedCharacterSequencesForRange:と共に使用して、構成された文字の分割を回避します

を使用rangeOfComposedCharacterSequenceAtIndex:して最後の文字を正しく削除する方法をご覧ください。


6

ドキュメンテーションはあなたの友人であり、あなたが持っている文字列を短くすることができるNSString呼び出しsubstringWithRangeをサポートし、短縮された文字列を返します。このインスタンスは変更できませんNSString。あなたが持っている場合NSMutableStringdeleteCharactersInRange、所定の場所に文字列を変更できると呼ばれるメソッドがあります

...
NSRange r;
r.location = 0;
r.size = [mutable length]-1;
NSString* shorted = [stringValue substringWithRange:r];
...

1
NSMakeRangeを使用すると、範囲の構造体の入力が少しエレガントに見えることがあります。
dreamlax 2009

@ハラルド、をsubstringWithRange:返しますNSString*。ポインタに注意してください。
Thomas Nadin、2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.