Các phím tắt trong Objective-C để nối NSStrings


1129

Có bất kỳ phím tắt nào để ( stringByAppendingString:) nối chuỗi trong Objective-C hoặc các phím tắt để làm việc NSStringchung không?

Ví dụ: tôi muốn thực hiện:

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

một cái gì đó giống như:

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

4
Tôi chỉ muốn đề xuất '@ +' với tư cách là nhà điều hành kết nối. Tôi sẽ mong đợi điều này trong bản cập nhật tiếp theo cho Objective-C,
kthx Bạch

44
@NicolasMiari Đây không phải là tính năng duy nhất mà Objective-C thiếu. Có hàng tá người khác. Trích dẫn từ liên kết Jordão đã đăng: "Objective-C là, nói thẳng ra, một ngôn ngữ nguyên thủy. So sánh nó với bất kỳ ngôn ngữ hiện đại nào và bạn nhanh chóng thấy nó thiếu." Tôi đồng ý. Mục tiêu-C (đầu những năm 1980) là C (đầu những năm 1970) với việc bổ sung một loại OOP rất đơn giản và không an toàn. Không sao, nhưng so với Java hoặc C #, nó cảm thấy rất lỗi thời.
jcsahnwaldt nói GoFundMonica

5
@NicolasMiari: Ngôn ngữ được giải thích? C # và Java là các ngôn ngữ được biên dịch. Được biên dịch thành mã byte, sau đó được biên dịch lại thành mã máy.
Joren

3
Mọi thứ đã được thay đổi ngay bây giờ: Swift (ngôn ngữ mới của apple) đơn giản hơn
Pradeep

6
Về "an toàn kiểu", tôi nghĩ đó là một vấn đề về phong cách. Đối với ai đó đến từ C # / C ++, việc có các mảng đối tượng không đồng nhất có thể có vẻ kỳ lạ, nhưng đối với ai đó quen với Objective-C / Ca cao, đó là một hình thức năng động và tự do; đó là một lợi thế miễn là bạn biết bạn đang làm gì Giống như hầu hết mọi thứ về C mà các lập trình viên trẻ tuổi bash những ngày này ...
Nicolas Miari

Câu trả lời:


616

Hai câu trả lời tôi có thể nghĩ đến ... không có gì đặc biệt dễ chịu bằng việc chỉ có một toán tử ghép.

Thứ nhất, sử dụng một NSMutableString, trong đó có một appendStringphương pháp, loại bỏ một số các nhu cầu cho các chuỗi tạm thời thêm.

Thứ hai, sử dụng một NSArrayđể nối thông qua componentsJoinedByStringphương thức.


34
Mặc dù tùy chọn khác có nhiều upvote, tôi nghĩ đây là câu trả lời tốt nhất nếu bạn không biết tất cả các chuỗi của mình khi xây dựng. Mỗi khi bạn nối một chuỗi, bạn đang tạo ra rất nhiều chi phí. Sử dụng một chuỗi có thể thay đổi sẽ loại bỏ vấn đề đó.
Eli

22
Đồng ý +1 w @Eli. Đây thường là những giải pháp tốt nhất. NSArray -componentsJoinedByString có thể được thực hiện trong một dòng duy nhất khá tốt: string = [[NSArray mảngWithObjects: @ "This", "Is", "A", "Test", nil] thành phầnJoinedByString: @ ""];
Rob Napier

4
+1 cho câu trả lời này. [NSMutableString appendString]thân thiện với bộ nhớ hơn [NSString stringByAppendingStrings].
Pierre-David Belanger

2
@RobNapier: Bây giờ với cú pháp mảng mới, nó thậm chí còn tốt hơn.
Amogh Talpallikar

27
Các [NSString stringWithFormat:@"%@/%@/%@", three, two, one];kỹ thuật có vẻ thanh lịch nhất. Nó nên là câu trả lời được lựa chọn.
ekillaby

1129

Một lựa chọn:

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

Một lựa chọn khác:

Tôi đoán bạn không hài lòng với nhiều phụ lục (a + b + c + d), trong trường hợp đó bạn có thể làm:

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

