基元的通用返回类型

时间:2011-03-09 14:49:50

标签: iphone objective-c xcode return-value primitive-types

是否存在“any primitive”的返回类型,类似于使用NSObject作为任何对象的返回类型的方式?我尝试使用id,但编译器给了我一个错误,它试图将基元转换为引用。

这就是我想要做的。 :

-(void)setObject:(NSObject*)obj forKey:(NSString*)key {
    [sharedInstance.variables setObject:obj forKey:key];
}


-(NSObject*)getObjectForKey:(NSString*)key {
    return [sharedInstance.variables objectForKey:key];
}


-(void)setValue:(???)value forKey:(NSString*)key {
    [sharedInstance.variables setValue:value forKey:key];
}


-(???)getValueForKey:(NSString*)key {
    return [sharedInstance.variables valueForKey:key];
}

我的替代方法是使用单独的方法(getIntForKey,getFloatForKey等)来访问值。

3 个答案:

答案 0 :(得分:1)

1)在XCode文档中读取键值编码文章 - 所有答案都在那里

2)有一个对象NSValue,它类似于你的“NSObject”。 NSValue可以在其内部存储普通旧数据。

PS

“标量和结构支持 键值编码通过自动换行和解包NSNumber和NSValue实例值,为标量值和数据结构提供支持。 将数据表示为对象 valueForKey:和setValue:forKey的默认实现:支持非对象数据类型(标量和结构)的自动对象包装。 一旦valueForKey:确定了用于为指定键提供值的特定访问器方法或实例变量,它将检查返回类型或数据类型。如果要返回的值不是对象,则为该值创建NSNumber或NSValue对象,并在其位置返回。 类似地,setValue:forKey:确定指定键的相应访问者或实例变量所需的数据类型。如果数据类型不是对象,则使用适当的-Value方法从传递的对象中提取值。“

答案 1 :(得分:0)

我原本以为id也是这里的完美候选人......这可能只是你看到的一个演员问题吗?

即。 id隐含地暗示了一个指针所以我认为id是一个等同于c void*的客观c

换句话说,如果你有一个NSObject *,你可以用id替换它,比如

-(NSObject*)myMethod1
{
}

可以使用

对任何返回的原语进行操作
-(id)myMethod1
{
}

即。不是id*

此外,我希望这只是一个复制/粘贴的东西,但是它也会导致问题

-(void)setValue:(???)value forKey:(NSString*)key {
    [sharedInstance.variables setValue:num forKey:key];
}

应该是

-(void)setValue:(???)value forKey:(NSString*)key {
    [sharedInstance.variables setValue:value forKey:key];
}

答案 2 :(得分:0)

我最终解决了这个问题。最终的解决方案是每种类型都有单独的accessor / mutator方法。现在我有setIntForKeysetBoolForKeygetIntForKeygetBoolForKey等等。缺点非常明显,因为我无法调用一种方法来设置值和另一个来检索它们。然而,优点很多。因为编译器知道方法在编译时期望的对象或基本类型,所以我获得了所有这些方法的编译时检查。另外,我不必担心将检索到的值转换为原始类型(显然返回的NSObjects是另一个故事)。