2009-08-30 16 views
31

Istnieje NSString metoda -characterAtIndex:, która zwraca unichar.unichar i NSString - jak wymienne są te?

  • (unichar) characterAtIndex (NSUInteger) indeks

Ciekawe, jeśli to unichar, co oczywiście nie jest NSString można przekształcić w NSString lub dostarczano do NSString dla porównując cele?

I: Czy wewnętrznie składa się z szeregu elementów unichar?

Odpowiedz

63

Masz dwie opcje: pierwsza to kategorii dodanie metody stringWithUnichar do 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 

następnie wywołać ją z

NSString *otherString = @"TestString"; 

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

lub może po prostu przejść bezpośrednio tak:

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

Wybierz kategorię, jeśli chcesz jej użyć wielokrotnie lub jeśli chcesz zrobić to tylko raz , użyj przykładu stringWithFormat !!

Nie jestem pewien co do wewnętrznych części NSString, ale ja myślę, że to jest prawdopodobnie owijania

unichar * 

lub tablicą unichars (jak C char *)

unichar jest po prostu 16-bitowa wartość, która służy do przechowywania postaci. W przeciwieństwie do niepodpisanego znaku, który ma tylko 8 bitów, może zawierać więcej niż 0-255, więc może również przechowywać znaki unicode, które mają 16 bitów. NSString jest (klaster) Klasa [es], który zawiera tablicę unichars

EDIT

Oto kilka artykułów o tym, co ludzie myślą, NSString jest:

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

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

Nadzieję, że pomaga!

+0

zapomniałeś @ przed "TestString"? – newacct

+0

Wiedziałem, że coś nie wygląda dobrze ... dzięki! – micmoo

4

Inną opcją jest użycie metody klasy:

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

Więc po prostu przy użyciu:

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

Parametr yourChar musi być wskaźnikiem.

2

NSString to tak naprawdę klaster klasy.Oznacza to, że z różnych powodów, w tym wydajności opartej na treści i rozmiarze oraz w celu wspierania bezpłatnego łączenia się z CFString podczas tworzenia NSStringa, faktycznie można uzyskać jedną z wielu klas prywatnych, które zwracają TAK do postaciKindOf: gdy pytasz, czy jest to NSString i będzie odpowiadał wszystkim metodom w klasie NSString. To jest jak protokół, ale wszystkie obiekty będą mówić i robić i będą NSString w publicznym interfejsie API.

Ponieważ dokumentacja mówi o NSString i CFString, jest konceptualnie tablicą UTF16 unichar Może ona i będzie używać innej reprezentacji wewnętrznej, jeśli stanowi zaletę dla implementacji. Zwykle wydajność czasami rozmiar pamięci. Ale możesz na nim polegać, dając ci tablicę C z unichar, gdy zostaniesz zapytany lub cokolwiek innego, co obiecuje API.

Długo trwało dojrzewanie i jest modyfikowana wewnętrznie w niemal każdym wydaniu.

W skrócie tak, możesz myśleć o tym, że jest wspierany przez tablicę unicharów UTF16 w dużej mierze pasującą do opisu ciągu logicznego w standardzie Unicode. Ale pamiętajcie, że naprawdę nie powinniście martwić się tym, co jest w środku, tylko to, co mówi wam, że jest w środku.

To jedna z najlepszych implementacji Unicode. Jeśli chcesz uzyskać pełniejszy obraz tego, jak to działa, możesz spojrzeć na (większość) źródła CFString na opensource.apple.com To C i Core Foundation (obiektowo zorientowany C) i dość stylizowany, więc nie spodziewaj się zrozumieć to wszystko naraz.

NSString i CFString mają metody zwracania i tworzenia z unichar. Większość ludzi nie powinna ich potrzebować przez większość czasu. Jeśli tak, bądź ostrożny, bądź gotów dużo czytać i popełniać naiwne błędy. Unicode to duży temat. Prawidłowe obchodzenie się z nim to nauka i sztuka na tym poziomie. To jeden z powodów NSString. Obsługuje wiele trudnych rzeczy, więc nie musisz tak często, chyba że chcesz lub potrzebujesz.