@objc избыточность, когда у @objcMembers приватная динамическая переменная? - PullRequest
0 голосов
/ 29 апреля 2018

Поэтому я использую 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 голосов
/ 29 апреля 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...