2016-05-01 3 views
1

Я глядя на несколько результатах поиска Google и нашел различные способы тестирования в NSString для nil и т.д.NSString: Возвращаемое значение или пустая строка

Так что я решил написать некоторые category метод NSString к Помогите. Однако он работает не так, как ожидалось, и мне интересно, может ли кто-нибудь помочь мне понять, почему и возможная помощь в решении.

Так вот что я придумал:

NSString+Extenstions.h

#import 

@interface NSString (Extensions) 

- (NSString *)stringOrNil; 
- (NSString *)stringOrEmpty; 

@end

NSString+Extenstions.m

#import "NSString+Extensions.h" 

@implementation NSString (Extensions) 

- (NSString *)stringOrNil { 
    return self == nil || [self length] == 0 ? nil : self; 
} 

- (NSString *)stringOrEmpty { 
    return [self stringOrNil] == nil ? @"" : self; 
} 

@end

Так идея stringOrEmpty, чтобы заставить результат как пустой NSString (не nil), если объект nil или длина равна 0.

Тестирование:

NSString *name = nil; 
NSLog(@"%@", [name stringOrEmpty]); // result: (null)

Я ожидал, приведенный выше результат, чтобы быть пустым, но консоль вошли как (null). S Я изменил метод stringOrEmpty на return [[self stringOrNil] length] == 0 ? @"yes" : @"no"; и ожидал увидеть yes, но снова получил (null). Кажется, stringOrEmpty не вызывается.

И, наконец, я протестировал следующее: NSLog(@"%@", [name class]); и снова результат был (null).

Я что-то не понимаю? Как написать категорию, которая вернет пустое значение NSString, если значение nil или действительно пустое?

Спасибо!

+3

Отправка сообщения 'nil' объект не дозвонились , Он просто возвращает ноль. Вы должны определить их как методы класса. – ozgur

+0

@ozgur ах, поэтому, хотя я определяю 'имя' как' NSString', давая ему 'nil', не разрешает вызов методам' NSString'? – RoLYroLLs

+1

Сообщение nil ничего не делает и возвращает 'nil, Nil, NULL, 0 или 0.0' в зависимости от типа. Так что, ты прав. – ozgur

ответ

2

nil не является экземпляром NSString или любого объекта, поэтому вы не можете иметь дело с nil с использованием методов экземпляра.

Сообщение nil ничего не делает, его даже не называют. Он просто возвращает nil. Вы должны определить их как методы класса:

@interface NSString (Extensions) 

+ (NSString *)stringOrNil:(NSString *)string; 
+ (NSString *)stringOrEmpty:(NSString *)string; 

@end 

-

@implementation NSString (Extensions) 

+ (NSString *)stringOrNil:(NSString *)string { 
    return string.length ? string : nil; 
} 

+ (NSString *)stringOrEmpty:(NSString *)string { 
    return string ? string : @""; 
} 

@end 

Вот как вы можете называть их:

NSString *name = nil; 
NSLog(@"%@", [NSString stringOrEmpty:name]); // result: ("") 
+0

Спасибо! работал как шарм! – RoLYroLLs

+0

Метод 'stringOrNil' имеет ненужную проверку. Просто верните string.length? string: nil; '.И 'stringOrEmpty' должен быть' return string? string: @ ""; '. – rmaddy

Смежные вопросы