域在定义动态变量时强制添加@objc单词

时间:2018-08-27 10:22:27

标签: ios swift realm

我目前正在使用RealmSwift,在Marin Todorov的教程中,他创建了这样的变量,并且编译器没有抱怨。realm tutorial image

但是,每当我尝试自己创建这些变量时,编译器都希望我添加@objccompiler error

这些是不同的东西还是它们的行为不同?

2 个答案:

答案 0 :(得分:2)

该教程写于2016年9月,已经过时了。

过去,如果您有一个暴露于Objective-C的类,那么它的所有成员都会暴露于Objective-C。在Swift 4中,未标记为@objc的事物不会暴露给Objective-C,无论它是否为@objc类的成员。

领域需要对您的媒体资源进行动态处理,例如KVO。这就是为什么需要dynamic的原因。但是dynamic是Objective-C独有的功能,这就是为什么您需要@objc的原因。

这也是为什么Realm无法处理Swift可选对象的原因,因为它们不能与Objective-C桥接。您必须使用RealmOptional<T>

简而言之,只需在属性中添加@objc,一切都会好起来的。

答案 1 :(得分:2)

它们是不同的:

  • @objc意味着将对象公开给Objective-C运行时
  • dynamic表示启用对象的键值观察(KVO)。

KVO需要Objective-C运行时。

@objc inference has changed in Swift 4 (SE-0160)

的行为