Основные данные: определение типа и приведение его - PullRequest
1 голос
/ 15 марта 2010

Я настроил модель базовых данных, которая включает в себя сущность, Item с отношением 1-> M с абстрактной сущностью Place, чтобы у элемента было много мест. Есть несколько сущностей с родительским установленным на Place.

Я хочу настроить несколько элементов пользовательского интерфейса в зависимости от типов мест происхождения. У меня есть цикл, который выглядит примерно так:

for (Place *place in item.places) {

}

... но я не уверен, как определить, к какому типу относится это место, и как привести его к нужному типу, чтобы я мог получить доступ к его свойствам.

Спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 15 марта 2010

Вы можете определить, какое место находится с одним из нескольких вариантов:

  1. Вы можете позвонить [[object entity] name], чтобы определить имя ребенка
  2. Если у вас есть подклассы NSManagedObject для этих детей, вы можете проверить его класс, используя [object isKindOfClass:[XXXX class]]

Поскольку абстрактные сущности никогда не могут быть созданы, лучше всего ссылаться на результаты вашего запроса как id или NSManagedObject, а затем определять, с каким потомком вы имеете дело. Таким образом, концептуально вы никогда не запутаетесь в том, что вы можете и не можете создавать.

Также в качестве обновления к этому вам не нужно приводить объект, если вы ссылаетесь на него как id. id полезен в качестве подстановочного знака в этих ситуациях, и ему будет доверено / предполагается, что он принимает любое сообщение (вызов метода) любого класса, о котором знает вызывающий класс ( т.е. , который был ранее импортирован в Это очень полезно в тех случаях, когда вы имеете дело с несколькими дочерними объектами.

2 голосов
/ 15 марта 2010

Не совсем уверен, что вы спрашиваете, но звучит так, как будто у вас есть коллекция объектов, которые являются подклассами 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, чтобы понять разницу, вы можете использовать любой из них в зависимости от обстоятельств.

(Вы можете заменить «id object» на «Place * object», я просто использовал id в своем коде. - edit: или, может быть, вы не можете, если он абстрактный, см. Комментарий mzarra. «Id» работает отлично .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...