sử dụng một cái gì đó như

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

8
@pablasso Đồng ý. Phương pháp Util khá xấu xí. Nếu bạn muốn một thứ như vậy, nó nên được thực hiện dưới dạng danh mục NSString với tên như + stringByAppendingStrings :. Ngay cả một hàm thẳng có tên như NSStringForAppendsStrings (...) sẽ tốt hơn một phương thức tĩnh trong một lớp như Util (bất cứ thứ gì có "Util" trong tên đều có khả năng kém). Chức năng này cũng được triển khai tốt hơn với NSMutableString và -appendString để tránh tạo ra một bộ NSStrings tự động tạm thời không bị ràng buộc.
Rob Napier

1
Với các chuỗi lớn, điều này có thể lãng phí bộ nhớ. Đề xuất là một cái gì đó giống như StringBuilder trong các ngôn ngữ lập trình thực. Sau đó, bạn có thể chỉ ra bao nhiêu bộ nhớ là cần thiết trước khi bạn thực sự bắt đầu nối thêm. Cách tiếp cận trên có thể được tái cấu trúc để làm điều này. Tuy nhiên, sẽ tốt hơn nếu tạo một đối tượng StringBuilder vì điều này sẽ cứu người dùng của nó khỏi phải theo dõi danh sách tất cả các chuỗi họ cần kết hợp.
George

Làm thế nào để bạn nhập Util? IDE này thật khó chịu (không đề xuất "nhập một cái gì đó. Sử dụng" như trên nhật thực và tôi không thấy đề cập đến "Util" ở bất cứ đâu. Đây có phải là một lớp tôi phải tự viết mã không?
Gubatron

stringWithFormat không chỉ rất thanh lịch, mà còn mạnh mẽ hơn nhiều. Bạn sử dụng nó với @ "% @% @" để nối hai chuỗi, @ "% @% @% @" để nối ba chuỗi, nhưng bạn có thể đặt bất kỳ ký tự phụ nào bên trong, in số, sắp xếp lại các tham số nếu bạn thích, v.v. . Chuỗi định dạng có thể được bản địa hóa, làm cho nó mạnh hơn gấp mười lần. Chuỗi nối là dành cho người mới bắt đầu.
gnasher729

150

Nếu bạn có 2 chữ NSString , bạn cũng có thể làm điều này:

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

Điều đó cũng hữu ích khi tham gia #defines:

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

Thưởng thức.


13
@ CristiBăluță :) Nhưng điều này chỉ hoạt động với các chữ không phải với các trường hợp NSString được tạo động.
Julian Fahrenkrug

9
Bạn thực sự không cần @s trên chuỗi sau lần đầu tiên. @"I" " really" " enjoy"...
Kevin

Có lẽ bạn nên đặt STRINGA và STRINGB trong ngoặc đơn, nếu không bạn có thể nhận được kết quả kỳ lạ khi macro được giải quyết. #define THAM GIA (STRINGA STRINGB)
digoo doo

@JohannesFahrenkrug Vậy tại sao điều này NSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);";không hoạt động? Tôi đang gặp Expected '@' in programlỗi :(
Vagif

@Vagif được TABLE_NAMEđịnh nghĩa như thế nào ?
Julian Fahrenkrug

75

Tôi tiếp tục quay lại bài đăng này và luôn luôn sắp xếp các câu trả lời để tìm giải pháp đơn giản này hoạt động với nhiều biến số cần thiết:

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

Ví dụ:

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

48

Tạo một phương thức:

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

Sau đó, trong bất kỳ chức năng nào bạn cần, hãy đặt chuỗi hoặc trường văn bản của bạn hoặc bất cứ thứ gì vào giá trị trả về của hàm này.

Hoặc, để tạo một lối tắt, chuyển đổi NSString thành chuỗi C ++ và sử dụng '+' ở đó.


Đây là giải pháp đơn giản nhất.
GeneCode

44

Chà, vì dấu hai chấm là một loại ký hiệu đặc biệt, nhưng một phần của chữ ký phương thức, có thể mở rộng NSStringdanh mục với để thêm kiểu kết nối chuỗi không thành ngữ này :

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

