Ios 目标C:属性类型转换的自定义设置程序警告

Ios 目标C:属性类型转换的自定义设置程序警告,ios,objective-c,setter,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:将其转换为我的用户对象。My User.m具有自定义设置程序,用于获取传入的UserUrl字符串并

我正在编写一个符合API的客户端。API给出了以下内容:

Id: 33,
UserUrl: "https://example.com/username/profile",
Title: "I wanna give 'em the holy boot!",
IsOnline: "no"
我将JSON作为NSDictionary使用,并使用setValuesForKeysWithDictionary:将其转换为我的用户对象。My User.m具有自定义设置程序,用于获取传入的UserUrl字符串并将其弯曲为NSURL,如下所示:

- (void)setUserUrl:(NSString *)stringInput  {
    _UserUrl = [NSURL URLWithString:stringInput];
}
这个很好用。当我尝试同样的方法时,我得到一个警告:

在实现“setIsSecret:”:“BOOL”(又名“signed char”)与“NSString*”时,参数类型发生冲突。

    - (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得到了正确的答案。对于希望在将来执行相同操作的任何人,请创建一个自定义初始值设定项来执行所有类型转换。

您可以声明
IsOnline
属性的类型为
BOOL
,但
setIsOnline:
方法采用
NSString*
参数。它需要是一个
BOOL
参数

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

- (BOOL)IsOnline;

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

- (void)setIsOnline:(NSString *)value
方法与expect方法冲突

由于属性类型为
NSURL*
,但您的方法采用的是
NSString*
,因此您的
setUserUrl:
方法也应该会遇到相同的错误。我不知道你为什么对那件事没有异议

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


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

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

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

- (BOOL)IsOnline;

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

- (void)setIsOnline:(NSString *)value
方法与expect方法冲突

由于属性类型为
NSURL*
,但您的方法采用的是
NSString*
,因此您的
setUserUrl:
方法也应该会遇到相同的错误。我不知道你为什么对那件事没有异议

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


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

我想我可以重载setter(好吧,我想我技术上可以,因为代码运行得很好)。我现在真的很好奇为什么NSString/NSURL属性没有给我同样的警告。我发现警告只在尝试从和对象转换为基本体时发生,而不是在对象之间转换时发生。无论如何,这是有帮助的。谢谢你的风格说明。我想我可以猜到你的NSString/NSURL属性“有点”起作用,因为它们都是对象。但我敢打赌,如果您实际将
NSURL
值分配给属性,则会调用setter,代码也会崩溃,因为您最终会将
NSURL
对象传递给
URLWithString:
方法。试试看。是的,由于“NSInvalidArgumentException”崩溃,原因:“-[NSURL length]:发送到实例的选择器无法识别。我添加了一个客户初始值设定项,使这一点更加清晰。我想我可以重载setter(好吧,我想我技术上可以,因为代码运行得很好)。我现在真的很好奇为什么NSString/NSURL属性没有给我同样的警告。我发现警告只在尝试从和对象转换为基本体时发生,而不是在对象之间转换时发生。无论如何,这是有帮助的。谢谢你的风格说明。我想我可以猜到你的NSString/NSURL属性“有点”起作用,因为它们都是对象。但我敢打赌,如果您实际将
NSURL
值分配给属性,则会调用setter,代码也会崩溃,因为您最终会将
NSURL
对象传递给
URLWithString:
方法。试试看。是的,由于“NSInvalidArgumentException”崩溃,原因:“-[NSURL length]:发送到实例的选择器无法识别。我添加了一个客户初始值设定项,使它更简洁。