2012-04-23 3 views
0

У меня есть объект, который должен быть разных типов внутри, но я всегда хочу вернуться в виде строки. Поэтому я объявил объект как «id» и написал метод getter, который всегда возвращает NSString *. Все работает так, как должно, и XCode жалуется «Тип свойства« X »не соответствует типу accessor« setX: », как и ожидалось. Так как я действительно хочу этого поведения, кто-нибудь знает, как сказать XCode, что я действительно хочу этого, и не хотел бы видеть это предупреждение все время? Вроде как «__unused» директива для неиспользуемых переменных?Как отключить предупреждения типа возвращаемого типа?

Спасибо! Max

Edit: Вот код

.h

@property (strong,nonatomic) id wert; 
- (void) setWert:(NSString *)value; 
- (NSString *) wert; 

.m

@synthesize wert; 

- (void) setWert:(NSString *)value 
{ 
     wert = value; 
} 

- (NSString *) wert 
{ 
     return wert; 
} 
+0

Можете ли вы опубликовать код, с которым у вас возникли проблемы? – Jim

+0

Я не могу воссоздать эту ошибку. Можете ли вы отправить код и точное сообщение об ошибке? – joerick

+0

добавлен образец кода в исходное сообщение. Сообщение об ошибке «Тип свойства« wert »не соответствует типу accessor 'setWert:'" – Max

ответ

-1

устанавливая NSString * к и id набранный свойство обыкновение вызывать предупреждение, но установив id напечатал вар в NSString * собственность будет ... вы можете решить с ...

приведения типов
id someVar = @"string"; 
someObject.setStringProperty = (NSString *)someVar; 
0

Проблема заключается в этих строках:

@interface TestClass : NSObject 

@property (strong, nonatomic) id wert; 

- (void) setWert:(NSString *)value; 
- (NSString *) wert; 

@end 

По существу, @property обозначения стенографии для объявления методы доступа (с некоторыми атрибутами, по общему признанию). Поэтому здесь нет смысла объявлять его сначала как id, а затем как NSString. Определите тип, который вы хотите открыть для wert, и используйте его для объявления свойства. Я хотел бы предложить:

@interface TestClass : NSObject 

@property (strong, nonatomic) id wert; 

@end 

Кроме того, в .m, вы первое @synthesize свойства, а затем переопределить геттер и сеттер. Это означает, что единственное, что вы получаете от @synthesize, - это переменная экземпляра.

Вы также можете объявить переменные экземпляра в блоке @implementation. Это было бы хорошее место для вас, чтобы объявить внутренний тип:

@implementation TestClass 
{ 
    NSString *wert; 
} 

Но тогда, если вы счастливы для других классов назвать setWert: ни с чем NSString, вы не должны изменить объявление типа для сеттер. Для этого предполагается, что value является NSString. Таким образом, ваши аксессоры должны выглядеть так:

- (void) setWert:(id)value 
{ 
    // store wert as an NSString 
} 

- (id) wert 
{ 
    // return wert as the original type 
} 

@end 
+0

Большое спасибо, я неправильно понял, что сделал @property.Тем не менее, объявление переменной экземпляра как 'id wert' в' @ implementation' приводит к сбою с '' NSInvalidArgumentException ', причина:' - [__ NSCFString stringValue]: непризнанный селектор, отправленный экземпляру ... ''. Я не знаю, почему это не работает, но так было раньше. Что касается методов доступа, 'значение' всегда является строкой, а для внешнего мира,' wert' должен выглядеть как NSString, но внутри он должен быть и быть множеством разных объектов - от NSInteger до NSDate , Может быть, это не идеальный вопрос, но почему он работал до этого? – Max

+0

Хорошо, похоже, что у меня было это неправильно. Объявите свойство как NSString (включая сеттеры и геттеры), а затем переменную экземпляра как 'id'. Что касается вашего сбоя, это другая проблема, вы, должно быть, изменили свою логику где-то. – joerick

+0

Это тоже не работает, тогда я получаю ошибки в другом месте метода getter: «No visible @interface для« NSString »объявляет селектор« decimalValue ». Это немного странно. Может быть, я должен просто жить с предупреждениями, но я очень ценю вашу помощь! – Max

Смежные вопросы