2009-08-30 7 views
31

Có một phương pháp NSString-characterAtIndex: trả về dấu unichar.unichar và NSString - cách hoán đổi cho nhau là như thế nào?

  • (unichar) characterAtIndex: (NSUInteger) chỉ số

Tôi tự hỏi nếu unichar này, mà rõ ràng không phải là một NSString, có thể được chuyển đổi thành một NSString hoặc feeded đến một NSString cho so sánh mục đích?

Và: Có phải NSString nội bộ chỉ bao gồm một mảng các mục unichar không?

Trả lời

63

Bạn có hai lựa chọn: đầu tiên là một phạm trù thêm một phương pháp stringWithUnichar để NSString:

@interface NSString (MNNSStringWithUnichar) 
+ (NSString *) stringWithUnichar: (unichar) value; 
@end 


@implementation NSString (MNNSStringWithUnichar) 

+ (NSString *) stringWithUnichar:(unichar) value { 
    NSString *str = [NSString stringWithFormat: @"%C", value]; 
    return str; 
} 

@end 

Sau đó, gọi nó với

NSString *otherString = @"TestString"; 

NSString *str = [NSString stringWithUnichar:[otherString characterAtIndex:1]]; 

hoặc bạn có thể chỉ trực tiếp đi như thế này:

NSString *str = [NSString stringWithFormat:@"%C",[otherString characterAtIndex:1]]; 

Chọn danh mục nếu bạn muốn sử dụng liên tục hoặc nếu bạn chỉ phải thực hiện việc này một lần , sử dụng ví dụ stringWithFormat !!

Không chắc chắn về bên trong của NSString, nhưng tôi đoán nó có lẽ là gói một

unichar * 

hoặc một mảng của unichars (như C char *)

Một unichar chỉ đơn giản là một giá trị 16 bit được sử dụng để lưu trữ một ký tự. Không giống như một unsigned char mà chỉ là 8 bit, nó có thể giữ nhiều hơn 0-255, do đó, nó có thể giữ unicode ký tự là tốt, đó là 16bits. Một NSString là một (cụm) lớp [es] có chứa một loạt các unichars

EDIT

Dưới đây là một vài bài viết về những gì mọi người nghĩ rằng một NSString là:

http://cocoawithlove.com/2008/08/string-philosophies-char-arrays.html

http://www.reddit.com/r/programming/comments/6v1yw/string_philosophies_char_arrays_stdstring_and/

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

+0

bạn đã quên @ trước "TestString"? – newacct

+0

Tôi biết có điều gì đó không ổn ... cảm ơn! – micmoo

4

Một lựa chọn khác là sử dụng phương pháp lớp:

+ (id)stringWithCharacters:(const unichar *)characters length:(NSUInteger)length; 

Vì vậy, chỉ sử dụng:

yourString = [NSString stringWithCharacters: &yourChar length: 1]; 

Tham số yourChar phải là một con trỏ.

2

NSString thực sự là một cụm lớp.Điều đó có nghĩa là vì nhiều lý do khác nhau bao gồm cả hiệu suất dựa trên nội dung và kích thước và hỗ trợ cầu nối miễn phí cho CFString khi bạn tạo một NSString bạn thực sự có thể nhận được một trong nhiều lớp riêng tư trả về YES cho isKindOf: khi bạn hỏi nó có phải là NSString hay không nó sẽ trả lời tất cả các phương thức trong lớp NSString. Nó giống như một Nghị định thư nhưng tất cả các đối tượng sẽ nói và làm và được NSString trong API công cộng.

Vì tài liệu nêu rõ NSString và CFString, khái niệm này là một mảng UTF16 unichar Nó có thể và sẽ sử dụng một biểu diễn bên trong khác, nơi nó thể hiện lợi thế cho việc triển khai. Thông thường hiệu suất đôi khi kích thước bộ nhớ. Nhưng bạn có thể dựa vào nó cho bạn một mảng C của unichar khi được hỏi hoặc bất cứ điều gì khác API hứa hẹn.

Đã có một thời gian dài để trưởng thành và được tinh chỉnh nội bộ trong gần như mọi bản phát hành.

Trong ngắn hạn, bạn có thể nghĩ về nó như được hỗ trợ bởi một mảng UTF16 unichar phần lớn phù hợp với mô tả của một chuỗi hợp lý trong tiêu chuẩn Unicode. Nhưng điều cần lưu ý là bạn thực sự không cần phải lo lắng những gì bên trong, chỉ những gì nó nói với bạn là bên trong.

Đây là một trong những triển khai tốt nhất của Unicode. Nếu bạn muốn có bức tranh đầy đủ hơn về cách thức hoạt động, bạn có thể xem (hầu hết) nguồn của CFString tại opensource.apple.com Đó là C và Core Foundation (hướng đối tượng C) và được cách điệu khá, vì vậy đừng mong đợi hiểu tất cả cùng một lúc.

NSString và CFString không có phương thức trả lại và tạo từ unichar. Hầu hết mọi người không nên cần hầu hết thời gian. Nếu bạn làm, hãy cẩn thận, chuẩn bị sẵn sàng để đọc rất nhiều và phạm sai lầm ngây thơ. Unicode là một chủ đề lớn. Xử lý nó một cách chính xác là một khoa học và một nghệ thuật ở cấp độ đó. Đó là một trong những lý do cho NSString. Nó xử lý rất nhiều thứ khó khăn để bạn không phải thường xuyên, trừ khi bạn muốn hoặc cần.