1

我正在编写一个访问 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 有自定义设置器来获取传入的 UserUrl 字符串并将其弯曲成 NSURL,如下所示:

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

这工作正常。当我尝试对 BOOL 进行相同操作时,会收到警告:

'setIsSecret:' 实现中的参数类型冲突:'BOOL' (aka 'signed char') vs 'NSString *__strong'

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

用户.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 有正确的答案。对于希望在未来做同样事情的任何人,创建一个自定义初始化程序来完成所有类型转换。

4

1 回答 1

1

您将IsOnline属性声明为具有类型,BOOL但您的setIsOnline:方法需要一个NSString *参数。它必须是一个BOOL参数。

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

- (BOOL)IsOnline;

- (void)setIsOnline:(BOOL)value;

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

- (void)setIsOnline:(NSString *)value

方法与期望的方法冲突。

您的setUserUrl:方法也应该得到相同的错误,因为属性类型是NSURL *,但您的方法采用NSString *. 我不确定为什么你对那个没有问题。

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

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

于 2013-04-30T21:41:24.000 回答