Bạn có thể định nghĩa bao nhiêu đối số được phân tách bằng dấu hai chấm mà bạn thấy hữu ích ... ;-)

Để có một biện pháp tốt, tôi cũng đã thêm concat:các đối số biến có nildanh sách các chuỗi kết thúc.

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

20
Tôi đã đánh giá thấp điều này một năm trước bởi vì nó không phải là một câu trả lời hay. Để đối phó với việc ghép một số lượng lớn các chuỗi, việc triển khai của Palimondo yêu cầu thực hiện một số lượng lớn các phương thức trông rất giống nhau hoặc gọi các phương thức đó nhiều lần, dẫn đến một đoạn mã lớn về cơ bản chỉ là nối các chuỗi. Sử dụng phương pháp này, bạn không nhận được bất kỳ lợi ích nào trong một đơn giản stringWithFormat:. Chưa kể việc thiếu các tham số được đặt tên không chỉ không chuẩn mà còn khó hiểu.
FreeAsInBeer

2
Người hỏi ban đầu đã đề cập stringByAppendingString, và anh ta không bao giờ nói bất cứ điều gì về việc sử dụng nhiều hơn hai đối số. Tôi thích câu trả lời này tốt hơn câu trả lời. Nó khá thông minh.
sudo

32

Sử dụng stringByAppendingString:theo cách này:

NSString *string1, *string2, *result;

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

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

HOẶC LÀ

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

34
Bạn có nhận ra rằng bạn đang đề xuất chính xác những gì anh ấy không muốn làm, phải không?
SilverSideDown

rò rỉ quá nhiều!
RamGrg

30

Macro:

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

Các trường hợp thử nghiệm:

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

Macro thay thế: (nếu bạn muốn thực thi số lượng đối số tối thiểu)

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

2
Không kiểm tra câu hỏi này trong một thời gian, nhưng tôi đang nghiêng về việc chấp nhận đây là câu trả lời đúng sau nhiều năm!
typeoneerror

1
Điều này cũng được cho là có hành vi tốt hơn so -[NSString stringByAppendingString:]với trường hợp sử dụng này - với trường hợp trước đây bạn sẽ có một ngoại lệ nếu đối số là nilnhưng không phải nếu người nhận là. Vì vậy, tỷ lệ cược 50% có thể hiểu được về một lỗi trong bộ nạp chuỗi của bạn không thành công và 50% cho một ngoại lệ. Với stringConcatbạn được đảm bảo một ngoại lệ trên bất kỳ nil, bất cứ nơi nào trong danh sách. Mà ít nhất là dễ dự đoán hơn.
Tommy

27

Khi xây dựng các yêu cầu cho các dịch vụ web, tôi thấy việc thực hiện một số thứ như sau rất dễ dàng và làm cho việc ghép nối có thể đọc được trong 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>"
};

Đối với một noob khách quan, bạn có thể giải thích cú pháp này đang làm gì không? Đây có phải là tạo ra một chuỗi các chuỗi và tham gia chúng bằng cách nào đó? Một tài liệu tham khảo cho bất kỳ tài liệu cũng sẽ được mát mẻ.
Norman H

2
@NormanH: Đây thực sự là một phần của ngôn ngữ C. Sau khi đào một chút, tôi đã có thể tìm thấy thứ này . Nó nêu trong giai đoạn "Nối chuỗi": Tất cả các chuỗi ký tự và chuỗi rộng liền kề được nối với nhau. Ví dụ: "Chuỗi" "nối chuỗi" trở thành "Nối chuỗi".
FreeAsInBeer

27

Phím tắt bằng cách tạo macro AppendString (AS) ...

#define AS (A, B) [(A) chuỗiByAppendingString: (B)]
NSString * myString = @ "Đây"; NSString * test = AS (myString, @ "chỉ là thử nghiệm");

Ghi chú:

Nếu sử dụng một macro, tất nhiên chỉ cần làm điều đó với các đối số dao động, xem câu trả lời của EthanB.


