しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

a declaration cannot be both 'final' and 'dynamic' エラーの解決策

先日NSObjectを継承するクラスのextensionでクラス変数を定義したら表題のエラーに遭遇しました。

class A: NSObject {}
extension A {
    static var hiddenCalendarIds = [""]
}

@nonobjcをつければエラーは出なくなりました。

class A: NSObject {}
extension A {
    @nonobjc static var hiddenCalendarIds = [""]
}

@nonobjcとは

Objective-cから該当のプロパティーやメソッドを呼べなくする修飾子です。

class A: NSObject {}
extension A {
    @nonobjc func method() {}
}
@interface : NSObject

@end

@implementation Objc

- (void)method {
    [[A new] method]; // → No visible @interface for 'A' declares the selector 'method'エラーになる
}

@end