Я не хочу бросать еще один журнал на этот исключительно старый огонь, но я не уверен, что нужно редактировать чужой ответ - особенно когда это выбранный ответ.
Джейкоб задал дополнительный вопрос: как я могу сделать это с помощью одного вызова метода?
Ответ заключается в создании категории, которая в основном расширяет функциональные возможности базового класса Objective-C, и написании «сокращенного» метода для всего остального кода.
Однако, технически, строка с символами пробела не является пустой - она просто не содержит видимых глифов (последние пару лет я использовал метод isEmptyString: и преобразован сегодня после прочтения этого вопроса , ответ и набор комментариев).
Чтобы создать категорию, перейдите к Option + Click -> New File ... (или File -> New -> File ... или просто команда + n) -> выберите Objective-C Category. Выберите имя для категории (это поможет пространству имен и уменьшит возможные будущие конфликты) - выберите NSString из выпадающего списка «Категория вкл.» - сохраните файл где-нибудь. (Примечание. Файл будет автоматически называться NSString + YourCategoryName.h и .m.)
Я лично ценю самодокументированную природу Objective-C; поэтому я создал следующий метод категории для NSString, изменив мой исходный метод isEmptyString: метод и выбрав более точно объявленный метод (я верю, что компилятор сожмет код позже - возможно, слишком много).
Заголовок (.h):
#import <Foundation/Foundation.h>
@interface NSString (YourCategoryName)
/*! Strips the string of white space characters (inlcuding new line characters).
@param string NSString object to be tested - if passed nil or @"" return will
be negative
@return BOOL if modified string length is greater than 0, returns YES;
otherwise, returns NO */
+ (BOOL)visibleGlyphsExistInString:(NSString *)string;
@end
Реализация (.m):
@implementation NSString (YourCategoryName)
+ (BOOL)visibleGlyphsExistInString:(NSString *)string
{
// copying string should ensure retain count does not increase
// it was a recommendation I saw somewhere (I think on stack),
// made sense, but not sure if still necessary/recommended with ARC
NSString *copy = [string copy];
// assume the string has visible glyphs
BOOL visibleGlyphsExist = YES;
if (
copy == nil
|| copy.length == 0
|| [[copy stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0
) {
// if the string is nil, no visible characters would exist
// if the string length is 0, no visible characters would exist
// and, of course, if the length after stripping the white space
// is 0, the string contains no visible glyphs
visibleGlyphsExist = NO;
}
return visibleGlyphsExist;
}
@end
Чтобы вызвать метод, обязательно #import файла NSString + MyCategoryName.h в класс .h или .m (я предпочитаю .m для категорий), где вы выполняете этот вид проверки и выполните следующее:
NSString* myString = @""; // or nil, or tabs, or spaces, or something else
BOOL hasGlyphs = [NSString visibleGlyphsExistInString:myString];
Надеюсь, это охватывает все основы. Я помню, когда я впервые начал разрабатывать для Objective-C, категория была одной из тех, "а?" испытания для меня - но теперь я использую их немного, чтобы увеличить возможность повторного использования.
Редактировать: И я полагаю, технически, если мы раздеваем персонажей, это:
[[copy stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0
Это действительно все, что нужно (он должен делать все, что делает метод категории, включая копию), но я могу ошибаться в этом отношении.