簡體   English   中英

帶有“描述”鍵的鍵值編碼

[英]Key-Value Coding with a key of 'description'

我正在使用鍵值編碼來簡化模型類的更新實例:

@interface NewsItem : NSObject 
{

}

@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *description;
@property (nonatomic, copy) NSString *link;
@property (nonatomic, copy) NSString *date;

使用:

SEL selectorName = NSSelectorFromString(elementName);
if ([self.newsItem respondsToSelector:selectorName])
{
    NSString *sanitisedElement = [self sanitiseElement:self.currentElementData];
   [self.newsItem setValue:sanitisedElement forKey:elementName];
}

這很有效,但'description'屬性對我來說沒有'聞到',因為它覆蓋了基本的NSObject描述getter(+(NSString *)描述)。 如果現在調用描述getter,當調用者期望對類的描述時,它將返回不相關的信息。

是否可以安全地繼續進行此類的鍵值編碼(假設我被外部數據源綁定到這些屬性名稱)? 或者更改屬性名稱並手動檢查鍵/設置值是否明智?

您可以覆蓋班級中的description 此方法通常僅用於調試,並且調用者無法期望該方法的特定輸出。

但是我在代碼中看到了更多常見問題。 僅檢查具有給定名稱的方法是否存在。 這並不意味着此方法對應於屬性,即使這樣,也不意味着該屬性存在setter。

例如,每個NSObject響應選擇器“init”,因此如果外部數據源將該鍵作為“elementName”發送,則代碼會立即崩潰。

因此,需要明確的“已知密鑰”列表。 但是,您也可以使用從外部元素名稱到內部屬性的映射( NSDictionary )來避免任何沖突。

我認為你將方法與屬性混淆在一起,而你正在使事情變得更加復雜。

足夠了,給定一個直接包含setter名稱的elementName (即: setDate ),你調用傳遞該參數的對象參數的選擇器:

SEL selectorName = NSSelectorFromString(elementName); // elementName something like "setDate"
if ([self.newsItem respondsToSelector:selectorName])
{
    [self.newsItem performSelector: selectorName withObject: sanitisedElement];
}

至於描述方法,它已經覆蓋了NSObject的描述,所以你有兩個選擇:用另一種方式命名,或者保持原樣,並在需要對象描述時在super上調用它,在Objective的幫助下-C運行時:

struct objc_super superclass= { self.newItem, [self.newItem superclass] };
NSString* desc= objc_msgSendSuper(&superclass, @selector(description));

您始終可以覆蓋繼承的方法。 通過創建一個getter與An inherited方法的簽名相同的屬性,您將覆蓋它。

這不好嗎? 如果您的實現對調試沒有用,請單擊是。

作為KVC和KVO目的的最佳實踐,避免可能與常見的繼承方法屬性和ivars沖突是一個好主意。 常見的方法是制作更長的屬性和方法名稱,並使它們更有可能是唯一的。 一種常見的方法是在您的所有類或框架或代碼前加上常用的縮寫。

使用Apple常用的東西可能會讓您難以接受並且難以調試。 在涉及核心數據時,這樣做尤其糟糕。 不要不願意把事情做得更久。 代碼完成將為您輸入。 另外,類特定前綴的一個很好的副作用不僅是偽命名空間偽,而且特定於類的屬性,變量,常量和方法在代碼完成時會先冒泡。

暫無
暫無

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

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