Как проверить, является ли объект NSString
пустым в Objective-C?
Как проверить, является ли объект NSString
пустым в Objective-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 равно nil, эта функция никогда не вызывается. Он вернет ложь, что желательно.
-(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
}
Несмотря на то, что это вопрос по Objective C, мне нужно было использовать его 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 и рекламировал этот метод, чтобы вы могли использовать этот метод, просто вызывая его через свое приложение.
У вас есть 2 способа проверить, является ли строка пустой или нет:
Давайте предположим, что ваше имя строки 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, важно глубоко рассмотреть контекст. Языки человек или компьютер или иным образом могут иметь разные определения пустых строк, и в этих же языках дополнительный контекст может дополнительно изменить значение.
Допустим, пустая строка означает «строку, которая не содержит символов, значимых в текущем контексте».
Это может означать визуально, так как цвет и цвет фона в атрибутивной строке совпадают. Эффективно пусто.
Это может означать пустой значащих символов. Все точки или все тире или все подчеркивания могут считаться пустыми. Кроме того, пустой из значимых значащих символов может означать строку, в которой нет символов, понятных читателю. Это могут быть символы языка или набора символов, определенные для читателя как бессмысленные. Мы могли бы определить это немного по-другому, говоря, что строка не содержит известных слов в данном языке.
Мы могли бы сказать, что empty является функцией процента отрицательного пространства в визуализированных глифах.
Даже последовательность непечатаемых символов без общего визуального представления не является действительно пустой. Управляющие персонажи приходят на ум. Особенно низкий диапазон 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) @ "" // Содержит пространство
Технически обе строки пусты. Мы можем написать обе вещи, просто используя одно условие
if ([firstNameTF.text stringByReplacingOccurrencesOfString:@" " withString:@""].length==0)
{
NSLog(@"Empty String");
}
else
{
NSLog(@"String contains some value");
}
if(str.length == 0 || [str isKindOfClass: [NSNull class]]){
NSLog(@"String is empty");
}
else{
NSLog(@"String is not empty");
}
str.length
выдаст исключение, если str
ноль.
if( [txtMobile.text length] == 0 )
{
[Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
@"\u200B"
(состоящий только из символа Unicode ZERO WIDTH SPACE . При его распечатке будет напечатано 0 символов (проверьте, используя моноширинный шрифт), но string.length даст 1. Существуют другие символы Unicode (например, OBJECT REPLACEMENT CHARACTER ), которые ведут себя аналогично. Вы можете получить последний при разборе текста PDF