Objective-C:属性类型转换的自定义setter警告

时间:2013-04-30 21:30:50

标签: ios objective-c setter

我正在编写一个能够访问API的客户端。 API吐出这个:

Id: 33,
UserUrl: "https://example.com/username/profile",
Title: "I wanna give 'em the holy boot!",
IsOnline: "no"

我将JSON用作NSDictionary,并使用setValuesForKeysWithDictionary:将其转换为我的User对象。我的User.m有自定义setter来获取传入的UserUrl字符串并将其弯曲成NSURL,如下所示:

- (void)setUserUrl:(NSString *)stringInput  {
    _UserUrl = [NSURL URLWithString:stringInput];
}

这很好用。当我尝试使用BOOL时,我会收到警告:

'setIsSecret:'实现中的冲突参数类型:'BOOL'(又名'signed char')vs'NSString * __ strong'

    - (void)setIsOnline:(NSString *)stringInput {
        if ([stringInput isEqualToString:@"yes"])
            _IsOnline = YES;
        else
            _IsOnline = NO;
    }

User.h

@interface Achievement : NSObject

    @property (strong, nonatomic) NSNumber *Id;
    @property (strong, nonatomic) NSURL *UserUrl;
    @property (strong, nonatomic) NSString *Title;
    @property (nonatomic) BOOL IsOnline;

@end

我的代码编译并运行正常,我只想知道为什么它会在BOOL属性上警告我,而不是NSString属性。这是一个API包装器,所以我不想压制警告。提前谢谢。

更新 rmaddy有正确答案。对于希望将来执行相同操作的任何人,请创建自定义初始值设定项以执行所有类型转换。

1 个答案:

答案 0 :(得分:1)

您声明IsOnline属性的类型为BOOL,但您的setIsOnline:方法采用NSString *参数。它必须是BOOL参数。

请记住,IsOnline属性会产生合成方法:

- (BOOL)IsOnline;

- (void)setIsOnline:(BOOL)value;

与其他语言不同,Objective-C不支持方法重载。参数的数据类型不是方法名称的一部分。您的:

- (void)setIsOnline:(NSString *)value

方法与期望方法冲突。

您的setUserUrl:方法也应该收到同样的错误,因为属性类型为NSURL *,但您的方法需要NSString *。我不确定你为什么没有这个问题。

如果您想要一个单独的方法来设置给定不同类型的属性,那么您应该有一个与标准属性setter方法名称不同的方法名称。

附注 - 标准做法是变量,属性和方法名称以小写字母开头,而不是大写字母。只有类应以大写字母开头。