Як перевірити, чи значення NSString
пустого поля в об’єктиві-C?
Як перевірити, чи значення NSString
пустого поля в об’єктиві-C?
Відповіді:
Ви можете перевірити, чи є [string length] == 0
. Це дозволить перевірити, чи це дійсна, але порожня рядок (@ ""), а також чи нуль, оскільки виклик length
на nil також поверне 0.
ZERO WIDTH SPACE
насправді насправді не має значення, оскільки @"\u200B"
все-таки є символом, тому якщо ви перевірите, чи є рядок порожнім, він скаже, що це не тому, що в ньому є символ. Це просто не для друку, що відповідає стандарту Unicode.
![string length]
. Здається, більш чисто.
Відповідь Марка правильна. Але я скористаюся цією можливістю, щоб включити вказівник на узагальнений Віл Шиплі isEmpty
, яким він поділився у своєму блозі :
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
:)
Перший підхід дійсний, але не працює, якщо у вашій рядку є порожні пробіли ( @" "
). Тому ви повинні очистити ці білі проміжки перед тестуванням.
Цей код очищає всі порожні пробіли з обох сторін рядка:
[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];
Хороша ідея - створити один макрос, тому вам не доведеться вводити цю лінію монстра:
#define allTrim( object ) [object stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]
Тепер ви можете використовувати:
NSString *emptyString = @" ";
if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");
NSString
категорію, яка додає метод під назвою, trimmedString
який робить саме те, що ви написали.
whitespaceCharacterSet
не включає нові рядки! Ось категорія, про яку я писав, включаючи trim
деякі інші корисні методи: github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/…
Одне з найкращих рішень, які я коли-небудь бачив (краще, ніж у Метта Г) - це вдосконалена вбудована функція, яку я взяв на деякий репо-рейтинг Git Hub (той, що знаходиться у Віла Шиплі, але я не можу знайти посилання):
// 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)
? Рано чи пізно ви запитаєте, з яким класом ви маєте справу, краще це зробити за першою довідкою.
Вам слід краще використовувати цю категорію:
@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
Як поєднання відповіді Марка та Кайла.
Я ставлю це:
@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
Проблема полягає в тому, що якщо "self" є нульовою, ця функція ніколи не викликається. Він поверне помилкове, що бажано.
-(BOOL)isEmpty{ return ![self isNotEmpty]}
не буде працювати на категорії.
condenseToSingleNSData(id thing)
? expandToNSArray(id thing)
? Рано чи пізно ви запитаєте, з яким класом ви маєте справу, краще це зробити за першою довідкою.
Просто передайте рядок наступному методу:
+(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;
}
Просто використовуйте один із if
else
умов, як показано нижче:
Спосіб 1:
if ([yourString isEqualToString:@""]) {
// yourString is empty.
} else {
// yourString has some text on it.
}
Спосіб 2:
if ([yourString length] == 0) {
// Empty yourString
} else {
// yourString is not empty
}
Незважаючи на те, що це питання об'єктивного С, мені потрібно було скористатися NSString
в Swift, тому я також включу тут відповідь.
let myNSString: NSString = ""
if myNSString.length == 0 {
print("String is empty.")
}
Або якщо NSString
це необов'язково:
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.")
}
}
Нормальна String
версія Swift є
let myString: String = ""
if myString.isEmpty {
print("String is empty.")
}
Дивіться також: Перевірити порожній рядок у Swift?
Можливо, ця відповідь є дублікатом вже наданих відповідей, але я змінив і змінив в порядку перевірки умов. Будь ласка, зверніться до наведеного нижче коду:
+(BOOL)isStringEmpty:(NSString *)str
{
if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
return YES;
}
return NO;
}
Ви можете перевірити, чи ваша рядок порожній, чи не мій, використовуючи цей метод:
+(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;
}
Найкраща практика полягає в тому, щоб зробити спільний клас, який скаже UtilityClass, і оголосити цей метод, щоб ви могли використовувати цей метод, просто зателефонувавши до нього через свою програму.
У вас є два способи перевірити, чи рядок порожній чи ні:
Припустимо, назва вашого рядка є NSString *strIsEmpty
.
Спосіб 1:
if(strIsEmpty.length==0)
{
//String is empty
}
else
{
//String is not empty
}
Спосіб 2:
if([strIsEmpty isEqualToString:@""])
{
//String is empty
}
else
{
//String is not empty
}
Виберіть будь-який із вищевказаних методів та дізнайтеся, чи рядок порожній чи ні.
Отже, окрім основної концепції перевірки на наявність довжини рядка менше 1, важливо глибоко розглянути контекст. Мови людини чи комп'ютера або іншим чином можуть мати різні визначення порожніх рядків, і в цих же мовах додатковий контекст може ще більше змінити значення.
Скажімо, порожній рядок означає "рядок, який не містить знаків, значущих у поточному контексті".
Це може означати візуально, оскільки колір і колір тла однакові в атрибутивному рядку. Ефективно порожній.
Це може означати порожні значущі символи. Усі точки або всі тире або всі підкреслення можуть вважатися порожніми. Крім того, порожній із значущих знакових символів може означати рядок, який не має символів, які читач розуміє. Вони можуть бути символами на мові чи символі, визначеними як безглузді для читача. Ми могли б визначити це трохи інакше, щоб сказати, що рядок не містить відомих слів на даній мові.
Можна сказати, що порожнє - це функція відсотка від'ємного простору у наданих гліфах.
Навіть послідовність символів, що не друкуються, без загального візуального зображення, не є справді порожньою. На думку приходять контрольні символи. Особливо низький діапазон ASCII (я здивований, що ніхто не згадував про них, оскільки вони шлангують безліч систем і не є пробілом, оскільки вони зазвичай не мають ні гліфів, ні візуальних показників). І все ж довжина рядка не дорівнює нулю.
Висновок. Довжина одна - це не єдиний показник. Контекстуальне членство в наборі також є досить важливим.
Членство в наборі символів є дуже важливим загальним додатковим заходом. Значущі послідовності також є досить поширеними. (думаю, SETI або криптовалюта або капчу) Також існують додаткові більш абстрактні набори контексту.
Тому добре подумайте, перш ніж вважати, що рядок порожній лише на основі довжини або пробілу.
Дуже корисний пост, щоб додати підтримку NSDictionary, а також одну невелику зміну
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)
? Рано чи пізно ви запитаєте, з яким класом ви маєте справу, краще це зробити за першою довідкою.
- (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
Найкращий спосіб - використовувати категорію.
Ви можете перевірити наступну функцію. Який має всі умови для перевірки.
-(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;
Ви можете легко перевірити, чи рядок порожній за допомогою цього:
if ([yourstring isEqualToString:@""]) {
// execute your action here if string is empty
}
Я перевірив порожню рядок, використовуючи код нижче:
//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:@""])
іif([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;
}
Ви можете мати порожній рядок двома способами:
1) @ "" // Не містить місця
2) @ "" // Містить простір
Технічно обидва рядки порожні. Ми можемо записати обидві речі просто за допомогою ONE Condition
if ([firstNameTF.text stringByReplacingOccurrencesOfString:@" " withString:@""].length==0)
{
NSLog(@"Empty String");
}
else
{
NSLog(@"String contains some value");
}
Спробуйте наступне
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
викине виняток, якщо str
це null.
if( [txtMobile.text length] == 0 )
{
[Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
@"\u200B"
(що складаються тільки з символів Unicode ZERO WIDTH ПРОСТІР . Друкуючи його з надрукує 0 символів (перевірити , використовуючи моно шрифт), але String.length дасть 1. Є інші символи Unicode (наприклад , ОБ'ЄКТ ЗАМІНИ ХАРАКТЕРУ ) , які ведуть себе таким же чином. Ви можете отримати останнє під час розбору тексту PDF.