2008-12-21 40 views
61

Tôi cố gắng sử dụng stringWithFormat để đặt giá trị số trên thuộc tính văn bản của nhãn nhưng mã sau không hoạt động. Tôi không thể cast int để NSString. Tôi đã hy vọng rằng phương thức này sẽ biết cách tự động chuyển đổi một int thành NSString.Tôi nên chuyển một int vào stringWithFormat như thế nào?

Tôi cần làm gì ở đây?

- (IBAction) increment: (id) sender 
{ 
    int count = 1; 
    label.text = [NSString stringWithFormat:@"%@", count]; 
} 

Trả lời

122

Làm điều này:

label.text = [NSString stringWithFormat:@"%d", count]; 
+8

này tạo ra một cảnh báo khi biên dịch cho các thiết bị 64 bit trong đó 'int' thực sự là một' long'. – devios1

24

Bạn muốn sử dụng %d hoặc %i cho số nguyên. %@ được sử dụng cho các đối tượng.

Cần lưu ý rằng mã sau đây sẽ thực hiện cùng một tác vụ và rõ ràng hơn nhiều.

label.intValue = count; 
45

Hãy nhớ rằng @ "% d" sẽ chỉ hoạt động trên 32 bit. Khi bạn bắt đầu sử dụng NSInteger để tương thích nếu bạn đã biên dịch cho nền tảng 64 bit, bạn nên sử dụng @ "% ld" làm trình định dạng định dạng của mình.

+1

Sử dụng '% ld' khi biên dịch cho thiết bị 32 bit hiện tạo cảnh báo. Cách nào an toàn hơn? Sử dụng '% ld' với 32 bit hoặc sử dụng'% d' với 64? – devios1

+1

Nevermind Tôi thấy ghi chú của bút chì về việc đúc thành 'long' trước. Điều đó làm các trick và bây giờ biên dịch cho một trong hai mục tiêu mà không có một cảnh báo! – devios1

13

Và đối với giá trị hài hước:

label.text = [NSString stringWithFormat:@"%@", [NSNumber numberWithInt:count]]; 

(Mặc dù nó có thể hữu ích nếu một ngày bạn đang làm việc với NSNumber của)

+3

Hoặc sử dụng cú pháp và mục tiêu hiện đại-c: [NSString stringWithFormat: @ "% @", @ (count)] –

37

Marc Charbonneau đã viết:

Hãy ghi nhớ rằng @ "% d" sẽ chỉ hoạt động trên 32 bit. Khi bạn bắt đầu sử dụng NSInteger để tương thích nếu bạn đã biên dịch cho nền tảng 64 bit, bạn nên sử dụng @ "% ld" làm trình định dạng định dạng của mình.

Thú vị, cảm ơn mẹo, tôi đã sử dụng @ "% d" với số NSInteger s!

Các tài liệu SDK cũng khuyến cáo để cast NSInteger để long trong trường hợp này (để phù hợp với @ "% ld"), ví dụ:

NSInteger i = 42; 
label.text = [NSString stringWithFormat:@"%ld", (long)i]; 

Nguồn: String Programming Guide for Cocoa - String Format Specifiers (Yêu cầu đăng ký phát triển iPhone)

1

Đoạn trích bạn đã đăng chỉ là mẫu để hiển thị những gì bạn đang cố gắng làm?

Lý do tôi hỏi là bạn đã đặt tên phương thức increment, nhưng dường như bạn đang sử dụng điều đó để đặt giá trị của nhãn văn bản, thay vì tăng giá trị.

Nếu bạn đang cố gắng làm điều gì đó phức tạp hơn - chẳng hạn như đặt giá trị số nguyên và có nhãn hiển thị giá trị này, bạn có thể xem xét sử dụng các ràng buộc. ví dụ:

Bạn khai báo thuộc tính count và hành động increment đặt giá trị này thành bất kỳ thứ gì, và sau đó bằng IB, bạn ràng buộc văn bản của nhãn với giá trị count. Miễn là bạn tuân theo Mã hóa giá trị khóa (KVC) với count, bạn không phải viết bất kỳ mã nào để cập nhật hiển thị nhãn. Và từ quan điểm thiết kế, bạn có khớp nối lỏng lẻo hơn.

1

Đừng quên cho long long int:

long long int id = [obj.id longLongValue]; 
[NSString stringWithFormat:@"this is my id: %lld", id] 
0
label.text = [NSString stringWithFormat:@"%d", XYZ]; 

//result: label.text = XYZ 
//use %d for int values 
4

Để có 32-bit và 64-bit an toàn, sử dụng một trong những Boxed Expressions:

label.text = [NSString stringWithFormat:@"%@", @(count).stringValue]; 
0
NSString * formattedname; 
NSString * firstname; 
NSString * middlename; 
NSString * lastname; 

firstname = @"My First Name"; 
middlename = @"My Middle Name"; 
lastname = @"My Last Name"; 

formattedname = [NSString stringWithFormat:@"My Full Name: %@ %@ %@", firstname, middlename, lastname]; 
NSLog(@"\n\nHere is the Formatted Name:\n%@\n\n", formattedname); 

/* 
Result: 
Here is the Formatted Name: 
My Full Name: My First Name My Middle Name My Last Name 
*/ 
Các vấn đề liên quan