NSString
Objective-C'de bir boş olup olmadığını nasıl test edebilirim ?
NSString
Objective-C'de bir boş olup olmadığını nasıl test edebilirim ?
Yanıtlar:
Eğer olup olmadığını kontrol edebilirsiniz [string length] == 0
. Bu, geçerli ancak boş bir dize (@ "") ve nil olup olmadığını kontrol edecektir, çünkü length
nil çağrısı da 0 döndürecektir.
ZERO WIDTH SPACE
nedeniyle gerçekten önemli, değil ise @"\u200B"
değildir yine de bu yüzden dize boş olması için test eğer bir karakter, içinde bir karakter olduğu için değil diyecekler. Unicode standardına göre yazdırılamaz.
![string length]
. Daha temiz görünüyor.
Marc'ın cevabı doğrudur. Ama bu fırsatı Wil Shipley'in genelleştirilmiş bloguna eklediği isEmpty
ve blogunda paylaştığı bir işaretçi eklemek için kullanacağım :
static inline BOOL IsEmpty(id thing) {
return thing == nil
|| ([thing respondsToSelector:@selector(length)]
&& [(NSData *)thing length] == 0)
|| ([thing respondsToSelector:@selector(count)]
&& [(NSArray *)thing count] == 0);
}
-isNotEmpty
:) olarak değiştirebilirsiniz
İlk yaklaşım geçerlidir, ancak dizenizde boşluklar ( @" "
) varsa çalışmaz . Bu yüzden test etmeden önce bu boşlukları temizlemelisiniz.
Bu kod, dizenin her iki tarafındaki tüm boş alanları temizler:
[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];
İyi bir fikir bir makro oluşturmaktır, bu yüzden bu canavar satırını yazmak zorunda değilsiniz:
#define allTrim( object ) [object stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]
Şimdi şunları kullanabilirsiniz:
NSString *emptyString = @" ";
if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");
NSString
bir yöntem ekleyen bir kategori tarafından sunulması daha iyi olur trimmedString
.
whitespaceCharacterSet
yeni satır içermediğini unutmayın! İşte yazdığım bir kategori trim
ve diğer bazı yararlı yöntemler: github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/…
Şimdiye kadar gördüğüm en iyi çözümlerden biri (Matt G'ninkinden daha iyi), bazı Git Hub repo'da aldığım bu geliştirilmiş satır içi işlev (Wil Shipley'nin bir tanesi, ancak bağlantıyı bulamıyorum):
// Check if the "thing" passed is empty
static inline BOOL isEmpty(id thing) {
return thing == nil
|| [thing isKindOfClass:[NSNull class]]
|| ([thing respondsToSelector:@selector(length)]
&& [(NSData *)thing length] == 0)
|| ([thing respondsToSelector:@selector(count)]
&& [(NSArray *)thing count] == 0);
}
condenseToSingleNSData(id thing)
? expandToNSArray(id thing)
? Er ya da geç, ne tür bir sınıfla uğraştığınızı soracaksınız, ilk referansta bunu yapmak daha iyi.
Bu kategoriyi daha iyi kullanmalısınız:
@implementation NSString (Empty)
- (BOOL) isWhitespace{
return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]length] == 0);
}
@end
@implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end
Marc ve Kyle'ın cevabının bir kombinasyonu olarak.
Bunu koydum:
@implementation NSObject (AdditionalMethod)
-(BOOL) isNotEmpty
{
return !(self == nil
|| [self isKindOfClass:[NSNull class]]
|| ([self respondsToSelector:@selector(length)]
&& [(NSData *)self length] == 0)
|| ([self respondsToSelector:@selector(count)]
&& [(NSArray *)self count] == 0));
};
@end
Sorun şu ki, eğer ben kendini sıfır ise, bu fonksiyon asla çağrılmaz. İstenilen yanlış döndürür.
-(BOOL)isEmpty{ return ![self isNotEmpty]}
kategori üzerinde çalışmayacak.
condenseToSingleNSData(id thing)
? expandToNSArray(id thing)
? Er ya da geç, ne tür bir sınıfla uğraştığınızı soracaksınız, ilk referansta bunu yapmak daha iyi.
Dizenizi aşağıdaki yönteme geçirmeniz yeterlidir:
+(BOOL)isEmpty:(NSString *)str
{
if(str.length==0 || [str isKindOfClass:[NSNull class]] || [str isEqualToString:@""]||[str isEqualToString:NULL]||[str isEqualToString:@"(null)"]||str==nil || [str isEqualToString:@"<null>"]){
return YES;
}
return NO;
}
Sadece if
else
aşağıda gösterilen koşullardan birini kullanın :
Yöntem 1:
if ([yourString isEqualToString:@""]) {
// yourString is empty.
} else {
// yourString has some text on it.
}
Yöntem 2:
if ([yourString length] == 0) {
// Empty yourString
} else {
// yourString is not empty
}
Bu bir Objective C sorusu olmasına rağmen NSString
, Swift'te kullanmam gerekiyordu, bu yüzden burada bir cevap da ekleyeceğim.
let myNSString: NSString = ""
if myNSString.length == 0 {
print("String is empty.")
}
Veya NSString
İsteğe bağlı ise:
var myOptionalNSString: NSString? = nil
if myOptionalNSString == nil || myOptionalNSString!.length == 0 {
print("String is empty.")
}
// or alternatively...
if let myString = myOptionalNSString {
if myString.length != 0 {
print("String is not empty.")
}
}
Normal Swift String
sürümü
let myString: String = ""
if myString.isEmpty {
print("String is empty.")
}
Ayrıca bkz: Swift'teki boş dizeyi kontrol et?
Bu cevap zaten verilen cevapların kopyası olabilir, ancak koşulları kontrol etme sırasına birkaç değişiklik ve değişiklik yaptım. Lütfen aşağıdaki kodu inceleyin:
+(BOOL)isStringEmpty:(NSString *)str
{
if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
return YES;
}
return NO;
}
Bu yöntemi kullanarak dizenizin boş olup olmadığını kontrol edebilirsiniz:
+(BOOL) isEmptyString : (NSString *)string
{
if([string length] == 0 || [string isKindOfClass:[NSNull class]] ||
[string isEqualToString:@""]||[string isEqualToString:NULL] ||
string == nil)
{
return YES; //IF String Is An Empty String
}
return NO;
}
En iyi uygulama, paylaşılan bir sınıfın UtilityClass ve reklamı bu yöntemi söylemesini sağlamaktır, böylece bu yöntemi sadece uygulamanızı çağırarak kullanabilirsiniz.
Dizenin boş olup olmadığını kontrol etmek için 2 yönteminiz vardır:
Diyelim ki dize adınız NSString *strIsEmpty
.
Yöntem 1:
if(strIsEmpty.length==0)
{
//String is empty
}
else
{
//String is not empty
}
Yöntem 2:
if([strIsEmpty isEqualToString:@""])
{
//String is empty
}
else
{
//String is not empty
}
Yukarıdaki yöntemlerden herhangi birini seçin ve dizenin boş olup olmadığını öğrenin.
Bu nedenle, 1'den az bir dize uzunluğunu kontrol etme temel kavramının yanı sıra, bağlamı derinlemesine düşünmek önemlidir. İnsan veya bilgisayar dilleri veya başka türlü boş dizelerin farklı tanımları olabilir ve bu diller içinde ek bağlam anlamını daha da değiştirebilir.
Diyelim ki boş dize, "geçerli bağlamda önemli herhangi bir karakter içermeyen bir dize" anlamına gelir.
Bu, görsel olarak ifade edilebilir, çünkü renk ve arka plan rengi ilişkilendirilmiş bir dizede aynıdır. Etkili bir şekilde boş.
Bu anlamlı karakterlerin boşalması anlamına gelebilir. Tüm noktalar veya tüm çizgiler veya tüm alt çizgiler boş olarak değerlendirilebilir. Ayrıca, anlamlı anlamlı karakterlerin boşaltılması, okuyucunun anladığı hiçbir karakter içermeyen bir dize anlamına gelebilir. Bunlar bir dilde karakterler olabilir veya okuyucu için anlamsız olarak tanımlanan characterSet olabilir. Dizenin belirli bir dilde bilinen hiçbir kelime oluşturmadığını söylemek biraz farklı olabilir.
Boşun, oluşturulan gliflerdeki negatif alan yüzdesinin bir işlevi olduğunu söyleyebiliriz.
Genel görsel temsili olmayan yazdırılamayan karakterler dizisi bile gerçekten boş değildir. Kontrol karakterleri akla geliyor. Özellikle düşük ASCII aralığı (Kimsenin bunlardan çok fazla sistem hortumladıkları ve normalde glifleri ve görsel metrikleri olmadığı için boşluk olmadığı için bahsetmedim). Ancak dize uzunluğu sıfır değil.
Sonuç. Buradaki tek ölçü uzunluk değil. Bağlamsal set üyeliği de oldukça önemlidir.
Karakter Seti üyeliği çok önemli bir ortak ek önlemdir. Anlamlı diziler de oldukça yaygın olan dizilerdir. (SETI veya kripto veya captcha'ları düşünün) Başka soyut bağlam kümeleri de vardır.
Bu nedenle, bir dizenin yalnızca uzunluğa veya boşluğa göre boş olduğunu varsaymadan önce dikkatlice düşünün.
NSDictionary desteği ve bir küçük değişiklik eklemek için çok yararlı yazı
static inline BOOL isEmpty(id thing) {
return thing == nil
|| [thing isKindOfClass:[NSNull class]]
|| ([thing respondsToSelector:@selector(length)]
&& ![thing respondsToSelector:@selector(count)]
&& [(NSData *)thing length] == 0)
|| ([thing respondsToSelector:@selector(count)]
&& [thing count] == 0);
}
condenseToSingleNSData(id thing)
? expandToNSArray(id thing)
? Er ya da geç, ne tür bir sınıfla uğraştığınızı soracaksınız, ilk referansta bunu yapmak daha iyi.
- (BOOL)isEmpty:(NSString *)string{
if ((NSNull *) string == [NSNull null]) {
return YES;
}
if (string == nil) {
return YES;
}
if ([string length] == 0) {
return YES;
}
if ([[string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0) {
return YES;
}
if([[string stringByStrippingWhitespace] isEqualToString:@""]){
return YES;
}
return NO;
}
stringByStrippingWhitespace
En iyi yol kategoriyi kullanmaktır.
Aşağıdaki işlevi kontrol edebilirsiniz. Hangi kontrol etmek için tüm şartları vardır.
-(BOOL)isNullString:(NSString *)aStr{
if([(NSNull *)aStr isKindOfClass:[NSNull class]]){
return YES;
}
if ((NSNull *)aStr == [NSNull null]) {
return YES;
}
if ([aStr isKindOfClass:[NSNull class]]){
return YES;
}
if(![[aStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]){
return YES;
}
return NO;
}
if (string.length == 0) stringIsEmpty;
Bununla dizenin boş olup olmadığını kolayca kontrol edebilirsiniz:
if ([yourstring isEqualToString:@""]) {
// execute your action here if string is empty
}
Aşağıdaki kodu kullanarak boş bir dize kontrol ettim:
//Check if we have any search terms in the search dictionary.
if( (strMyString.text==(id) [NSNull null] || [strMyString.text length]==0
|| strMyString.text isEqual:@"")) {
[AlertView showAlert:@"Please enter a valid string"];
}
if([myString isEqual:@""])
Veya kadar basitif([myString isEqualToString:@""])
//Different validations:
NSString * inputStr = @"Hey ";
//Check length
[inputStr length]
//Coming from server, check if its NSNull
[inputStr isEqual:[NSNull null]] ? nil : inputStr
//For validation in allowed character set
-(BOOL)validateString:(NSString*)inputStr
{
BOOL isValid = NO;
if(!([inputStr length]>0))
{
return isValid;
}
NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet characterSetWithCharactersInString:@".-"];
[allowedSet formUnionWithCharacterSet:[NSCharacterSet decimalDigitCharacterSet]];
if ([inputStr rangeOfCharacterFromSet:[allowedSet invertedSet]].location == NSNotFound)
{
// contains only decimal set and '-' and '.'
}
else
{
// invalid
isValid = NO;
}
return isValid;
}
Boş bir dizeyi iki şekilde kullanabilirsiniz:
1) @ "" // Alan içermiyor
2) @ "" // Boşluk İçeren
Teknik olarak her iki dize de boştur. Biz sadece kullanarak ikisini de yazabilir BİR Durum
if ([firstNameTF.text stringByReplacingOccurrencesOfString:@" " withString:@""].length==0)
{
NSLog(@"Empty String");
}
else
{
NSLog(@"String contains some value");
}
Takip etmeyi dene
NSString *stringToCheck = @"";
if ([stringToCheck isEqualToString:@""])
{
NSLog(@"String Empty");
}
else
{
NSLog(@"String Not Empty");
}
if(str.length == 0 || [str isKindOfClass: [NSNull class]]){
NSLog(@"String is empty");
}
else{
NSLog(@"String is not empty");
}
str.length
boşsa bir istisna atar str
.
if( [txtMobile.text length] == 0 )
{
[Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
@"\u200B"
(sadece Unicode karakter oluşan SIFIR GENİŞLİK UZAY () boşluklu yazı tipini kullanarak doğrulama gibi, ama diğer Unicode karakterleri (vardır String.length 1. verecektir 0 karakter yazdırır. Baskı dışarı OBJE DEĞİŞTİRME KARAKTER aynı şekilde davranırlar). Sen edebilir PDF metni ayrıştırılırken ikincisini alın