1159

stringByAppendingString:Objective-C で( ) 文字列を連結するためのショートカット、またはNSString一般的に操作するためのショートカットはありますか?

たとえば、次のようにします。

NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];

もっと似たもの:

string myString = "This";
string test = myString + " is just a test";
4

30 に答える 30

1163

オプション:

[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;
}
于 2009-02-04T07:53:32.213 に答える
631

私が考えることができる2つの答え...どちらも、連結演算子を持つだけで特に楽しいものではありません。

まず、メソッドNSMutableStringを持つ を使用して、appendString余分な一時文字列の必要性を取り除きます。

次に、メソッドNSArrayを介して連結するためにan を使用します。componentsJoinedByString

于 2009-02-04T06:44:42.353 に答える
156

If you have 2 NSString literals, you can also just do this:

NSString *joinedFromLiterals = @"ONE " @"MILLION " @"YEARS " @"DUNGEON!!!";

That's also useful for joining #defines:

#define STRINGA @"Also, I don't know "
#define STRINGB @"where food comes from."
#define JOINED STRINGA STRINGB

Enjoy.

于 2011-03-17T11:59:13.837 に答える
82

私はこの投稿に戻ってきて、常に答えを並べ替えて、必要な数の変数で機能するこの単純なソリューションを見つけます。

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

例えば:

NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId];
于 2012-08-11T06:51:02.400 に答える
53

メソッドを作成します。

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

次に、必要な関数で、文字列またはテキストフィールドなどをこの関数の戻り値に設定します。

または、ショートカットを作成するには、NSString を C++ 文字列に変換し、そこで「+」を使用します。

于 2011-10-03T22:29:02.840 に答える
45

コロンは一種の特別な記号ですがメソッド シグネチャの一部であるため、NSStringwith カテゴリを拡張して、この非慣用的なスタイルの文字列連結を追加することができます。

[@"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);
}
于 2012-03-16T00:41:54.720 に答える
37

次のように使用stringByAppendingString:します。

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."];
于 2010-07-26T16:04:03.143 に答える
31

大きい:

// 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:@""];
于 2013-05-31T17:07:51.677 に答える
27

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>"
};
于 2012-03-16T14:24:43.240 に答える
27

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

#define AS(A,B) [(A) stringByAppendingString:(B)]
NSString *myString = @"これ"; NSString *test = AS(myString,@" は単なるテストです");

ノート:

もちろん、マクロを使用する場合は、可変引数を使用して実行してください。EthanBの回答を参照してください。

于 2009-07-18T05:38:30.367 に答える
13
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];
于 2010-06-10T09:50:33.863 に答える
11

新しい配列リテラル構文を使用した簡単な方法を次に示します。

NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
                  ^^^^^^^ create array ^^^^^
                                               ^^^^^^^ concatenate ^^^^^
于 2012-08-30T02:29:57.343 に答える
8
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];
于 2013-04-29T07:35:26.753 に答える
8

短縮して#definestringByAppendingStringを使用するのはどうですか:

#define and stringByAppendingString

したがって、次を使用します。

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

問題は、2 つの文字列に対してのみ機能することです。さらに追加するには、追加のブラケットをラップする必要があります。

NSString* myString = [[@"Hello" and: @" world"] and: @" again"];
于 2012-07-03T22:36:29.943 に答える
8

短くする唯一の方法は、ポイントc = [a stringByAppendingString: b]の周りでオートコンプリートを使用することです。オペレーターは、Objective-C オブジェクトを認識しない C の一部ですst+

于 2009-02-04T07:25:32.113 に答える
7
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];
于 2009-06-20T17:38:10.623 に答える
6

このコードを試しました。それは私のために働いています。

NSMutableString * myString=[[NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];
于 2013-05-11T16:38:10.857 に答える
6

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

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

どのエラー。

代わりに alloc とinitWithFormatmethodを使用します。

[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];
于 2014-04-07T11:45:00.340 に答える
4
NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];
于 2016-01-20T13:42:08.703 に答える
4

これは、ロギングを改善するためのものであり、ロギング専用です - dicius の優れた複数引数メソッドに基づいています。Logger クラスを定義し、次のように呼び出します。

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

var 引数を「nil」で終了する必要があることを除けば、ほぼ問題ありませんが、Objective-C ではそれを回避する方法はないと思います。

ロガー.h

@interface Logger : NSObject {
}
+ (void) log: (id) first, ...;
@end

ロガー.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 

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

于 2011-03-23T17:37:16.933 に答える
3

stringWithFormatを試してください:

NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];
于 2012-11-11T18:28:04.673 に答える
3

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

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:@""];
于 2013-05-03T16:40:46.693 に答える
0
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];
于 2013-01-22T04:10:27.317 に答える
0

Chris のアイデアに触発されNSMutableStringて、完璧なマクロの印象を作ります。例外なしで nil 要素の挿入をサポートします。

#import <libextobjc/metamacros.h>

#define STR_CONCAT(...) \
    ({ \
        __auto_type str__ = [NSMutableString string]; \
        metamacro_foreach_cxt(never_use_immediately_str_concatify_,, str__, __VA_ARGS__) \
        (NSString *)str__.copy; \
    })

#define never_use_immediately_str_concatify_(INDEX, CONTEXT, VAR) \
    [CONTEXT appendString:VAR ?: @""];

例:

STR_CONCAT(@"button_bg_", @(count).stringValue, @".png"); 
// button_bg_2.png

必要に応じて、代わりに を使用idして type をパラメーターとして使用できます。[VAR description]NSString

于 2020-10-27T06:26:51.757 に答える