NSStringsを連結するためのObjective-Cでのショートカット
-
21-08-2019 - |
質問
の任意のObjective-Cで(stringByAppendingString:
)文字列の連結へのショートカット、またはショートカットが一般的でNSString
での作業のためにそこにいますか?
たとえば、私はしたいと思います:
NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];
以上のような何かます:
string myString = "This";
string test = myString + " is just a test";
解決
2つの答えを私は考えるん...どちらも特にちょうど連結演算子を持つと同じくらい楽しいですができます。
まず、余分な一時文字列の必要性の一部を取り除く、NSMutableString
方法を持っているappendString
を使用します。
次に、NSArray
法を介して連結するcomponentsJoinedByString
を使用します。
他のヒント
オプション:
[NSString stringWithFormat:@"%@/%@/%@", one, two, three];
別のオプション:
私はあなたが行うことができ、その場合には、複数のアペンド(A + B + C + D)、と満足していない推測しています
NSLog(@"%@", [Util append:one, @" ", two, nil]); // "one two"
NSLog(@"%@", [Util append:three, @"/", two, @"/", one, nil]); // three/two/one
タグのようなものを使用して
+ (NSString *) append:(id) first, ...
{
NSString * result = @"";
id eachArg;
va_list alist;
if(first)
{
result = [result stringByAppendingString:first];
va_start(alist, first);
while (eachArg = va_arg(alist, id))
result = [result stringByAppendingString:eachArg];
va_end(alist);
}
return result;
}
はの2 NSStringののリテラルを持っている場合は、あなたもちょうどこの操作を行うことができます:
NSString *joinedFromLiterals = @"ONE " @"MILLION " @"YEARS " @"DUNGEON!!!";
これはの#defineに参加するためにも便利です。
#define STRINGA @"Also, I don't know "
#define STRINGB @"where food comes from."
#define JOINED STRINGA STRINGB
お楽しみください。
私はこの記事に戻っておくと、常に必要な数の変数で動作します。この簡単な解決策を見つけるために答えをソート結局ます:
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];
例
NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId];
さて、コロンは一種の特殊記号ですが、のメソッドシグネチャのの部分で、このの非慣用のスタイルを追加するカテゴリをNSString
をextedすることが可能であるとして文字列連結のます:
[@"This " : @"feels " : @"almost like " : @"concatenation with operators"];
あなたは便利としてあなたはできるだけ多くのコロン区切りの引数を定義することができます...; - )
良い測定のために、私はまた、文字列のconcat:
終了リストを受け取り、可変引数を持つnil
を追加しました。
// NSString+Concatenation.h
#import <Foundation/Foundation.h>
@interface NSString (Concatenation)
- (NSString *):(NSString *)a;
- (NSString *):(NSString *)a :(NSString *)b;
- (NSString *):(NSString *)a :(NSString *)b :(NSString *)c;
- (NSString *):(NSString *)a :(NSString *)b :(NSString *)c :(NSString *)d;
- (NSString *)concat:(NSString *)strings, ...;
@end
// NSString+Concatenation.m
#import "NSString+Concatenation.h"
@implementation NSString (Concatenation)
- (NSString *):(NSString *)a { return [self stringByAppendingString:a];}
- (NSString *):(NSString *)a :(NSString *)b { return [[self:a]:b];}
- (NSString *):(NSString *)a :(NSString *)b :(NSString *)c
{ return [[[self:a]:b]:c]; }
- (NSString *):(NSString *)a :(NSString *)b :(NSString *)c :(NSString *)d
{ return [[[[self:a]:b]:c]:d];}
- (NSString *)concat:(NSString *)strings, ...
{
va_list args;
va_start(args, strings);
NSString *s;
NSString *con = [self stringByAppendingString:strings];
while((s = va_arg(args, NSString *)))
con = [con stringByAppendingString:s];
va_end(args);
return con;
}
@end
// NSString+ConcatenationTest.h
#import <SenTestingKit/SenTestingKit.h>
#import "NSString+Concatenation.h"
@interface NSString_ConcatenationTest : SenTestCase
@end
// NSString+ConcatenationTest.m
#import "NSString+ConcatenationTest.h"
@implementation NSString_ConcatenationTest
- (void)testSimpleConcatenation
{
STAssertEqualObjects([@"a":@"b"], @"ab", nil);
STAssertEqualObjects([@"a":@"b":@"c"], @"abc", nil);
STAssertEqualObjects([@"a":@"b":@"c":@"d"], @"abcd", nil);
STAssertEqualObjects([@"a":@"b":@"c":@"d":@"e"], @"abcde", nil);
STAssertEqualObjects([@"this " : @"is " : @"string " : @"concatenation"],
@"this is string concatenation", nil);
}
- (void)testVarArgConcatenation
{
NSString *concatenation = [@"a" concat:@"b", nil];
STAssertEqualObjects(concatenation, @"ab", nil);
concatenation = [concatenation concat:@"c", @"d", concatenation, nil];
STAssertEqualObjects(concatenation, @"abcdab", nil);
}
メソッドを作成します:
- (NSString *)strCat: (NSString *)one: (NSString *)two
{
NSString *myString;
myString = [NSString stringWithFormat:@"%@%@", one , two];
return myString;
}
次に、あなたがそれを必要とするどんな機能では、この関数の戻り値に、あなたの文字列またはテキストフィールドまたは何を設定します。
または、ショートカットを作成するC ++文字列にNSStringのを変換し、そこに「+」を使用します。
この方法を使用します:
NSString *string1, *string2, *result;
string1 = @"This is ";
string2 = @"my string.";
result = [result stringByAppendingString:string1];
result = [result stringByAppendingString:string2];
または
result = [result stringByAppendingString:@"This is "];
result = [result stringByAppendingString:@"my string."];
のマクロ:の
// stringConcat(...)
// A shortcut for concatenating strings (or objects' string representations).
// Input: Any number of non-nil NSObjects.
// Output: All arguments concatenated together into a single NSString.
#define stringConcat(...) \
[@[__VA_ARGS__] componentsJoinedByString:@""]
のテストケース:の
- (void)testStringConcat {
NSString *actual;
actual = stringConcat(); //might not make sense, but it's still a valid expression.
STAssertEqualObjects(@"", actual, @"stringConcat");
actual = stringConcat(@"A");
STAssertEqualObjects(@"A", actual, @"stringConcat");
actual = stringConcat(@"A", @"B");
STAssertEqualObjects(@"AB", actual, @"stringConcat");
actual = stringConcat(@"A", @"B", @"C");
STAssertEqualObjects(@"ABC", actual, @"stringConcat");
// works on all NSObjects (not just strings):
actual = stringConcat(@1, @" ", @2, @" ", @3);
STAssertEqualObjects(@"1 2 3", actual, @"stringConcat");
}
<時間>
の代替マクロ:の(あなたが引数の最小数を強制したい場合)
// stringConcat(...)
// A shortcut for concatenating strings (or objects' string representations).
// Input: Two or more non-nil NSObjects.
// Output: All arguments concatenated together into a single NSString.
#define stringConcat(str1, str2, ...) \
[@[ str1, str2, ##__VA_ARGS__] componentsJoinedByString:@""];
Webサービスのための要求を構築するとき、私は次のようなものをやって見つけることは非常に簡単で、Xcodeで連結読みやすくなります:
NSString* postBody = {
@"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
@"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
@" <soap:Body>"
@" <WebServiceMethod xmlns=\"\">"
@" <parameter>test</parameter>"
@" </WebServiceMethod>"
@" </soap:Body>"
@"</soap:Envelope>"
};
AppendString(AS)マクロを作成することによって、ショートカット...
#define AS(A,B) [(A) stringByAppendingString:(B)]
NSString *myString = @"This"; NSString *test = AS(myString,@" is just a test");
注:
マクロを使用する場合は、もちろんただ可変長引数でそれを行う、EthanBの回答を参照してください。
NSString *label1 = @"Process Name: ";
NSString *label2 = @"Process Id: ";
NSString *processName = [[NSProcessInfo processInfo] processName];
NSString *processID = [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]];
NSString *testConcat = [NSString stringWithFormat:@"%@ %@ %@ %@", label1, processName, label2, processID];
ここで新しい配列リテラル構文を使用して、簡単な方法です
NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
^^^^^^^ create array ^^^^^
^^^^^^^ concatenate ^^^^^
NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];
のObjective Cとなりました数年後、私は、これはあなたが達成しようとしているものを達成するためのObjective Cで動作するように最善の方法だと思います。
あなたのXcodeアプリケーションに「N」をキー入力起動し、それが「NSStringの」に自動的に補完。 「STR」のキーと、それは「stringByAppendingString」に自動的に補完。だから、キーストロークは非常に限られています。
あなたがキー「@」を押すと、読みやすいコードを書くプロセスをタブ移動のこつを得れば、はもはや問題となっていません。これは、適応するだけです。
任意の短いc = [a stringByAppendingString: b]
を作るための唯一の方法は、st
ポイント付近でオートコンプリートを使用することです。 +
オペレータは、Objective-Cのオブジェクトについて知らないCの一部である。
どのようにstringByAppendingString
の短縮について、使いのに#define の
#define and stringByAppendingString
このように、あなたが使用することになります:
NSString* myString = [@"Hello " and @"world"];
問題はそれだけで二つの文字列のために働く、あなたがより多くのアペンドのための追加のブラケットをラップするために必要だということです。
NSString* myString = [[@"Hello" and: @" world"] and: @" again"];
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];
NSString *label1 = @"Process Name: ";
NSString *label2 = @"Process Id: ";
NSString *processName = [[NSProcessInfo processInfo] processName];
NSString *processID = [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]];
NSString *testConcat = [NSString stringWithFormat:@"%@ %@ %@ %@", label1, processName, label2, processID];
私はこのコードを試してみました。それは私のために働いています。
NSMutableString * myString=[[NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];
しようとしていたlldb
ペインで次の
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];
これはエラーます。
の代わりのallocとinitWithFormat
メソッドを使用します:
[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];
これは、より良い、ロギングのためのものであり、唯一のロギング - dicius優れた複数の引数法に基づきます。私はLoggerクラスを定義し、そのようにそれを呼び出します:
[Logger log: @"foobar ", @" asdads ", theString, nil];
「ゼロ」とするvar引数を終了することを除いて、ほとんど良いが、私はObjective-Cの中にその周りに方法はありませんと仮定します。
Logger.h
@interface Logger : NSObject {
}
+ (void) log: (id) first, ...;
@end
Logger.m
@implementation Logger
+ (void) log: (id) first, ...
{
// TODO: make efficient; handle arguments other than strings
// thanks to @diciu http://stackoverflow.com/questions/510269/how-do-i-concatenate-strings-in-objective-c
NSString * result = @"";
id eachArg;
va_list alist;
if(first)
{
result = [result stringByAppendingString:first];
va_start(alist, first);
while (eachArg = va_arg(alist, id))
{
result = [result stringByAppendingString:eachArg];
}
va_end(alist);
}
NSLog(@"%@", result);
}
@end
唯一の CONCAT の文字列にするために、私は、NSStringの上のカテゴリーを定義したいとまさにそれが文字列を返すことを除いて上記のログ方法のように見えるもの、それに静的な(+)CONCATENATEメソッドを追加します。それは、文字列の方法だからそれはNSStringの上だし、あなたがアペンドの一部である文字列のいずれかでそれを呼び出すことはありませ、1-Nの文字列から新しい文字列を作成したいので、それは静的です。
NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];
stringWithFormatを試してみてください。
NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];
多くの場合、私はその後、私は疑問に示す第2の方法を使用してのstd ::文字列を連結することができ、それが簡単にソースファイルにObjC ++を作るために探しています。
std::string stdstr = [nsstr UTF8String];
//easier to read and more portable string manipulation goes here...
NSString* nsstr = [NSString stringWithUTF8String:stdstr.c_str()];
私の好ましい方法はこれです:
NSString *firstString = @"foo";
NSString *secondString = @"bar";
NSString *thirdString = @"baz";
NSString *joinedString = [@[firstString, secondString, thirdString] join];
あなたがカテゴリにNSArrayのに参加する方法を追加することによって、それを達成することができます:
#import "NSArray+Join.h"
@implementation NSArray (Join)
-(NSString *)join
{
return [self componentsJoinedByString:@""];
}
@end
私は、これは文字列を連結するための最速の方法だと思う、それは@[]
ための短い定義ですNSArray
ます。
カテゴリを使用しない場合は、直接componentsJoinedByString:
メソッドを使用します:
NSString *joinedString = [@[firstString, secondString, thirdString] componentsJoinedByString:@""];
あなたがようにNSArrayを使用することができます。
NSString *string1=@"This"
NSString *string2=@"is just"
NSString *string3=@"a test"
NSArray *myStrings = [[NSArray alloc] initWithObjects:string1, string2, string3,nil];
NSString *fullLengthString = [myStrings componentsJoinedByString:@" "];
または
あなたが使用することができます。
NSString *imageFullName=[NSString stringWithFormat:@"%@ %@ %@.", string1,string2,string3];
これらのフォーマットのいずれかがXCode7で働くます:
NSString *sTest1 = {@"This" " and that" " and one more"};
NSString *sTest2 = {
@"This"
" and that"
" and one more"
};
NSLog(@"\n%@\n\n%@",sTest1,sTest2);
は、何らかの理由で、あなただけのミックスの最初の文字列に@演算子文字を必要としています。
しかし、それは変数の挿入では動作しません。そのためには、をhref="https://stackoverflow.com/a/11320175/105539">の代わりに、「及び」を使用することができますます。
UIテストでこれを必要とするすべてのObjective C愛好家のための
-(void) clearTextField:(XCUIElement*) textField{
NSString* currentInput = (NSString*) textField.value;
NSMutableString* deleteString = [NSMutableString new];
for(int i = 0; i < currentInput.length; ++i) {
[deleteString appendString: [NSString stringWithFormat:@"%c", 8]];
}
[textField typeText:deleteString];
}
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];
でのスウィフトの
let str1 = "This"
let str2 = "is just a test"
var appendStr1 = "\(str1) \(str2)" // appendStr1 would be "This is just a test"
var appendStr2 = str1 + str2 // // appendStr2 would be "This is just a test"
また、あなたは以下のように同じのため+=
演算子を使用することができます...
var str3 = "Some String"
str3 += str2 // str3 would be "Some String is just a test"
のuはどのように多くの文字列があるかわからないことを想像してみましょう。
NSMutableArray *arrForStrings = [[NSMutableArray alloc] init];
for (int i=0; i<[allMyStrings count]; i++) {
NSString *str = [allMyStrings objectAtIndex:i];
[arrForStrings addObject:str];
}
NSString *readyString = [[arrForStrings mutableCopy] componentsJoinedByString:@", "];