2010-03-15 54 views
0

我已經建立了一個核心數據模型,該模型包含一個與抽象實體Place具有1-> M關係的實體Item,以便項目有很多地方。有幾個實體的父項設置爲Place核心數據:檢測類型並鑄造它

我想根據後代地點類型設置多個UI元素。我有一個循環,看起來是這樣的:

for (Place *place in item.places) { 

} 

...但我不知道如何檢測的地方是什麼類型,以及如何將它轉換爲正確的類型,這樣我可以訪問它的屬性。

感謝您的幫助!

回答

2

不完全確定你在問什麼,但聽起來像你有一個Place對象的子集的集合,並且你需要在運行時檢測具體類型。

這裏是你怎麼做的分支和鑄造:

for (id object in item.places) { 
    if ([object isKindOfClass:[SomeConcretePlace class]]) { 
     ((SomeConcretePlace *)object).someProperty = something; 

    } else if ([object isKindOfClass:[AnotherConcretePlace class]]) { 
     somethingElse = ((AnotherConcretePlace *)object).someProperty; 
    } 
} 

一定要看看文檔的isKindOfClass:和isMemberOfClass:在NSObject的參考理解上的差異,您可以使用視情況而定。你可以用「Place * object」替代「id object」,我只是在我的代碼中使用了id - 編輯:或者如果它是抽象的,請參閱mzarra的評論。精)

2

您可以確定是幾個選項中的一個什麼地方。

  1. 您可以撥打[[object entity] name]確定孩子
  2. 的名稱。如果你有子類NSManagedObject這些孩子,那麼你可以使用[object isKindOfClass:[XXXX class]]

由於抽象實體永遠無法實例化,因此最好將查詢結果引用爲idNSManagedObject,然後從中確定要處理的是哪個孩子。這樣,從概念上講,您永遠不會對您可以實現和無法實例化的東西感到困惑。

此外,作爲對此的更新,如果將其引用爲id,則不需要投射該對象。 id在這些情況下作爲通配符是有用的,並且將被信任/假定接受任何呼叫類知道的任何類的消息(方法調用)(,這已經被先前導入類中。在這種情況下,你正在處理多個子對象

+0

鑄造是有用的,所以你可以直接使用屬性的方式,我已經表明,沒有強制轉換,如果你只是嘗試做object.property如果對象是「身份證」,通過施放,你會獲得很好的完成屬性和所有其他的好處 – Jaanus 2010-03-15 22:01:18

+0

只有當你使用從基礎到目標的免費橋接時,施放纔是必要的當你處理'身份證'時,你可以調用調用對象知道的任何消息,這是一個核心pri Objective-C背後。如果您收到警告或錯誤,那是因爲您沒有爲您正在調用的課程導入標題。你也可以完成沒有套管的類型完成。當然,如果你不使用點語法,那麼你的問題就更少了,而且更具靈活性。 – 2010-03-15 23:46:29

+0

是的,你可以在「ID」上打任何消息。但是使用點語法的屬性在不投射的情況下似乎是不可能的。它們可以很好地處理id和KVC,但是當我嘗試語法「objectWithTypeId.property」時,我得到了一個沒有強制轉換的錯誤,並且它可以在強制轉換時正常工作。我有所有必要的進口。 – Jaanus 2010-03-16 01:08:28