2009-07-21 35 views
16

thể trùng lặp:
How do I concatenate strings in Objective-C?Làm thế nào để ghép chuỗi trong Objective-C (iPhone)?

Thứ nhất, nền tảng là iPhone và label.text thay đổi nhãn hiển thị. Hãy xem xét trường hợp này:

Tôi có một dãy số nguyên. Và tôi muốn hiển thị nó trên màn hình.

Dưới đây là quan điểm của tôi về nó:

-(IBAction) updateText: (id)sender { 
    int a[2]; 
    a[0]=1; 
    a[1]=2; 
    a[2]=3; 
    for (int i=0; i<=10;i++) 
    label.text = [NSString stringByAppendingString: [NSString stringWithFormat: @"%i", a[i]]]; 
} 

Như bạn có thể thấy, tôi khá bối rối. Pls pls giúp tôi ra :(

+0

Một chút trễ nhưng bạn khởi tạo mảng với kích thước 2 để chỉ mục cao nhất sẽ là 1, nhưng bạn đang thực hiện [2] = 3; mà sẽ gây ra lỗi giới hạn. – Jonny

Trả lời

35

Hãy thử điều này:

NSMutableString* theString = [NSMutableString string]; 
for (int i=0; i<=10;i++){ 
    [theString appendString:[NSString stringWithFormat:@"%i ",i]]; 
} 
label.text = theString; 
+0

Điều này chỉ có thể có trong NSMutableString, phải không? Tôi đang bối rối với tất cả các lớp học khác nhau và phương pháp của họ ... Nhưng, thx man. Đây chỉ là những gì tôi cần. :) – r0ach

+0

appendString: chỉ có trong NSMutableString, nhưng một hàm tương tự là stringByAppendingString: trên NSString. –

+1

@TomDalling: Tôi đã sử dụng cách tiếp cận tương tự nhưng 'theString' được khai báo trong tệp .h vì đại biểu trong đó chắp thêm được thực hiện được gọi nhiều lần. Bây giờ, trong trường hợp này tôi nhận được một 'theString' trống. Mọi sửa chữa? –

3

phương pháp khác mà không sử dụng NSMutableString:

NSString* theString = @""; 
for (int i=0; i<=10;i++){ 
    theString = [theString stringByAppendingFormat:@"%i ",i]; 
} 
label.text = theString; 

Dưới đây là một thực hiện đầy đủ (sửa dãy của bạn):

-(IBAction) updateText: (id)sender { 
    int a[3]; 
    a[0]=1; 
    a[1]=2; 
    a[2]=3; 
    NSString *str = @""; 
    for (int i=0; i<3;i++) 
     str = [str stringByAppendingFormat:@"%i ",i]; 
    label.text = str; 
} 

Bạn cũng có thể làm như thế này (ví dụ: nếu bạn muốn có danh sách được phân cách bằng dấu phẩy):

-(IBAction) updateText: (id)sender { 
    int a[3]; 
    a[0]=1; 
    a[1]=2; 
    a[2]=3; 
    NSMutableArray *arr = [NSMutableArray arrayWithCapacity:3]; 
    for (int i=0; i<3;i++) 
     [arr addObject:[NSString stringWithFormat:@"%i",i]]; 

    label.text = [arr componentsJoinedByString:@", "]; 
} 
+1

Trong khi lập trình viên LISP trong tôi thích cách tiếp cận NSString hơn NSMutableString, bạn thực sự phải cẩn thận với tác động bộ nhớ của giải pháp đầu tiên của bạn. Đối với một vòng lặp nhỏ như vậy, nó không phải là một vấn đề lớn, nhưng điều này là O (n^2) trong bộ nhớ và có thể gây ra vấn đề trên iPhone, nơi thậm chí một bộ nhớ ngắn tăng đột biến là một vấn đề. –

+0

Rất đúng. Phương thức mảng tốt hơn nhiều vì lý do này. (Sẽ tốt hơn nếu tôi đã thực hiện [NSMutableArray alloc] và [arr release] ...) Nó cũng cho thêm sự linh hoạt trong chuỗi tham gia mà không phải lo lắng về việc thiếu dấu phẩy hoặc dấu cách khỏi đầu hoặc cuối danh sách. – Benjie

17

Vì bạn đang sử dụng vòng lặp, hãy cẩn thận với cả hai giải pháp của Tom và Benjie. Mỗi người tạo một đối tượng tự động thêm cho mỗi lần lặp. Đối với một vòng lặp nhỏ, đó là tốt, nhưng nếu kích thước của vòng lặp là unbounded hoặc nếu các chuỗi lớn, điều này có thể dẫn đến một bộ nhớ rất lớn tăng đột biến và hiệu suất hit. Đặc biệt trên iPhone, đây chính là loại vòng lặp có thể dẫn đến các vấn đề về bộ nhớ đáng ngạc nhiên do các xung đột bộ nhớ ngắn ngủi.

Giải pháp sau có dung lượng bộ nhớ nhỏ hơn (nó cũng nhanh hơn một chút và mất ít lần nhập hơn). Lưu ý cuộc gọi đến -appendFormat: thay vì -appendString. Điều này tránh tạo chuỗi thứ hai sẽ bị vứt bỏ. Hãy nhớ rằng chuỗi cuối cùng có thêm khoảng trống ở cuối mà bạn có thể muốn loại bỏ. Bạn có thể sửa lỗi đó bằng cách xử lý lần lặp đầu tiên hoặc cuối cùng khác nhau hoặc bằng cách cắt không gian cuối cùng sau vòng lặp.

NSMutableString* theString = [NSMutableString string]; 
for (int i=0; i<=10;i++){ 
    [theString appendFormat:@"%i ",i]; 
} 
label.text = theString; 

Đừng quên [NSArray componentsJoinedByString:]. Trong trường hợp này bạn không có NSArray, nhưng trong các trường hợp phổ biến nơi bạn làm, đây có lẽ là cách tốt nhất để có được những gì bạn đang tìm kiếm.

7
//NSArray *chunks 
string = [chunks componentsJoinedByString: @","]; 
Các vấn đề liên quan