gpt4 book ai didi

objective-c - 将消息发送到 (id *) 变量或使用 (id *) 参数的正确方法

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:30 24 4
gpt4 key购买 nike

我编写的 Core Data 验证方法无法编译。我可以修改该方法以便它编译...但随后出现运行时错误。该方法的两个版本如下(注意第二个版本中缺少的“*”)。此版本编译但给出运行时错误“+[NSCFNumber doubleValue]:无法识别的选择器发送到类 0x7fff70a448e8”:

- (BOOL)validateInitialValue:(id *)value error:(NSError **)error {
if ( *value == nil ) {
return YES;
}
if ( [*value doubleValue] < 0.0 ) {
return NO;
}
return YES;
}

此版本提供编译器警告和错误(请参阅下面的警告和错误):

- (BOOL)validateInitialValue:(id *)value error:(NSError **)error {
if ( value == nil ) {
return YES;
}
if ( [value doubleValue] < 0.0 ) {
return NO;
}
return YES;
}

编译器错误和警告:

warning: Semantic Issue: Receiver type 'id *' is not 'id' or interface pointer, consider casting it to 'id'
warning: Semantic Issue: Method '-doubleValue' not found (return type defaults to 'id')
error: Semantic Issue: Invalid operands to binary expression ('id' and 'double')

我终于想到问题可能出在调用代码上:

- (void)setInitialValue:(NSNumber *)initialValue {
[self willChangeValueForKey:@"initialValue"];
[self validateValue:initialValue forKey:@"initialValue" error:nil];
[self setPrimitiveInitialValue:initialValue];
[self didChangeValueForKey:@"initialValue"];
}

我将调用者更改为在 initialValue 之前使用“&”并使用该方法的第一个版本,一切正常。所以新的调用代码将一行更改为:

    [self validateValue:&initialValue forKey:@"initialValue" error:nil];

但是“&”真的有必要吗?? setPrimitiveInitialValue 不使用“&”。我觉得我对 Objective-C 的理解还不够深入,你们所有的专家都会发现这是一个简单的问题,但答案非常直接。

最佳答案

id 本身代表一个指针。因此,当您使用 id * 时,您实际上指的是指向指针的指针。 this第一部分优秀的教程解释了这个概念。

很有可能,这就是您正在寻找的:

- (BOOL)validateInitialValue:(id)value error:(NSError **)error {
if ( value == nil ) {
return YES;
}
if ( [value doubleValue] < 0.0 ) {
return NO;
}
return YES;
}

关于objective-c - 将消息发送到 (id *) 变量或使用 (id *) 参数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6738582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com