@objcMembers私有动态变量时@objc冗余?

时间:2018-04-29 08:36:45

标签: swift realm

所以我使用Realm和Swift并用@objcMembers关键字标记我的类,但是当我尝试制作一些私有变量时,Xcode强迫我在那些私有变量旁边添加@objc。这是预期的行为吗?对我来说似乎是多余的。

@objcMembers class MyObject: Object {
    @objc dynamic private var text: String = String()
    @objc dynamic private var youtubeLink: String = String()
    @objc dynamic private var count: Int = 0
    dynamic var isFavorite: Bool = false
    dynamic var currentCount: Int = 0
}

1 个答案:

答案 0 :(得分:3)

问题是,当@objMembers将您的成员暴露给Objective-C时,private会再次隐藏它们。因此,要撤消隐藏,您必须明确说出@objc

要确定这是真的,请尝试以下测试:

@objcMembers class MyObject: NSObject {
    func f() {
        print("howdy")
    }
}
let c = MyObject()
c.perform(Selector("f"))

有效。但这崩溃了:

@objcMembers class MyObject: NSObject {
    private func f() {
        print("howdy")
    }
}
let c = MyObject()
c.perform(Selector("f"))

要修复崩溃而不带走private,我们必须明确地将f公开给Objective-C:

@objcMembers class MyObject: NSObject {
    @objc private func f() {
        print("howdy")
    }
}
let c = MyObject()
c.perform(Selector("f"))

关于你的特定情况唯一有趣的事情是编译器注意到问题,而不是像上面第二个例子那样让你崩溃。那是因为dynamic标记,除非我们接触到Objective-C,否则没有任何意义。