Korzystałem z tego w mojej aplikacji na iPhone'a
if (title == nil) {
// do something
}
ale generuje wyjątek, a konsola pokazuje, że tytuł to „(null)”.
Teraz używam tego:
if (title == nil || [title isKindOfClass:[NSNull class]]) {
//do something
}
Jaka jest różnica i jaki jest najlepszy sposób ustalenia, czy ciąg znaków ma wartość NULL?
ios
objective-c
cocoa-touch
Teo Choong Ping
źródło
źródło
Odpowiedzi:
Jak zauważyli inni, w Cocoa / Objective C istnieje wiele rodzajów „null”. Należy jednak zauważyć, że [tytuł to KindOfClass: [klasa NSNull]] jest bezcelowo złożony, ponieważ [NSNull null] jest udokumentowane jako singleton, więc możesz po prostu sprawdzić równość wskaźnika. Zobacz Tematy dotyczące kakao: Korzystanie z Null .
Tak więc dobrym testem może być:
Zwróć uwagę, jak możesz wykorzystać fakt, że nawet jeśli tytuł jest zerowy, title.length zwróci 0 / zero / fałsz, tj. 0 w tym przypadku, więc nie musisz specjalnie tego robić. Jest to coś, do czego ludzie, którzy są nowi w Celu C, mają trudności z przyzwyczajeniem się, zwłaszcza pochodzącymi z innych języków, w których komunikaty / metody wywołują awarię zerową.
źródło
Map
wartość przedmiotu - która jestnull
w Dart - nie odpowiadanil
aniNULL
w Celu C. Powodem było to, że tak naprawdęNUNull null
nie jestNULL
zerowa. Dziękuję @PeterNLewis!to jest tak proste jak
pamiętaj, że w celu C, jeśli obiekt jest pusty, zwraca 0 jako wartość.
Otrzymasz zarówno ciąg zerowy, jak i ciąg o długości 0.
źródło
object = @"";
lubobject = nil;
)Zapoznaj się z następującymi powiązanymi artykułami na tej stronie:
Myślę, że twój błąd jest związany z czymś innym, ponieważ nie musisz wykonywać dodatkowej kontroli.
Zobacz także powiązane pytanie: Właściwe sprawdzenie kolumny tekstowej nil sqlite
źródło
Przekonałem się, że aby naprawdę to zrobić, musisz zrobić coś podobnego
W przeciwnym razie zdarzają się dziwne sytuacje, w których kontrola nadal omija czek. Nie natknąłem się na taki, który mija
isEqual
i sprawdza długość.źródło
Co z tymi wszystkimi „odpowiedziami dla mnie”? Wszyscy kodujemy w tym samym języku, a zasady są
To będzie działać dla wszystkich. Jeśli dane rozwiązanie „działa tylko dla Ciebie”, to tylko dlatego, że przepływ aplikacji nie zezwala na scenariusz, w którym odwołanie może mieć wartość NULL lub długość łańcucha powinna wynosić 0. Właściwym sposobem na to jest metoda, która będzie obsługiwać co chcesz we wszystkich przypadkach.
źródło
nil
(uwaga: nie „null”), wówczas wysłanie wiadomości, podobnie jaklength
, spowoduje wygenerowanie 0 (lub odpowiedniej wartości 0 dla typu zwracanego przez metodę). To jest reguła języka. Wnil
tym przypadku nie trzeba sprawdzać osobno.Jeśli chcesz przetestować na wszystkich zerowych / pustych obiektach (takich jak puste łańcuchy lub puste tablice / zestawy), możesz użyć następujących opcji:
źródło
Istnieją dwie sytuacje:
Możliwe, że obiekt jest
[NSNull null]
lub jest to niemożliwe.Twoja aplikacja zwykle nie powinna z
[NSNull null];
ciebie korzystać , używaj jej tylko, jeśli chcesz umieścić w tablicy obiekt „ zerowy ” lub użyć go jako wartości słownikowej. A potem powinieneś wiedzieć, które tablice lub słowniki mogą zawierać wartości zerowe, a które nie.Jeśli uważasz, że tablica nigdy nie zawiera
[NSNull null]
wartości, nie sprawdzaj jej. Jeśli istnieje[NSNull null]
, możesz otrzymać wyjątek, ale to jest w porządku: wyjątki Objective-C wskazują na błędy programowania. I masz błąd programowania, który wymaga naprawy poprzez zmianę kodu.Jeśli obiekt może być
[NSNull null]
, to sprawdzasz to po prostu przez testowanie(object == [NSNull null])
. WywołanieisEqual
lub sprawdzenie klasy obiektu to nonsens. Jest tylko jeden[NSNull null]
obiekt, a zwykły stary operator C sprawdza go w jak najprostszy i najbardziej wydajny sposób.Jeśli
NSString
zaznaczysz obiekt, który nie może być[NSNull null]
(ponieważ wiesz, że nie może być[NSNull null]
lub ponieważ właśnie sprawdziłeś, że jest inny niż)[NSNull null]
, musisz zadać sobie pytanie, jak traktować pusty ciąg znaków, czyli taki o długości 0. traktuj tonull
jak łańcuchnil
, a następnie przetestuj(object.length == 0)
. object.length zwróci 0 jeśliobject == nil
, więc ten test obejmuje zero obiektów i łańcuchów o długości 0. Jeśli traktujesz łańcuch o długości 0 różnej od zera, po prostu sprawdź, czyobject == nil
.Wreszcie, jeśli chcesz dodać ciąg do tablicy lub słownika, a ciąg może być zerowy, możesz nie dodawać go, zamieniać go na
@""
lub zamieniać na[NSNull null]
. Zastąpienie go@""
oznacza utratę możliwości odróżnienia „bez ciągu” od „ciągu o długości 0”. Zastąpienie go[NSNull null]
oznacza, że musisz pisać kod podczas uzyskiwania dostępu do tablicy lub słownika, który sprawdza[NSNull null]
obiekty.źródło
Po prostu sprawdź zero
lub
źródło
Rozwiązanie MACRO (2020)
Oto makro, którego używam do bezpiecznego ciągu zamiast pobierania na przykład ciągu „ (null) ” na UILabel :
powiedzmy, że masz klasę członkowską i właściwość name, a nazwa to zero:
z makro:
ładne i czyste 😊
Rozwiązanie przedłużające (2020)
Jeśli wolisz sprawdzić zero i pusty ciąg w swoim projekcie, możesz użyć mojej linii pomocniczej poniżej:
NSString + Extension.h
NSString + Extension.m
Przykładowe użycie
źródło
źródło
Spróbuj tego, aby sprawdzić zerowy
źródło
To działałoby w następujących przypadkach:
NSString *strOne = @""
LUBNSString *strOne = @"StackOverflow"
LUBNSString *strOne = [NSNull null]
LUBNSString *strOne
.źródło
Jeśli tego typu rzeczy jeszcze nie istnieją, możesz utworzyć kategorię NSString:
źródło
Dla mnie działa
if ( !myobject )
źródło
NSArray *testarray = [NSArray arrayWithObjects:[NSNull null],@"", nil]; NSString *string = [testarray objectAtIndex:0]; NSLog(@"null string value: %@",string); if (!string) { NSLog(@"string evaluates to null"); } if (string && (string==(id)[NSNull null])) { NSLog(@"string does not evaluate to null"); }
Pełne sprawdzenie ciągu pod kątem warunków zerowych może wyglądać następująco: <\ br>
źródło
Sprawdzam tylko ciąg zerowy za pomocą
źródło
źródło
źródło
Dla ciągu:
}
Zobacz zdjęcie poniżej:
źródło
Dla ciągu:
źródło