2010-04-14 25 views
5

Tôi đang làm việc thông qua các podcast trên iPhone của Stanford và có một số câu hỏi cơ bản.Cú pháp mục tiêu-C cơ bản: "% @"?

Đầu tiên: tại sao không có nối chuỗi dễ dàng? (hoặc tôi chỉ thiếu nó?)

Tôi cần trợ giúp với NSLog bên dưới và không biết nó đang làm gì (phần% @). Bạn chỉ cần thay thế những người ở bất cứ nơi nào bạn cần nối, và sau đó phân tách các giá trị ở cuối?

NSString *path = @"~"; 
NSString *absolutePath = [path stringByExpandingTildeInPath]; 

NSLog(@"My home folder is at '%@'", absolutePath); 

trong khi với bất kỳ ngôn ngữ lập trình khác tôi muốn đã thực hiện nó như thế này:

NSLog(@"My home folder is at " + absolutePath); 

Cảm ơn! (Ngoài ra, bất kỳ hướng dẫn/tham khảo tốt nào cho người quen thuộc với cú pháp kiểu Java/C#/etc chuyển sang Objective-C?)

+1

tại sao không có nối chuỗi dễ dàng? '[@" foo "stringByAppendingString: @" bar "]'. Vâng thật đấy. Bạn cũng có thể xem các tài liệu cho 'NSMutableString' giúp một chút. –

+0

Bạn có thực sự nghĩ rằng đó là "dễ" so với "foo" + "bar" không? Nhưng đó có phải là cách tốt hơn để làm điều đó hơn cách tiếp cận '% @' tôi đã làm không? – cksubs

+1

'stringByAppendingString' làm cho mục đích rõ ràng hơn nhiều so với quá tải' + '. Hoặc là nó '.' để nối? Về mặt đó, nó dễ dàng hơn việc sử dụng toán tử bị quá tải sai. Bên cạnh đó, điều gì sẽ xảy ra nếu bạn cố gắng nối thêm một số nguyên vào một chuỗi? Ví dụ. '" foo "+ 6'. Điều gì về phụ thêm một chuỗi vào một số nguyên? Sử dụng 'stringByAppendingString' có nghĩa là tôi không phải suy nghĩ về nó. Có lẽ bạn không có nghĩa là * dễ dàng hơn * nhiều như * lazier *. – Duncan

Trả lời

13

%@ là một giữ chỗ trong một chuỗi định dạng, cho một ví dụ NSString.

Khi bạn làm điều gì đó như:

NSLog(@"My home folder is at '%@'", absolutePath); 

Bạn đang nói NSLog để thay thế %@ giữ chỗ với giá trị chuỗi absolutePath.

Tương tự như vậy, nếu bạn đặt nhiều placeholders, bạn có thể chỉ định nhiều giá trị để thay thế những placeholders như thế này:

NSString *absolutePath = @"/home/whatever"; 
NSLog(@"My home #%d folder is at '%@'", 5, absolutePath); 

Sẽ in:

nhà của tôi # 5 là/home/bất cứ điều gì

Một cách dễ dàng để làm nối chuỗi:

NSString *s1 = @"Hello, "; 
NSString *s2 = @"world."; 
NSString *s = [NSString stringWithFormat:@"%@%@", s1, s2]; 
// s will be "Hello, world." 

Bạn không thể có + ký làm toán tử nối chuỗi, vì không có quá tải hoạt động trong Mục tiêu-C.

Hy vọng điều đó sẽ hữu ích.

+0

Tuyệt vời, cảm ơn lời giải thích rõ ràng và đơn giản. Đối với ví dụ của tôi, nó sẽ là tốt hơn ("nhiều khách quan-C-như") để làm điều đó thông qua một giữ chỗ hoặc thông qua nối chuỗi? – cksubs

+2

Bộ định dạng chuỗi có thể in các loại khác ngoài các đối tượng Objective-C, chẳng hạn như số nguyên ('% i'), tăng gấp đôi ('% f'), chuỗi C ('% s') v.v. Bạn không thể làm điều này với các toán tử nối. Các định dạng chuỗi định dạng đến từ C và được sử dụng trong các hàm như 'printf()' cho đầu ra. Cú pháp '% @' là một sự bổ sung Objective-C đối với các định dạng chuỗi định dạng C hiện có để in đầu ra của phương thức '-description' của một đối tượng Objective-C. –

+0

Tôi sẽ đích thân sử dụng trình giữ chỗ. Nhưng nó không phải là sai nếu bạn làm điều đó với chuỗi nối ... :-) –

4

Đó là string format specifier. Về cơ bản nó cho phép bạn chỉ định một trình giữ chỗ trong chuỗi và các giá trị được chèn vào vị trí của trình giữ chỗ. Liên kết tôi tham chiếu ở trên liệt kê các ký hiệu khác nhau cho trình giữ chỗ và định dạng cụ thể của từng trình giữ chỗ.

Nó giống như String.Format phương pháp C# 's:

NSLog(String.Format("My home folder is at '{0}'", absolutePath)); 
2

Bạn có thể sử dụng để làm NSString +stringWithFormat nối:

 
NSString* a = // ... 
NSString* b = // ... 
NSString* a_concatenated_with_b = [NSString stringWithFormat:@"%@%@",a,b]; 

Lý do cho "% @" là định dạng chuỗi là dựa tắt của và mở rộng printf format strings syntax. Các hàm này lấy số lượng đối số thay đổi và bất kỳ thứ gì bắt đầu bằng dấu phần trăm (%) được hiểu là một trình giữ chỗ. Các ký tự tiếp theo xác định loại người giữ chỗ.Printf tiêu chuẩn không sử dụng "% @" và vì "@" là biểu tượng thường được sử dụng cho những thứ mà Objective-C thêm vào ngôn ngữ C, nên có nghĩa là "@" sẽ tượng trưng cho "đối tượng Objective-C" .

Không có kết nối tự động bằng dấu cộng (+), vì NSString * là kiểu con trỏ, và Objective-C là một siêu lớn của C, và do đó, thêm vào đối tượng NSString * thực hiện thao tác con trỏ . Mục tiêu-C không có bất kỳ tính năng quá tải toán tử nào như trong ngôn ngữ C++.

0

Ngoài ra, %@ là khá linh hoạt, vì nó thực sự chèn kết quả của phương pháp mô tả của đối số vào chuỗi kết quả. Đối với NSString, đó là giá trị của chuỗi, các lớp khác có thể cung cấp phần ghi đè hữu ích. Tương tự như toString trong Java, ví dụ.

Các vấn đề liên quan