我正在编写一个能够访问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有正确答案。对于希望将来执行相同操作的任何人,请创建自定义初始值设定项以执行所有类型转换。
答案 0 :(得分:1)
您声明IsOnline
属性的类型为BOOL
,但您的setIsOnline:
方法采用NSString *
参数。它必须是BOOL
参数。
请记住,IsOnline
属性会产生合成方法:
- (BOOL)IsOnline;
- (void)setIsOnline:(BOOL)value;
与其他语言不同,Objective-C不支持方法重载。参数的数据类型不是方法名称的一部分。您的:
- (void)setIsOnline:(NSString *)value
方法与期望方法冲突。
您的setUserUrl:
方法也应该收到同样的错误,因为属性类型为NSURL *
,但您的方法需要NSString *
。我不确定你为什么没有这个问题。
如果您想要一个单独的方法来设置给定不同类型的属性,那么您应该有一个与标准属性setter方法名称不同的方法名称。
附注 - 标准做法是变量,属性和方法名称以小写字母开头,而不是大写字母。只有类应以大写字母开头。