【问题标题】:Incompatible Type for Argument 1 Objective-C参数 1 Objective-C 的不兼容类型
【发布时间】:2011-04-22 20:59:15
【问题描述】:

我有一个在核心数据存储中设置实体的函数。我曾经将所有值存储为 double 类型,但是现在我必须让它也适应 NSStrings。因此,我将函数接收的参数类型更改为 id 类型。但是,现在我得到了错误:

error: incompatible type for argument 1 of 'numberWithDouble:'

...在以下几行:

//...
[dfm setTimeStamp:[NSNumber numberWithDouble:value]];
//...
[[fetchedObjects objectAtIndex:0] setValue:[NSNumber numberWithDouble:value] forKey:@"timeStamp"];
//...

显然它不喜欢每行的 [NSNumber numberWithDouble:value] 段。我正在考虑制作一个包含 NSNumber 类型的容器类(Apple 不是已经有这样的类吗?)来解决这个问题,但我认为必须有一种我没有想到的更简单的方法(除了复制函数和更改 value 参数的类型)。有任何想法吗?提前致谢!

编辑:

这是函数声明:

-(void)setItemInDFMWhilePreservingEntityUniquenessForItem:(attribute)attr withValue:(id)value

attribute 只是一个枚举,它指定要存储在哪个实体中。问题是编译器给我的值是 id 类型的问题,理论上我可以传入任何我想要的东西,而且我相信我拥有它的方式我暗示我会将它作为 NSNumber 传递,但是编译器不喜欢这样,因为那实际上不是我想的类实例?

【问题讨论】:

    标签: objective-c cocoa-touch ios4 dynamic arguments


    【解决方案1】:

    问题是编译器是 给我价值的问题 输入id,理论上可以传入 任何我想要的,我相信这条路 我有它我暗示我会 将其作为 NSNumber 传递,但是 编译器不喜欢那样 实际上不是一个类实例我 假设?

    通过将value 声明为id,你可以传递任何你想要的object。但是,当 clearly documented 是一个对象时,为什么你“假设” NSNumber 不是一个对象?当您将 value 声明为 id 时,警告不是关于传递 NSNumber 实例 - 这是完全有效的,因为 id 表示“任何对象”,而 NSNumber 实例是一个对象。警告来自调用+numberWithDouble:,该方法将double 作为其第一个参数,并将value 传递给它,它被声明为id - 即一个对象。您不能将对象传递给需要双精度的方法。

    您提出的解决方案,使用(NSInteger)value 类型转换值将使警告静音,但不能解决问题。类型转换只是将对象指针指向的内存地址转换为整数值。如果(正如您的编辑所建议的) value 已经是一个 NSNumber 对象,您希望通过创建另一个对象或将其内存地址类型转换为整数来获得什么?做吧:

    [dfm setTimeStamp:value];
    

    【讨论】:

    • 是的,我的错误,认为 NSNumber 就像一个 NSUInteger 或 NSInteger。
    • 不,这正是您所说的首先想要的“容器类”类型。 :-)
    • 是啊,我问这个问题后才知道,呵呵。
    【解决方案2】:

    问题在于 value 变量。应该将其声明为双精度(原始)以使此调用成功。

    编辑:重读您的问题后,检查value 类型的函数,如果它是 NSString(使用[value isKindOfClass:[NSString class]]),则按原样存储它,如果不是,则为双精度(如果是这样)您传递的唯一两种类型)并按原样存储。

    【讨论】:

    • 你所说的都是真的,但它并没有解决我的直接问题。它在过去被声明为 double 并且很好,但是我现在需要传入不同类型的参数,所以我将 value 设置为 id 类型并且遇到了问题。请看我上面编辑的帖子。
    【解决方案3】:

    你不能只传递NSNumber而不是double吗?

    【讨论】:

      【解决方案4】:

      刚刚意识到我正在进行的调用 (numberWithDouble:) 正在让编译器检查原语,即双精度。将其更改为以下内容就像一个魅力:

      [dfm setTimeStamp:[NSNumber numberWithInteger:(NSInteger)value]];
      

      感谢回复的人!

      【讨论】:

      • 这并不像你认为的那样。您在这里所做的只是获取值指针的地址(所有 id 都是指针)并将其转换为具有类型转换的整数类型。类型转换会告诉编译器不要发出“不兼容类型”警告,但它不会解决您的问题,即 value 是指向对象的指针,而不是数值。
      • 感谢您指出这一点,我在您的回答中采纳了您的建议,并像魅力一样工作。
      猜你喜欢
      • 1970-01-01
      • 2011-04-14
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2022-01-12
      • 1970-01-01
      • 2018-02-27
      相关资源
      最近更新 更多