Как упомянуто в других комментариях: если вы хотите предотвратить сбои, вам также необходимо проверить, является ли он nil
, особенно если есть вероятность перенести ваш код в Swift в будущем.
ПростоЧтобы прояснить мое последнее предложение, строка ниже работает в Objective-C, даже если aString
равен nil
:
if ([aString isKindOfClass:[NSString class]]) {
Это потому, что, как Objective-C был сделан, вызов функции наnil
объект возвращает nil
, поэтому if
будет считаться false
, а функция вернет defaultString
.Да ... это, конечно, плохая идея, когда они создали Objetive-C, поскольку это приводит к большому количеству ошибок.Подробнее об этом поведении читайте ниже:
https://stackoverflow.com/a/2696909
В любом случае, хорошей практикой является также приведение объекта только после проверки его типа, поэтому я рекомендую адаптировать вашу функцию к этому:
+ (NSString *)validateString:(id)obj defaultString:(NSString *)defaultString {
if (obj != nil && [obj isKindOfClass:[NSString class]]) {
return (NSString*)obj;
}
return defaultString;
}
Каждый объект, который реализует NSObject*
, имеет isKindOfClass:
(а NSDictionary*
хранит только объекты, которые реализуют NSObject*
), поэтому нам не нужно проверять, реагирует ли объект на него.Кроме того, даже если мы хотим, respondsToSelector:
также является функцией NSObject*
.
Тем не менее используемый вами метод все еще работает.Пересмотренная выше функция просто адаптирована для лучшей практики и позволяет избежать проблем в случае, если вам когда-нибудь понадобится перенести этот код на Swift (или любой другой язык) в будущем.
РЕДАКТИРОВАТЬ: обновленный код, основанный на предложении @ matt.