2010-04-20 3 views
0

Я хочу реализовать класс, который может использоваться двумя классами моего проекта.Использование типа 'id' в классе какао

Один из них манипулирует объектами «NewsRecord». Один из них манипулирует объектами «GalleryRecord».

В другом классе, я могу использовать один из двух объектов, так что я сделать что-то вроде этого:

// header class 
id myNewsRecordOrGalleriesRecord; 

// class.m 
// NewsRecord and GalleriesRecord have both the title property 
NSLog(myNewsRecordOrGalleriesRecord.title); 

и я получаю:

error : request for member 'title' in something not a structure or union 

любые идеи: D?

Спасибо.

Готье

Как я должен это делать?

ответ

6

Вы не можете использовать синтаксис с точкой на id типов, потому что компилятор не может знать, что x.foo средства (заявленное свойство может сделать газопоглотитель другое имя, например view.enabled -> [view isEnabled]).

Таким образом, вы должны использовать

[myNewsRecordOrGalleriesRecord title] 

или

((NewsRecord*)myNewsRecordOrGalleriesRecord).title 

Если title и больше питания являются общие свойства этих двух классов, вы можете объявить протокол.

@protocol Record 
@property(retain,nonatomic) NSString* title; 
... 
@end 

@interface NewsRecord : NSObject<Record> { ... } 
... 
@end 

@interface GalleriesRecord : NSObject<Record> { ... } 
... 
@end 

... 

id<Record> myNewsRecordOrGalleriesRecord; 
... 

myNewsRecordOrGalleriesRecord.title; // fine, compiler knows the title property exists. 

BTW, не используйте NSLog(xxx);, который склонен к format-string attack и вы не можете быть уверены, xxx на самом деле является NSString. Вместо этого используйте NSLog(@"%@", xxx);.

+0

[myNewsRecordOrGalleriesRecord названия] работает большое;) – gotye

+0

Кроме того, спасибо за быстрый и хороший ответ! – gotye

0
  1. Try доступа название вашей записи как [myNewsRecordOrGalleriesRecord title];
  2. Если вы собираетесь делать много такого рода вещи (доступ к общим методам в двух классах), вы, вероятно, значительно выиграют от либо создавая абстрактный суперкласс, что оба NewsRecord и GalleriesRecord могут наследовать (если они будут делить много кода) или создавая protocol оба они могут придерживаться (если они будут делить имена методов, но не код.
0

Компилятор не удовлетворен с id фактически является экземпляром NSObject, который не имеет свойства title.

Если ваш объект КВЦ совместимый, вы можете использовать метод valueForKey:

NSLog([myNewsRecordOrGalleriesRecord valueForKey:@"title"]); 
Смежные вопросы