2015-03-20 6 views
1

Следующий код выдает ошибку Нет видимых @interface для «Бар» заявляет селектор «barMethod» на второй линии реализации -[Foo fooMethod]:вперед декларация Objective-C метод расширения класса

// FooBar.m 

#import "FooBar.h" 

////////////////////////////////// 

@implementation Foo 

- (void)fooMethod { 
    Bar *bar = [Bar new]; 
    [bar barMethod]; // Error: No visible @interface for 'Bar' declares the selector 'barMethod' 
} 

@end 

////////////////////////////////// 

@interface Bar() 
- (void)barMethod; 
@end 

@implementation Bar 

- (void)barMethod { 
    // do something 
} 

@end 

Is там любой способ переслать объявление -[Bar barMethod] внутри FooBar.m кроме перемещения Bar расширение класса выше Foo реализация (что не очень удобно время от времени)?

+1

Близко связанный: [Использовать расширение класса для выборочной видимости в ObjC] (http://stackoverflow.com/q/7110525) –

+0

@JoshCaswell Хорошее обходное решение, но изменить порядок проще –

ответ

1

интерфейс внутреннего абонента, как и любой другой для целей видимости метода: компилятор должен видеть декларацию до того варианта использования * К сожалению, вам придется поставить @interface либо в заголовок или дальше вверх в файле. чем реализация Foo.


* Единственное исключение к этому, что я знаю, это методы, которые не названы в интерфейсе вообще - по существу заявленных их определения - и используются в пределах одной и той же @implementation блока. Компилятор будет фигура, которая вне вас вне зависимости от заказа.