2016-09-14 32 views
2

В Xcode 8 Objective-C слегка изменился. Теперь есть свойства уровня класса. Например, заголовки NSBundleXcode 8, отключить свойства уровня класса

@interface NSBundle : NSObject { 
... 

/* Methods for creating or retrieving bundle instances. */ 
#if FOUNDATION_SWIFT_SDK_EPOCH_AT_LEAST(8) 
@property (class, readonly, strong) NSBundle *mainBundle; 
#endif 

+ (nullable instancetype)bundleWithPath:(NSString *)path; 
- (nullable instancetype)initWithPath:(NSString *)path NS_DESIGNATED_INITIALIZER; 

+ (nullable instancetype)bundleWithURL:(NSURL *)url NS_AVAILABLE(10_6, 4_0); 
- (nullable instancetype)initWithURL:(NSURL *)url NS_AVAILABLE(10_6, 4_0); 

+ (NSBundle *)bundleForClass:(Class)aClass; 
+ (nullable NSBundle *)bundleWithIdentifier:(NSString *)identifier; 

#if FOUNDATION_SWIFT_SDK_EPOCH_AT_LEAST(8) 
@property (class, readonly, copy) NSArray<NSBundle *> *allBundles; 
@property (class, readonly, copy) NSArray<NSBundle *> *allFrameworks; 
#endif 
... 

посмотреть, главный жгут. Теперь он объявлен как property, но с ключевым словом class. Я думаю, что это означает class level property. ОК.

После прокрутки я нашел эти коды.

#define NSLocalizedString(key, comment) \ 
     [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil] 
#define NSLocalizedStringFromTable(key, tbl, comment) \ 
     [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)] 

Посмотрите, как mainBundle доступ. Но я использую AppCode из JetBrains, и эта IDE рассматривает конструкции вроде этого как недопустимый код. И, [NSBundle mainBundle] недействителен, AS+ (instancetype)mainBundle метод не существует.

МОЙ ВОПРОС Могу ли я как-то переключиться на старый ObjectiveC кодирования стиля без переключения Xcode?

+0

Так ваш вопрос о Xcode или AppCode? – Kreiri

+3

"' [NSBundle mainBundle] 'становится недействительным" Недопустимо в соответствии с чем? Объявление этого класса объявляет этот метод; это на самом деле _all_, что он делает. –

ответ

2

Короткий ответ: НЕТ

Но это просто AppCode выделяя вопрос. Код должен компилироваться в порядке, он просто отмечен как ошибка в синтаксическом анализаторе.

Следуйте YouTrack вопрос, чтобы знать, когда это будет исправлено: https://youtrack.jetbrains.com/issue/OC-14107

+1

Исправлено в последнем 2016.3 EAP. –

7
@property (class, readonly, strong) NSBundle *mainBundle; 

Это эквивалентно следующему (с некоторыми дополнительными метаданными, который помогает статический анализатор и Swift поколения API):

+ (NSBundle *)mainBundle; 

Если IDE/составитель впоследствии не компиляции [NSBundle mainBundle] правильно (или эквивалент в этом), тогда ваш IDE/компилятор не работает.