Проблема в том, что в то время как @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.