Xcode8、禁用class级属性
Xcode 8, disable class level properties
在Xcode8中,Objective-C略有改动。现在有 class 级属性。
例如,headers 对应 NSBundle
@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
。但是我使用 JetBrains 的 AppCode,这个 IDE 将这样的构造视为无效代码。 AND、[NSBundle mainBundle]
无效,AS+ (instancetype)mainBundle
方法不存在。
我的问题是
我可以以某种方式切换到旧的 ObjectiveC 风格编码 而无需 切换 Xcode?
@property (class, readonly, strong) NSBundle *mainBundle;
这等同于此(带有一些有助于静态分析器和 Swift API 生成的额外元数据):
+ (NSBundle *)mainBundle;
如果您的 IDE/compiler 随后未正确编译 [NSBundle mainBundle]
(或其中的等效项),那么您的 IDE/compiler 已损坏。
简答:否
但这只是一个AppCode高亮问题。代码应该仍然可以正常编译,只是在语法分析器中被标记为错误。
关注 youtrack 问题以了解何时修复:https://youtrack.jetbrains.com/issue/OC-14107
在Xcode8中,Objective-C略有改动。现在有 class 级属性。 例如,headers 对应 NSBundle
@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
。但是我使用 JetBrains 的 AppCode,这个 IDE 将这样的构造视为无效代码。 AND、[NSBundle mainBundle]
无效,AS+ (instancetype)mainBundle
方法不存在。
我的问题是 我可以以某种方式切换到旧的 ObjectiveC 风格编码 而无需 切换 Xcode?
@property (class, readonly, strong) NSBundle *mainBundle;
这等同于此(带有一些有助于静态分析器和 Swift API 生成的额外元数据):
+ (NSBundle *)mainBundle;
如果您的 IDE/compiler 随后未正确编译 [NSBundle mainBundle]
(或其中的等效项),那么您的 IDE/compiler 已损坏。
简答:否
但这只是一个AppCode高亮问题。代码应该仍然可以正常编译,只是在语法分析器中被标记为错误。
关注 youtrack 问题以了解何时修复:https://youtrack.jetbrains.com/issue/OC-14107