不能在 NSManagedObject 中存储双倍
Posted
技术标签:
【中文标题】不能在 NSManagedObject 中存储双倍【英文标题】:Cant store double in NSManagedObject 【发布时间】:2014-08-29 13:09:06 【问题描述】:尝试在对象中存储双精度时出现错误
error Sending 'double' to parameter of incompatible type 'id'
我的代码是:
NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Contacts" inManagedObjectContext:context];
[newDevice setValue:longitudes forKey:@"longitude"];
[newDevice setValue:latitudes forKey:@"latitude"];
setValue:longitudes
longitudes 是 double 类型。
【问题讨论】:
longitudes
和latitudes
的类型是什么?
[newDevice setValue:@(longitudes) forKey:@"longitude"];
和 [newDevice setValue:@(latitudes) forKey:@"latitude"];
,也许?
好的,您不能将原始类型的值传递给-setValue:forKey:
方法。值应该是 id 类型(任何 Objective-c 类)。 Ho to cast double to NSNumber 已在其他答案中显示。
附带说明:您可以继承 NSManagedObject(使用 XCode 的生成器)。然后,您将拥有显式类型的属性,这使开发更容易。
【参考方案1】:
你需要使用 NSNumber 来存储双精度值。
NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Contacts" inManagedObjectContext:context];
[newDevice setValue:@(longitudes) forKey:@"longitude"];
[newDevice setValue:@(latitudes) forKey:@"latitude"];
所以它应该可以工作。
你也可以写:
NSNumber *longitudesNumber = [NSNumber numberWithDouble:longitudes];
NSNumber *latitudesNumber = [NSNumber numberWithDouble:latitudes];
[newDevice setValue: longitudesNumber forKey:@"longitude"];
[newDevice setValue: latitudesNumber forKey:@"latitude"];
更好理解:)
要显示,你可以使用:
NSNumber *number = ...(your object);
label.text = [NSString stringWithFormat:@"%@", number];
label.text = [NSString stringWithFormat:@"%f", [number doubleValue]];
【讨论】:
@Matz 再问一个问题,如果我想将 label.text 转换为 double 可能吗?? @Matz [newDevice setValue:self.longitudelable.text forKey:@"descrip"]; 我想将此行添加到上面我首先发布的对象中,但我需要的值是一个标签,我想将其转换为双精度以便将其保存在数据库中 好的。使用 @([self.longitudelable.text doubleValue]) 并将其放入您的对象中。 我想将 longitudelabel 转换为 double 有没有办法做到这一点?【参考方案2】:你可以这样做
[newDevice setValue:[NSNumber numberWithDouble:longitudes] forKey:@"longitude"];
[newDevice setValue:[NSNumber numberWithDouble:latitudes] forKey:@"latitude"];
【讨论】:
如果我想将 label.text 转换为 double 是否有可能?? 是的,你可以像这样转换它 double aDval = [label.text doubleValue];【参考方案3】:您的代码:
[newDevice setValue:longitudes forKey:@"longitude"];
...正在使用key-value coding method 来设置值,并且键值编码方法需要值对象。这是setValue:forKey:
的方法签名:
- (void)setValue:(id)value forKey:(NSString *)key
发生异常是因为您将 double 传递给 value 参数。您的 NSManagedObject 子类可以并且应该使用标量而不是 NSNumber 来表示双精度数,如果不先将值包装在 NSValue 类中,就不能使用setValue:forKey:
。但是,您可以使用传统符号或点符号来设置双精度值:
[newDevice setLongitude:longitudes];
或
newDevice.longitude = longitudes;
【讨论】:
以上是关于不能在 NSManagedObject 中存储双倍的主要内容,如果未能解决你的问题,请参考以下文章
将 NSManagedObject 存储在字典中(NSDictionary)
为啥我不能在 NSManagedObject 子类计算属性中使用关系? (核心数据,迅速)
NSManagedObject 和 Codable 用于存储在服务器和本地存储中的类
NSManagedObject 不能符合 Swift 中的协议