iOS. Почему я не могу установить String из NSUserDefaults в свойство Location?

Я столкнулся с незнакомым поведением.

Я искал в Интернете, а точнее на StackOverflow, и нашел много статей и постов о свойствах только для чтения.

Я чувствую, что есть огромный и невидимый опыт обучения, касающийся процесса компиляции и назначения/декларации/инициализации.

Я действительно хочу ясно понять эти ситуации.

Представьте, что у меня есть недвижимость

@property (nonatomic, strong) CLLocation *location;

Я сохранил в своем NSUserDefault последнее известное местоположение пользователя в виде строки.

Если я хочу установить координату моего свойства местоположения с помощью моего lastLocation, у меня возникает ошибка компиляции:

Назначение свойства только для чтения

Вот моя строка кода:

_location.coordinate = [[MyCustomUserDefaults lastLocation] doubleValue];

Вот мой геттер NSUserDefaults:

 +(NSString *) lastLocation
{
    return [[NSUserDefaults standardUserDefaults] objectForKey:USER_PREF_LAST_LOCATION];
}

person Community    schedule 05.04.2017    source источник
comment
Проверьте ссылку ниже, она может быть вам полезна stackoverflow.com/a/18910891   -  person Rajesh Dharani    schedule 05.04.2017
comment
Лучший ответ в этом дубликате, ИМО, stackoverflow.com/a/18910861/294949   -  person danh    schedule 05.04.2017
comment
@danh я не согласен. Принятый ответ лучше. Меня пугает то, что байты структуры сохраняются. Почему бы просто не сохранить примитивных двойников? Что, если CLLocationCoordinate2D когда-либо будет обновлено, чтобы использовать вместо него числа с плавающей запятой, или будут добавлены дополнительные свойства? Использование инициализатора CLLocation, который принимает два конкретных типа, намного безопаснее и перспективнее.   -  person Craig Otis    schedule 05.04.2017
comment
@CraigOtis в настоящее время есть несколько других свойств, помимо координат. Вот почему я предпочитаю идею NSData: не для будущего, а для настоящего :-)   -  person danh    schedule 05.04.2017
comment
@danh Частные/внутренние свойства, кроме широты/долготы? Я не вижу аргументов в пользу сохранения этих свойств, когда есть инициализатор, который принимает два, которые ему действительно нужны. Что, если вы сохранили эти данные, пользователь обновил программное обеспечение своего устройства, а ваша конструкция из байтов теперь терпит неудачу? Все преимущество инициализатора/API заключается в том, что внутренняя структура/реализация могут изменяться без необходимости знать об этом внешним вызывающим сторонам.   -  person Craig Otis    schedule 05.04.2017
comment
@CraigOtis, ОП сохраняет объект CLLocation (developer.apple.com/reference/corelocation/ cllocation#main), а не просто двухкоординатная структура.   -  person danh    schedule 05.04.2017
comment
И @CraigOtis, вот как я буду обрабатывать структуру координат LC2D: [NSValue value:&myLC2Dstruct withObjCType:@encode(CLLocationCoordinate2D)]. Я на 100% согласен с вами в отношении соблюдения целостности объекта (даже если это гражданин второго сорта, такой как структура), поэтому у меня немного аллергия на разбиение объекта (или структуры) на несколько компонентов (даже если они являются параметрическими) для сериализации.   -  person danh    schedule 05.04.2017
comment
Может кто-нибудь написать ответ, здесь в комментариях становится грязно.   -  person    schedule 05.04.2017
comment
@danh Верно, но этот ответ - сохранение структуры координат - сохранение структуры памяти объекта на диск кажется менее безопасным. Если вы хотите использовать NSSecureCoding (который реализует CLLocation), то конечно, но запись байтов с диска в указатель, который, вероятно, изменился с течением времени, кажется действительно рискованным. Имейте в виду, что NSUserDefaults предназначен для более длительного хранения, а не только для одного запуска приложения. Вы должны признать - если пользователь работает под управлением iOS 7, сохраняет CLLocation по умолчанию, а затем перезагружает его в iOS 8 - есть большая вероятность, что он выйдет из строя во время выполнения - инициализатор этого не сделает.   -  person Craig Otis    schedule 05.04.2017
comment
@РафаэльП. Поскольку вопрос был помечен как обман, вы сможете найти ответ на страницах, на которые ссылаетесь.   -  person Craig Otis    schedule 05.04.2017


Ответы (2)


Сохранить координаты местоположения в NSUserDefaults

 NSString *strlat = location.coordinate.latitude
 NSString *strlong = location.coordinate.longitude 
[[NSUserDefaults standardUserDefaults]setObject:strlat forKey:@"lat"];
[[NSUserDefaults standardUserDefaults] strlong:strlat forKey:@"long"];     
person Lalit kumar    schedule 05.04.2017

Свойство координат для CLLocation — это объект CLLocationCoordinate2D. Вы должны инициировать это как

CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);

и вы можете сохранить значения широты и долготы с помощью NSNumber

[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithDouble:0.5] forKey:@"latitude"];
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithDouble:0.5] forKey:@"longitude"];

чем вы получаете значения

double latitude = [[[NSUserDefaults standardUserDefaults] objectForKey:@"latitude"] doubleValue];
double longitude = [[[NSUserDefaults standardUserDefaults] objectForKey:@"longitude"] doubleValue];
person abdullahselek    schedule 05.04.2017