2011-09-22 68 views
2

總之,我正在尋找正確的謂詞格式來索引對象的字典屬性。關鍵字路徑爲謂詞中的對象的字典屬性的元素?

我有一個myObject實例數組,每個都有一個屬性CPDictionary(NSMutableDictionary)extAttributes,我試圖允許基於extAttributes中的值進行過濾。我正在定義我的謂詞如下

[CPPredicate predicateWithFormat:@"extAttributes[%K] like[c] %@",key,val] 

我不知道什麼是正確的鍵路徑會是這樣。閱讀關於NSPredicate的文檔,似乎「extAttributes [%k]」可能是數組索引,而不是字典。我已經嘗試了幾種選擇,這是唯一一個不會出錯的選擇。在檢查結果對象時,謂詞對象中的表達式看起來是正確的。但是,它沒有預期的結果。

+0

我通過實施'解決了這個 - (ID)valueForUndefinedKey:(ID)key'上myObject的。 ' - (id)valueForUndefinedKey:(id)key {ret = [extAttributes objectForKey:key]; return ret; } ' 然後它就是'[CPPredicate predicateWithFormat:@「%K like [c]%@」,key,val];' – jlujan

+0

這是一個破解。不要這樣做。使用關鍵路徑。 – jlehr

+0

這是它的一個副作用,它已經實現了將隨機列添加到表視圖。正確的關鍵路徑是什麼? – jlujan

回答

3

看起來你可能會混淆數組和字典引用。只需使用一個關鍵路徑(點分隔的元素名稱)來引用嵌套元素或對象的屬性,在概念上是這樣的:

[CPPredicate predicateWithFormat:@"%K like[c] %@", @"extAttributes.myNestedElementName", val]; 

再說,我不是那麼熟悉卡布奇諾,所以我不知道他們在這裏做了些什麼稍微不同的事情,但這是它在Cocoa和Cocoa touch中的工作方式。

編輯

要計算動態的關鍵,所有你需要做的就是組成一個關鍵路徑字符串:

var keyPath = [CPString stringWithFormat:@"%@.%@", @"extAttributes", key]; 

您現在可以創建謂詞如下:

[CPPredicate predicateWithFormat:@"%K like[c] %@", keyPath, val]; 

編輯

可可/可可觸摸的等效代碼如下:

NSString *keyPath = [NSString stringWithFormat:@"%@.%@", @"extAttributes", key]; 
[NSPredicate predicateWithFormat:@"%K like[c] %@", keyPath, val]; 
+0

謝謝,但我不認爲這會做我所要的。我不確定你的例子中有什麼'myNestedElementName',或者我可能會誤解。 '[[myObject extAttributes] objectForKey:key]'將會正常使用。我已經嘗試過[CPPredicate predicateWithFormat:@「extAttributes。%K like [c]%@」,key,val];'這也不起作用。 – jlujan

+1

我會在我的答案中添加一些額外的細節來澄清。 – jlehr

+0

這就是機票!謝謝。 – jlujan