【问题标题】:How to disable accessor return type warnings?如何禁用访问器返回类型警告?
【发布时间】:2012-05-04 13:54:50
【问题描述】:

我有一个内部必须是不同类型的对象,但我总是想以字符串的形式返回。所以我将对象声明为“id”并编写了一个始终返回 NSString* 的 getter 方法。一切正常,XCode 按预期抱怨“属性类型'X'与访问器类型'setX:'不匹配”。既然我确实想要这种行为,那么有人知道如何告诉 XCode 我确实想要这种行为,并且不想一直看到这个警告吗?有点像未使用变量的“__unused”指令?

谢谢! 最大

编辑:这是代码

.h

@property (strong,nonatomic) id wert;
- (void) setWert:(NSString *)value;
- (NSString *) wert;

.m

 @synthesize wert;

- (void) setWert:(NSString *)value
{
        wert = value;
}

- (NSString *) wert
{
        return wert;
}

【问题讨论】:

  • 您可以发布您遇到问题的代码吗?
  • 我似乎无法重现此错误。你能发布代码和确切的错误信息吗?
  • 在原帖中添加了代码示例。错误消息是“属性类型 'wert' 与访问器类型 'setWert:' 不匹配”
  • @Max 我仍然无法重新创建它。您可能必须创建一个示例项目并隔离问题。您使用的是最新版本的 Xcode 吗?
  • @joerick 非常感谢您的帮助!我在这里上传了一个示例项目:filedropper.com/test_22

标签: objective-c xcode warnings getter-setter accessor


【解决方案1】:

问题在于以下几行:

@interface TestClass : NSObject

@property (strong, nonatomic) id wert;

- (void) setWert:(NSString *)value;
- (NSString *) wert;

@end

基本上,@property 表示法是声明访问器方法的简写(诚然,具有一些属性)。所以在这里先声明为id,然后声明为NSString 是没有意义的。确定要为 wert 公开的类型,并将其用于属性声明。我建议:

@interface TestClass : NSObject

@property (strong, nonatomic) id wert;

@end

此外,在.m 中,您首先@synthesize 属性,然后覆盖getter 和setter。这意味着您从 @synthesize 获得的唯一东西就是实例变量。

您也可以在@implementation 块中声明实例变量。这将是您声明内部类型的好地方:

@implementation TestClass
{
    NSString *wert;
}

但是,如果您对其他类调用 setWert: 而不是 NSString 感到高兴,那么您不应该更改 setter 的类型声明。这样做会假设value 是一个NSString。所以你的访问器应该是这样的:

- (void) setWert:(id)value
{
    // store wert as an NSString
}

- (id) wert
{
    // return wert as the original type
}

@end

【讨论】:

  • 非常感谢,我确实误解了@property 做了什么。即便如此,在@implementation 中将实例变量声明为id wert 会导致'NSInvalidArgumentException', reason: '-[__NSCFString stringValue]: unrecognized selector sent to instance...' 崩溃。我不知道为什么这不起作用,但以前的方式。至于访问器方法,value 始终是字符串,对于外界来说,wert 应该看起来像一个 NSString,但在内部,它是并且应该是一堆不同的对象——从 NSInteger 到 NSDate。也许这并不理想,但为什么在那之前它起作用了?
  • 好吧,看来我当时搞错了。将属性声明为 NSString(包括 setter 和 getter),然后将实例变量声明为 id。至于你的崩溃,这是一个不同的问题,你一定是在某个地方改变了你的逻辑。
  • 这也不起作用,然后我在 getter 方法的其他地方遇到错误:“没有可见的 @interface for 'NSString' 声明了选择器'decimalValue'”。这有点奇怪。也许我应该忍受这些警告,但我真的很感谢你的帮助!
  • 可能,但在哪里?我想我会留下它,毕竟它正在工作。谢谢你的帮助,乔里克!
【解决方案2】:

NSString * 设置为和id 类型化属性不会导致警告,但将id 类型化变量设置为NSString * 属性将...您可以使用类型转换来解决...

id someVar = @"string";
someObject.setStringProperty = (NSString *)someVar;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多