属性类型转换的自定义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对象。我的用户。m有自定义的setter来接收传入的UserUrl字符串,并将其弯曲成NSURL,如下所示:

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

这很好。当我对BOOLs尝试同样的操作时,我得到一个警告:

'setIsSecret:': 'BOOL'(又名'signed char')与'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包装器的,所以我不希望隐藏警告。提前谢谢。

UPDATE rmaddy有正确答案。对于那些希望在将来做同样事情的人来说,创建一个自定义初始化器来完成所有类型转换。

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

请记住,IsOnline属性导致了合成方法:

- (BOOL)IsOnline;
- (void)setIsOnline:(BOOL)value;
与其他语言不同,Objective-C不支持方法重载。参数的数据类型不是方法名的一部分。你:
- (void)setIsOnline:(NSString *)value

方法与期望的方法冲突。

你应该得到你的setUserUrl:方法同样的错误,因为属性类型是NSURL *,但你的方法需要一个NSString *。我不明白你为什么对那个没有意见。

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

旁注——变量、属性和方法的名字以小写字母开头,而不是大写字母,这是标准做法。只有类以大写字母开头

最新更新