簡體   English   中英

Objective-C:用於屬性類型轉換的自定義設置器警告

[英]Objective-C: Custom setter warnings for property type conversion

我正在編寫一個使用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具有自定義設置器,以接收傳入的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;
    }

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屬性會生成synthesize方法:

- (BOOL)IsOnline;

- (void)setIsOnline:(BOOL)value;

與其他語言不同,Objective-C不支持方法重載。 參數的數據類型不是方法名稱的一部分。 你的:

- (void)setIsOnline:(NSString *)value

方法與期望的方法沖突。

由於屬性類型為NSURL *但是您的setUserUrl:方法也應該遇到相同的錯誤,但是您的方法使用NSString * 我不確定您為什么沒有這個問題。

如果要使用單獨的方法來設置給定其他類型的屬性,則應使用與標准屬性設置器方法名稱不同的方法名稱。

旁注-變量,屬性和方法名稱以小寫字母而不是大寫字母開頭是標准做法。 只有類應該以大寫字母開頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM