Обработка пустых структур в Objective-C (координата в пользовательском классе) - PullRequest
9 голосов
/ 02 ноября 2009

У меня есть собственный класс, который имеет в качестве переменной экземпляра координаты:

CLLocationCoordinate2D eventLocation;
@property(nonatomic) CLLocationCoordinate2D eventLocation;

Я анализирую xml-файл с необязательным полем, которое может быть или не быть там. Если это так, я установил это так:

CLLocationCoordinate2D location;
NSArray *coordinateArray = [paramValue componentsSeparatedByString:@","];
if ([coordinateArray count] >= 2) {
    location.latitude = [[coordinateArray objectAtIndex:0] doubleValue];
    location.longitude = [[coordinateArray objectAtIndex:1] doubleValue];
} else {
    NSLog(@"Coordinate problem");
}
info.eventLocation = location;

Что я делаю, так это добавляю аннотацию на карту

annotation.coordinate = alert.info.eventLocation;

Я знаю, что мне нужно сделать некоторую проверку здесь, чтобы убедиться, что она существует, но мне не разрешено делать if (info.eventLocation == nil) или даже if (info.eventLocation.latitude == nil)

Это кажется очень простым вопросом, но я провел небольшой поиск, и никто так и не смог дать хороший ответ / идею. Моя архитектура полностью выключена?

Ответы [ 3 ]

24 голосов
/ 02 ноября 2009

Поскольку CLLocationCoordinate2D является структурой, значение nil не существует. Objective-C инициализирует структуры равными 0, если они являются переменными экземпляра объекта, поэтому, если вы не установите значение для eventLocation, annotation.coordinate.longitude и eventLocation.lattitude оба будут равны 0. Так как это допустимое местоположение, это не полезный маркер.

Я бы определил нефизическое значение:

static const CLLocationDegrees emptyLocation = -1000.0;
static const CLLocationCoordinate2D emptyLocationCoordinate = {emptyLocation, emptyLocation}

и затем присвойте это значение вашему alert.info.eventLocation = EmptyLocationCoordinate, чтобы представить пустое значение. Затем вы можете проверить, если (alert.info.eventLocation == emptyLocationCoordinate).

4 голосов
/ 02 ноября 2009

Я использовал приведенный выше код, за исключением того, что он не позволил мне объявить const с другим const, поэтому я просто изменил его на:

static const CLLocationDegrees EmptyLocation = -1000.0;
static const CLLocationCoordinate2D EmptyLocationCoordinate = {-1000.0, -1000.0};

Я также добавил в свой инициал для класса:

eventLocation = EmptyLocationCoordinate;

Спасибо за помощь, Барри.

3 голосов
/ 05 июля 2013

Просто для полноты вы можете использовать константу kCLLocationCoordinate2DInvalid для хранения ссылки на недействительный CLLocationCoordinate2D. (см .: @ ответ Клааса )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...