NSStringを連結するObjective-Cのショートカット



14 Answers

オプション:

[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;
}
Question

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";



lldbペインで次のことを試していた

[NSString stringWithFormat:@"%@/%@/%@", three, two, one];

どのエラー。

代わりにallocとinitWithFormatメソッドを使用します:

[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];



AppendString(AS)マクロを作成してショートカット...

#define AS(A,B)    [(A) stringByAppendingString:(B)]
NSString *myString = @"This"; NSString *test = AS(myString,@" is just a test");

注意:

マクロを使用している場合はもちろん、variadic引数を使用してください。EthanBの答えを参照してください。




メソッドを作成する......

- (NSString *)strCat: (NSString *)one: (NSString *)two
{
    NSString *myString;
    myString = [NSString stringWithFormat:@"%@%@", one , two];
    return myString;
}

次に、必要な関数であれば、文字列やtextfieldなどをこの関数の戻り値に設定します。

または、ショートカットを作るためにできることは、NSStringをC ++の文字列に変換し、そこに '+'を使用することです。

お役に立てれば!!!!!




マクロ:

// 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:@""];



新しい配列リテラル構文を使用する簡単な方法は次のとおりです。

NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
                  ^^^^^^^ create array ^^^^^
                                               ^^^^^^^ concatenate ^^^^^



stringWithFormatを試してください:

NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];



これは、優れたロギングとロギングのみのためのもので、diciusの優れた複数引数の方法に基づいています。 私はLoggerクラスを定義し、それを以下のように呼びます:

[Logger log: @"foobar ", @" asdads ", theString, nil];

ほとんどの場合、var argsを "nil"で終了する必要はありませんが、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://.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 

文字列の連結のみを行うために、NSStringのCategoryを定義し、その文字列を返す以外は上記のlogメソッドとまったく同じ静的(+)連結メソッドを追加します。 これは文字列メソッドなのでNSString上にあり、1-N文字列から新しい文字列を作成し、追加の一部である文字列のいずれかで呼び出しないので静的です。




スウィフトで

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"



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];



私がテストしたとき、どちらのフォーマットもXCode7で動作します:

NSString *sTest1 = {@"This" " and that" " and one more"};
NSString *sTest2 = {
  @"This"
  " and that"
  " and one more"
};

NSLog(@"\n%@\n\n%@",sTest1,sTest2);

なんらかの理由で、@演算子文字は最初の文字列に必要です。

ただし、可変挿入では機能しません。 そのためには、 "and"の代わりに "cat"にマクロを使用することを除いて、 この非常に単純なソリューションを使用することができます。




stringByAppendingStringを短縮し、 #defineを使用するのはどうですか?

#define and stringByAppendingString

したがって、あなたは以下を使用します:

NSString* myString = [@"Hello " and @"world"];

問題はそれが2つの文字列に対してのみ機能することです。追加の括弧を追加する必要があります:

NSString* myString = [[@"Hello" and: @" world"] and: @" again"];



私の好みの方法はこれです:

NSString *firstString = @"foo";
NSString *secondString = @"bar";
NSString *thirdString = @"baz";

NSString *joinedString = [@[firstString, secondString, thirdString] join];

あなたはNSArrayにカテゴリを使ってjoinメソッドを追加することでそれを実現できます:

#import "NSArray+Join.h"
@implementation NSArray (Join)
-(NSString *)join
{
    return [self componentsJoinedByString:@""];
}
@end

@[] NSArrayの短い定義ですが、これは文字列を連結する最も速い方法だと思います。

カテゴリを使用しない場合は、 componentsJoinedByString:メソッドを直接使用します。

NSString *joinedString = [@[firstString, secondString, thirdString] componentsJoinedByString:@""];



そこにいくつの文字列があるのか​​わからないと想像してみましょう。

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:@", "];



私はこの記事に戻り続け、答えをソートして、必要なだけ多くの変数を扱えるこの単純なソリューションを見つけ出すことに終わります。

[NSString stringWithFormat:@"%@/%@/%@", three, two, one];

例えば:

NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId];



Related