Xcode 8,禁用类级别属性

时间:2016-09-14 13:01:18

标签: objective-c xcode xcode8 appcode

在Xcode 8中,Objective-C略有改变。现在有类级属性。 例如,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?

2 个答案:

答案 0 :(得分:7)

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

这相当于此(有一些额外的元数据可以帮助静态分析器和Swift API生成):

+ (NSBundle *)mainBundle;

如果你的IDE /编译器后来没有正确编译[NSBundle mainBundle](或其中的等价物),那么你的IDE /编译器就坏了。

答案 1 :(得分:2)

简短回答:

但这只是一个AppCode突出问题。代码应该仍然可以正常编译,它在语法分析器中被标记为错误。

按照youtrack问题了解何时修复:https://youtrack.jetbrains.com/issue/OC-14107