2010-05-17 83 views
9

我正在使用核心數據作爲其後端管理SQLite記錄的應用程序。我有一切工作與字符串和數字,但只是嘗試添加BOOL字段,似乎無法讓事情工作。核心數據和布爾設置

在.xcdatamodel中,我在我的對象中添加了一個名爲isCurrentlyForSale的字段,該字段不是可選的,不是可變的,也不是索引的。屬性的類型設置爲布爾值,默認值爲NO。

當我從數據模型創建的類文件,添加了該屬性在.H頭中的樣板代碼是:

@property (nonatomic, retain) NSNumber * isCurrentlyForSale; 

@dynamic isCurrentlyForSale; 

沿.M實施文件。

我一直使用布爾作爲簡單布爾。我讀過我可以使用NSNumber的numberWithBoolboolValue方法,但是這對於如此簡單的事情來說似乎是一大堆額外的代碼。

標題中的@property可以更改爲簡單的BOOL嗎?如果有,還有什麼需要注意的?

感謝 -John

回答

2

簡單迴應:不,你不能改變@property聲明返回一個BOOL

雖然你可以寫一些簡單的包裝。我會重新命名屬性currentlyForSale(這意味着它產生currentlyForSalesetCurrentlyForSale:),然後寫兩個包裝:

- (BOOL) isCurrentlyForSale { 
    return [[self currentlyForSale] boolValue]; 
} 

- (void) setIsCurrentlyForSale:(BOOL)forSale { 
    [self setCurrentlyForSale:[NSNumber numberWithBool:forSale]]; 
} 
+0

二傳手也不應該有一個「是」在其中。這就是爲什麼'@ property'具有'getter ='設置的原因。是的,您可以通過使用屬於Core Data的原始訪問器將「@屬性」更改爲BOOL。 – 2010-05-18 15:55:56

+0

@Marcus是的,我知道setters不應該在它們中包含'Is',但是我已經把它放入了,因爲'setCurrentlyForSale:'已經被CD使用了(我知道'getter ='和'setter ='。你是說你可以在標題中將'NSNumber *'更改爲'BOOL',它會起作用嗎?那肯定會讓我感到驚訝。 – 2010-05-18 16:09:14

30

儘管戴夫德隆的答案是接近的,你其實可以做到這一點,而不必更改名稱財產。

可以更改屬性返回BOOL但您需要手動編寫存取方法,他們有點不同於戴夫在他的迴應。

首先你@property應該被定義爲:

@property (nonatomic, getter=isCurrentlyForSale) BOOL currentlyForSale; 

然後在您的實現文件,而不是聲明@dynamic屬性,直接創建訪問器。

- (BOOL)isCurrentlyForSale 
{ 
    [self willAccessValueForKey:@"currentlyForSale"]; 
    BOOL b = [[self primitiveValueForKey:@"currentlyForSale"] boolValue]; 
    [self didAccessValueForKey:@"currentlyForSale"]; 
    return b; 
} 

- (void)setCurrentlyForSale:(BOOL)b 
{ 
    [self willChangeValueForKey:@"currentlyForSale"]; 
    [self setPrimitiveValue:[NSNumber numberWithBool:b] forKey:@"currentlyForSale"]; 
    [self didChangeValueForKey:@"currentlyForSale"]; 
} 

隨着這些訪問你的對象將處理您的拳擊,你可以訪問它的原始值。此外,以setIs開頭的setter不是一個好主意,因此在示例代碼中將其刪除。

+0

+1啊,我現在明白你的意思了。我以爲你暗示你可以將'@ property'改爲'BOOL',而不是實現自定義方法。順便說一下,制定者稍微不正確。只有當新值實際上不同時(即,你需要一個if語句),纔會調用'(will | did)ChangeValueForKey:'。 – 2010-05-18 16:51:16

+0

優秀的例子和解釋 - 謝謝Marcus! – 2012-04-12 19:55:52

+0

我唯一要補充的是,我喜歡使用NSString常量作爲關鍵字名稱,它可以節省以後排除打印錯誤的麻煩。 'NSString * const CurrentlyForSale = @「currentlyForSale」;' – Eric 2012-09-20 22:20:10