所以我使用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
}
答案 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,否则没有任何意义。