В 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?
Так ваш вопрос о Xcode или AppCode? – Kreiri
"' [NSBundle mainBundle] 'становится недействительным" Недопустимо в соответствии с чем? Объявление этого класса объявляет этот метод; это на самом деле _all_, что он делает. –