Mát mẻ! Tôi vẫn nghĩ rằng Util ở trên là một giải pháp thanh lịch hơn nhiều; bạn chỉ có thể nối thêm một chuỗi với macro này, phải không?
typeoneerror

1
Đúng, macro AS ở trên sẽ nối thêm một dòng mã. Nếu nhiều phụ lục là một nhu cầu chung, thì có thể tạo ra nhiều macro hơn. Ví dụ: một macro để nối thêm hai chuỗi: <pre> #define A2S (A, B, C) [[(A) stringByAppendingString: (B)] stringByAppendingString: (C)] </ pre>

2
Hoặc, chỉ cần rút ngắn cách gõ cần thiết với macro như "#define AS stringByAppendingString", sau đó chỉ sử dụng "AS" trong đó bạn thường gõ "stringByAppendingString" và tận hưởng nhiều phụ lục trên mỗi dòng mã.

15
Vấn đề với các macro này là chúng làm suy yếu một trong những mục tiêu chính của Objective-C, đó là khả năng đọc. Nó cực kỳ không rõ "AS" làm gì. Tiết kiệm một vài tổ hợp phím (hầu hết được xử lý với tự động hoàn thành) với chi phí dễ đọc ít khi là một sự đánh đổi tốt. Có các trường hợp ngoại lệ (cú pháp @ "" dễ đọc hơn nhiều so với việc phải sử dụng + stringWithUTF8String: mọi lúc), nhưng mục tiêu vẫn phải là dễ đọc hơn là chỉ đơn giản là ngắn gọn. Bạn viết một lần, nhưng bạn gỡ lỗi mãi mãi.
Rob Napier

Xin chào Rob - Tôi không thể đồng ý với bạn trong việc này. Chắc chắn, "NHƯ" là một tên xấu. Nó nên được đặt tên có lẽ là "CAT".
Fattie

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

11

Đây là một cách đơn giản, sử dụng cú pháp mảng mới:

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

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

Sau một vài năm với Objective CI nghĩ rằng đây là cách tốt nhất để làm việc với Objective C để đạt được những gì bạn đang cố gắng đạt được.

Bắt đầu nhập "N" trong ứng dụng Xcode của bạn và nó tự động hoàn thành "NSString". khóa trong "str" ​​và nó tự động hoàn thành "stringByAppendingString". Vì vậy, tổ hợp phím khá hạn chế.

Khi bạn đã nhấn phím "@" và lập bảng quy trình viết mã có thể đọc được không còn trở thành vấn đề nữa. Nó chỉ là một vấn đề thích nghi.


Bạn có nhận ra rằng bạn đang đề xuất chính xác những gì anh ấy không muốn làm, phải không?
Người dùng không phải là người dùng

8

Cách duy nhất để thực hiện c = [a stringByAppendingString: b]bất kỳ ngắn hơn là sử dụng tự động hoàn thành tại stđiểm. Các +nhà điều hành là một phần của C, mà không biết về các đối tượng Objective-C.


Bạn có nhận ra rằng bạn đang đề xuất chính xác những gì anh ấy không muốn làm, phải không? Ít nhất, một #definecó thể được sử dụng để rút ngắn nó.
Người dùng không phải là người dùng

8

Cách rút ngắn stringByAppendingStringvà sử dụng #define :

#define and stringByAppendingString

Do đó, bạn sẽ sử dụng:

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

Vấn đề là nó chỉ hoạt động cho hai chuỗi, bạn bắt buộc phải bọc thêm dấu ngoặc để có thêm phụ lục:

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

XCode7 sẽ không cho phép bạn sử dụng tùy chọn này nữa - nói "và" là một từ dành riêng. Tuy nhiên, thay vào đó, bạn có thể sử dụng "cat" cho conCATenation. Tôi đã làm và giải pháp của bạn hoạt động hoàn hảo và cực kỳ đơn giản.
Volomike

8
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];

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

6

Tôi đã thử mã này. nó làm việc cho tôi

