iOS-为什么可以';我是否将NSUserDefaults中的字符串设置为Location属性?

iOS-为什么可以';我是否将NSUserDefaults中的字符串设置为Location属性?,ios,objective-c,readonly,assign,Ios,Objective C,Readonly,Assign,我遇到了一个不熟悉的行为 我在互联网上搜索,更准确地说是在StackOverflow上,找到了很多关于只读属性的文章和帖子 我觉得在编译过程和作业/声明/初始化方面有大量无形的学习经验 我真的想清楚地了解这些情况 想象一下我有一处房产 @property (nonatomic, strong) CLLocation *location; 我已将最后一个已知的用户位置作为字符串存储在我的NSUserDefault中 如果要将“我的位置”属性的坐标设置为“我的最后位置”,则会出现编译错误: 对只读

我遇到了一个不熟悉的行为

我在互联网上搜索,更准确地说是在StackOverflow上,找到了很多关于只读属性的文章和帖子

我觉得在编译过程和作业/声明/初始化方面有大量无形的学习经验

我真的想清楚地了解这些情况

想象一下我有一处房产

@property (nonatomic, strong) CLLocation *location;
我已将最后一个已知的用户位置作为字符串存储在我的
NSUserDefault

如果要将“我的位置”属性的坐标设置为“我的最后位置”,则会出现编译错误:

对只读属性的赋值

以下是我的代码行:

_location.coordinate = [[MyCustomUserDefaults lastLocation] doubleValue];
以下是我的默认获取者:

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

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];

在NSUserDefault中保存位置坐标

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

检查下面的链接,它可能对你有用,因为dup,IMO,最好的答案是@danh,我不同意。公认的答案更好。看到结构的字节被保存下来,我很害怕。为什么不保存原始双精度?如果
CLLocationCoordinate2D
被更新为使用浮动,或者添加了额外的属性,该怎么办?使用接受两种特定类型的
CLLocation
初始值设定项会更安全,并且是未来的证明。@CraigOtis目前除了坐标之外,还有其他几个属性。这就是为什么我更喜欢NSData的想法:不是为了证明未来,而是为了证明现在:-)-除了lat/lon之外,danh私有/内部属性?当有一个初始值设定项接受它实际需要的两个属性时,我看不出想要保存这些属性的理由。如果您已经保存了这些数据,用户升级了他们的设备软件,而您的from字节构造现在失败了,该怎么办?初始化器/API的全部好处是,内部结构/实现可以在不需要外部调用方知道的情况下进行更改。