Хранить CLLocationCoordinate2D в NSUserDefaults

Я новичок в разработке iphone, и хочу сохранить объект CLLocationCoordinate2D на NSUserDefaults. Я пытаюсь

    [defaults setObject:location forKey:@"userLocation"];

Но он дает ошибку 'Отправка CLLocationCoordinate2D в параметр несовместимого идентификатора типа

Итак, как хранить CLLocationCoordinate2D в NSUserDefaults? Спасибо.

Ответ 1

Как

pdrcabrod

Указанный "Объект по умолчанию должен быть списком свойств, то есть экземпляром NSData, NSString, NSNumber, NSDate , NSArray или NSDictionary".

Я использую это для хранения

    NSNumber *lat = [NSNumber numberWithDouble:location.latitude];
    NSNumber *lon = [NSNumber numberWithDouble:location.longitude];
    NSDictionary *[email protected]{@"lat":lat,@"long":lon};

    [[NSUserDefaults standardUserDefaults] setObject:userLocation forKey:@"userLocation"];
    [[NSUserDefaults standardUserDefaults] synchronize];

И доступ с использованием

    NSDictionary *userLoc=[[NSUserDefaults standardUserDefaults] objectForKey:@"userLocation"];
    NSLog(@"lat %@",[userLoc objectForKey:@"lat"]);
    NSLog(@"long %@",[userLoc objectForKey:@"long"]);

Ответ 2

Это то, что я сделал бы:

NSData *data = [NSData dataWithBytes:&coordinate length:sizeof(coordinate)];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"key"];
[[NSUserDefaults standardUserDefaults] synchronize];

Затем вы можете получить его следующим образом:

NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"key"];
CLLocationCoordinate2D coordinate;
[data getBytes:&coordinate length:sizeof(coordinate)];

Ответ 3

Класс NSUserDefaults предоставляет удобные методы для доступа к общим типам, таким как float, doubleles, integers, Booleans и URL. Объектом по умолчанию должен быть список свойств, то есть экземпляр (или для коллекций - комбинация экземпляров): NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary. Если вы хотите сохранить какой-либо другой тип объекта, вы должны, как правило, архивировать его, чтобы создать экземпляр NSData​​strong >

Смотрите: NSUserDefaults

Ответ 4

Вы можете установить такой вариант.

CLLocationCoordinate2D coordinate; // need to set your coordinate here

[[defaults setObject:[NSString stringWithFormat:@"%g",coordinate.latitude] forKey:@"latitude"] ];
[[defaults setObject:[NSString stringWithFormat:@"%g",coordinate.longitude] forKey:@"longitude"] ];

Надеюсь, что это поможет.

Ответ 5

Как говорили другие, сначала преобразуйте его в объект Dictionary или Data, а затем сохраните его, как обычно. В Swift я настоятельно рекомендую использовать расширения. Вот что я сделал:

extension CLLocationCoordinate2D {

    private static let Lat = "lat"
    private static let Lon = "lon"

    typealias CLLocationDictionary = [String: CLLocationDegrees]

    var asDictionary: CLLocationDictionary {
        return [CLLocationCoordinate2D.Lat: self.latitude,
                CLLocationCoordinate2D.Lon: self.longitude]
    }

    init(dict: CLLocationDictionary) {
        self.init(latitude: dict[CLLocationCoordinate2D.Lat]!,
                  longitude: dict[CLLocationCoordinate2D.Lon]!)
    }

}