Как мне привести в порядок этот код:

if ([dictInfoForThisBusiness[@"LikeNumber"] isNotEmpty]) {
    BusinessToSave.numberOfLike =dictInfoForThisBusiness[@"LikeNumber"];
}
else
{
    BusinessToSave.numberOfLike = @(0);
}

if (dictInfoForThisBusiness[@"DislikeNumber"])
{
    BusinessToSave.numberOfDislike =dictInfoForThisBusiness[@"DislikeNumber"];
}
else
{
    BusinessToSave.numberOfDislike =@(0);
}

//BusinessToSave.buildingName =dictInfoForThisBusiness[@"Building"];

if([dictInfoForThisBusiness[@"Building"] isNotEmpty]){
    BusinessToSave.buildingName=dictInfoForThisBusiness[@"Building"];
}
else
{
    BusinessToSave.buildingName =nil;
}


if([dictInfoForThisBusiness[@"Street"] isNotEmpty]){
    BusinessToSave.Street=dictInfoForThisBusiness[@"Street"];
}
else
{
    BusinessToSave.Street =nil;
}

Очевидно, что это довольно грязно по одной простой причине.

BusinessToSave является управляемым объектом

Часто это должно просто пойти на ноль. Однако словарь не может содержать значение nil и будет возвращать NULL.

Так что я не могу просто сделать BusinessToSave.buildingName = dictInfoForThisBusiness[@"Building"]

Что мне тогда делать?

Я попробовал одну вещь:

BusinessToSave.buildingName =(NSString*) [dictInfoForThisBusiness[@"Building"] nilIfNull];

Еще я попробовал

BusinessToSave.buildingName =((NSString*) dictInfoForThisBusiness[@"Building"]).nilIfNull;

Я понятия не имею, почему точечная запись может работать, учитывая, что nilIfNull возвращает id

-(id) nilIfNull
{
    if ([self isKindOfClass:[NSNull class]])
    {
        return self;
    }
    else
    {
        return nil;
    }
}

Я наконец соглашусь на

[dictInfoForThisBusiness[@"Building"] nilIfNull] который работает, если я ожидаю NSString. Есть ли лучший или более стандартный способ?

1 ответ

Первым шагом будет попытка избавиться от всех этих утверждений. Простое изменение метода setup(?) На что-то вроде этого сделает его более читабельным:

BusinessToSave.numberOfLike = @(0);
if ([dictInfoForThisBusiness[@"LikeNumber"] isNotEmpty]) {
    BusinessToSave.numberOfLike =dictInfoForThisBusiness[@"LikeNumber"];
}

BusinessToSave.numberOfDislike =@(0);
if (dictInfoForThisBusiness[@"DislikeNumber"]){
    BusinessToSave.numberOfDislike =dictInfoForThisBusiness[@"DislikeNumber"];
}

BusinessToSave.buildingName =nil;
if([dictInfoForThisBusiness[@"Building"] isNotEmpty]){
    BusinessToSave.buildingName=dictInfoForThisBusiness[@"Building"];
}

BusinessToSave.Street =nil;
if([dictInfoForThisBusiness[@"Street"] isNotEmpty]){
    BusinessToSave.Street=dictInfoForThisBusiness[@"Street"];
}

Как насчет создания метода, который даст вам правильный объект (или ноль):

BusinessToSave.buildingName = [self valueForDictKey:@"Building"];

Вы могли бы даже иметь два (или более) разных метода. (stringForDictKey, integerForDictKey) и т. д.

BusinessToSave.numberOfLike = [self integerForDictKey:@"LikeNumber"];
BusinessToSave.numberOfDislike = [self integerForDictKey: @"DislikeNumber"];
BusinessToSave.buildingName = [self stringForDictKey: @"Building"];
BusinessToSave.street = [self stringForDictKey @"Street"];

Кроме того: я бы посоветовал вам сделать #defines для всех этих ключей, слишком легко неправильно ввести одно из этих имен ключей.:)

BusinessToSave.numberOfLike = [self integerForDictKey:KEY_LIKES];
BusinessToSave.numberOfDislike = [self integerForDictKey: KEY_DISLIKES];
BusinessToSave.buildingName = [self stringForDictKey: KEY_BUILDING];
BusinessToSave.street = [self stringForDictKey KEY_STREET];
Другие вопросы по тегам