将float类型发送到不兼容类型id的参数

4
我正在创建一个按钮,使用核心数据来保存点注释的名称、x坐标和y坐标。我可以成功地保留名称,但是当我尝试保存坐标时,我一直得到这个错误。我已经记录了正确的数据,只是似乎无法保存它。
当我尝试为新POI设置值时,我会收到一个错误,内容如下:将“float”发送到不兼容类型“id”的参数。
在数据模型中,属性被设置为float。self.latitude和self.longitude是float类型。
我的方法有点粗糙,因为我相对较新,在这方面还请您提供反馈。以下是我的方法代码。我不明白'id'在这里出现的原因。
-(void) saveSelectedPoiName:(NSString *)name withY:(float)yCoordinate withX:(float)xCoordinate{
    self.pointFromMapView = [[MKPointAnnotation alloc] init];
    self.annotationTitleFromMapView = [[NSString alloc] init];

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];

    self.annotationTitleFromMapView = name;
    self.latitude = yCoordinate;
    self.longitude = xCoordinate;

    NSEntityDescription *entityPOI = [NSEntityDescription entityForName:@"POI" inManagedObjectContext:context];
    NSManagedObject *newPoi = [[NSManagedObject alloc] initWithEntity:entityPOI insertIntoManagedObjectContext:context];
    //create new POI record
    [newPoi setValue:name forKey:@"name"];
    [newPoi setValue:yCoordinate forKey:@"yCoordinate"]; <---error happens here for yCoordinate.

    NSError *saveError = nil;

    if (![newPoi.managedObjectContext save:&saveError]) {
        NSLog(@"Unable to save managed object");
        NSLog(@"%@, %@", saveError, saveError.localizedDescription);
    }
}

通常,声明正在寻找类型为id的参数的消息是在寻找引用/对象。 - BonanzaDriver
你知道为什么会出现这个错误吗?具体地说是什么原因? - Alex Blair
就像我之前提到的那样,如果我要猜的话,可能是因为你没有传递一个对象(setValue:)。 - BonanzaDriver
我现在明白了。Float是一种基本类型,而NSManagedObject属性需要是对象。我想我需要将该值包装在NSNumber中。 - Alex Blair
1个回答

17

Core Data中的NSManagedObject属性必须是对象,而不是基本类型。在这种情况下,我们的yCoordinate是float类型。为了对float类型进行setValue:,您必须首先将该值包装在NSNumber中。

[newPoi setValue:[NSNumber numberWithFloat:someFloat] forKey:@"yCoordinate"];

对比。

[newPoi setValue:someFloat forKey:@"yCoordinate"];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接