NSMutableString * myString=[[NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];

2
Đây là sự lạm dụng tồi tệ nhất của NSMutableString từ trước đến nay. Điểm chung của NSMutableString là bạn không cần các phương thức tạo chuỗi tự động nhưng có thể tự sửa đổi chuỗi.
gnasher729

Đồng ý. Ít nhất là sử dụng appendString:nếu bạn đang sử dụng a NSMutableString.
Người dùng không phải là người dùng

6

Đã thử sau đây trong lldbkhung

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

lỗi nào.

thay vì sử dụng phân bổ và initWithFormatphương thức:

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

1
... Ước gì tôi có đủ danh tiếng để bình luận nhưng hy vọng điều này sẽ giúp được người khác.
Anthony De Souza

4

Điều này là để ghi nhật ký tốt hơn và chỉ ghi nhật ký - dựa trên phương pháp nhiều đối số xuất sắc của dicius. Tôi định nghĩa một lớp Logger và gọi nó như vậy:

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

Gần như tốt, ngoại trừ việc kết thúc var args bằng "nil" nhưng tôi cho rằng không có cách nào khác trong 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 

Để chỉ concat chuỗi, tôi muốn xác định một loại trên NSString và thêm một phương pháp tĩnh (+) concatenate với nó rằng vẻ bề ngoài giống hệt như phương pháp ghi ở trên ngoại trừ nó trả về chuỗi. Đó là trên NSString vì đây là phương thức chuỗi và nó tĩnh vì bạn muốn tạo một chuỗi mới từ chuỗi 1-N, không gọi nó trên bất kỳ một chuỗi nào là một phần của phần bổ sung.


4
NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];

3

Hãy thử chuỗiWithFormat:

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

Tại sao điều này có 2 downvote? Có phải bởi vì điều này đã được đề cập trong một câu trả lời khác?
Reimius

3

Khi làm việc với các chuỗi thường tôi thấy việc tạo tệp nguồn ObjC ++ dễ dàng hơn, sau đó tôi có thể nối chuỗi std :: bằng cách sử dụng phương thức thứ hai được hiển thị trong câu hỏi.

std::string stdstr = [nsstr UTF8String];

//easier to read and more portable string manipulation goes here...

NSString* nsstr = [NSString stringWithUTF8String:stdstr.c_str()];

3

Phương pháp ưa thích của tôi là:

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

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

Bạn có thể đạt được nó bằng cách thêm phương thức nối vào NSArray với một danh mục:

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

@[]Đó là định nghĩa ngắn cho NSArray, tôi nghĩ đây là phương pháp nhanh nhất để nối chuỗi.

Nếu bạn không muốn sử dụng danh mục, hãy sử dụng trực tiếp componentsJoinedByString:phương pháp:

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

3

Bạn có thể sử dụng NSArray như

NSString *string1=@"This"

NSString *string2=@"is just"

NSString *string3=@"a test"  

NSArray *myStrings = [[NSArray alloc] initWithObjects:string1, string2, string3,nil];

NSString *fullLengthString = [myStrings componentsJoinedByString:@" "];

hoặc là

bạn có thể dùng

NSString *imageFullName=[NSString stringWithFormat:@"%@ %@ %@.", string1,string2,string3];

1

Một trong hai định dạng này hoạt động trong XCode7 khi tôi thử nghiệm:

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

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

Vì một số lý do, bạn chỉ cần ký tự toán tử @ trên chuỗi đầu tiên của hỗn hợp.

Tuy nhiên, nó không hoạt động với chèn thay đổi. Vì thế, bạn có thể sử dụng giải pháp cực kỳ đơn giản này ngoại trừ việc sử dụng macro trên "cat" thay vì "và".


Làm thế nào để thực hiện điều này? ví dụ: sTest3 = sTest1 + sTest2;

@ user285594 Đó là điểm của câu hỏi: cú pháp đó không được phép trong Objective-C. Xem các câu trả lời khác.
Người dùng không phải là người dùng

1

Đối với tất cả những người yêu thích Mục tiêu C cần điều này trong Kiểm tra giao diện người dùng:

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


0

Hãy tưởng tượng rằng bạn không biết có bao nhiêu chuỗi ở đó.

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:@", "];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.