Pertanyaan Pintasan di Objective-C untuk menggabungkan NSStrings


Apakah ada jalan pintas ke (stringByAppendingString:) Rangkaian string dalam Objective-C, atau pintasan untuk bekerja dengan NSString secara umum?

Misalnya, saya ingin membuat:

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

sesuatu yang lebih seperti:

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

1050
2018-02-04 06:26


asal


Jawaban:


Dua jawaban yang dapat saya pikirkan ... tidak juga menyenangkan karena hanya memiliki operator penggabungan.

Pertama, gunakan an NSMutableString, yang memiliki appendString metode, menghapus beberapa kebutuhan untuk string temp tambahan.

Kedua, gunakan an NSArray untuk menggabungkan melalui componentsJoinedByString metode.


580
2018-02-04 06:44



Sebuah pilihan:

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

Pilihan lain:

Saya kira Anda tidak senang dengan beberapa tambahan (a + b + c + d), dalam hal ini Anda bisa melakukan:

NSLog(@"%@", [Util append:one, @" ", two, nil]); // "one two"
NSLog(@"%@", [Util append:three, @"/", two, @"/", one, nil]); // three/two/one

menggunakan sesuatu seperti

+ (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;
}

1064
2018-02-04 07:53



Jika Anda memiliki 2 NSString literal, Anda juga bisa melakukan ini:

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

Itu juga berguna untuk bergabung dengan #defines:

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

Nikmati.


140
2018-03-17 11:59



Saya terus kembali ke posting ini dan selalu berakhir memilah-milah jawaban untuk menemukan solusi sederhana ini yang bekerja dengan banyak variabel yang diperlukan:

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

Sebagai contoh:

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

67
2017-08-11 06:51



Nah, karena usus adalah semacam simbol khusus, tetapi aku s bagian dari tanda tangan metode, adalah mungkin untuk memperluas NSString dengan kategori untuk menambahkan ini tidak idiomatis gaya penggabungan string:

[@"This " : @"feels " : @"almost like " : @"concatenation with operators"];

Anda dapat mendefinisikan banyak argumen yang dipisahkan dengan titik dua saat Anda menemukan manfaat ... ;-)

Untuk ukuran yang baik, saya juga menambahkan concat: dengan argumen variabel yang mengambil nil daftar string yang diakhiri.

//  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);
}

43
2018-03-16 00:41



buat sebuah metode ......

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

Kemudian, dalam fungsi apa pun yang Anda perlukan, atur string Anda atau textfield atau apa pun untuk mengembalikan nilai dari fungsi ini.

Atau apa yang dapat Anda lakukan untuk membuat shortcut adalah mengubah NSString menjadi string c ++ dan menggunakan '+' di sana.

Semoga ini membantu!!!!!


35
2017-10-03 22:29



Gunakan cara ini:

NSString *string1, *string2, *result;

string1 = @"This is ";
string2 = @"my string.";

result = [result stringByAppendingString:string1];
result = [result stringByAppendingString:string2];

ATAU

result = [result stringByAppendingString:@"This is "];
result = [result stringByAppendingString:@"my string."];

32
2017-07-26 16:04



Makro:

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

Uji Kasus:

- (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");
}

Makro alternatif: (jika Anda ingin menegakkan jumlah minimum argumen)

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

29
2018-05-31 17:07