Установщик свойства вызывается вместо получателя в switch (Xcode 9.3 и 9.4) - PullRequest
0 голосов
/ 06 июня 2018

Рассмотрим следующие объекты:

enum SetType: String {
    case anaerobic, isometric
}

class RealmSet: Object {
   @objc dynamic private var setType: String = ""
    var type: SetType {
        get {
            guard let unwrappedSetType = SetType(rawValue: setType) else {
                return .anaerobic
            }
            return unwrappedSetType
        }
        set {
            self.setType = newValue.rawValue
        }
    }
}

protocol ExerciseSet {
    var setType: SetType { get }
}

class Exercise: Object {
   private let setsValues = List<RealmSet>()
   var sets: [ExerciseSet] {
        var sets = [ExerciseSet]()
        for setValue in self.setsValues {
            switch setValue.type {
            case .anaerobic:
                // Do Something

            case .isometric:
                // Do Something
            }
        }

        return sets
    }
}

Что происходит, когда я пытаюсь выполнить итерацию этого массива setsValues и выполнить switch, чтобы узнать, что это за тип RealmSet,вместо этого вызывается свойство type getter из RealmSet, вызывается метод установки.Поскольку этот объект является объектом Realm, приложение мгновенно завершает работу, потому что я не выполняю транзакцию записи, что верно, потому что мне нужен только доступ к получателю свойства, а не к его установщику.

Самое странное из этогоСитуация такова, что это не происходит, когда версии Xcode ниже, чем 9.3.Это происходит только в Xcode 9.3 и 9.4.Когда я использую Xcode 9.2, все работает отлично.

Я не знаю, в чем проблема.Если это Realm lib, некоторые изменения в версиях Xcode 9.3 и 9.4 или в каких.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Для тех, кто сталкивается с той же проблемой, не используйте get set при работе с Realm.Свойства доступа к области через KVO, поэтому в некоторых ситуациях они теряются и вызывают ошибки такого рода.Используйте get-only свойства в сочетании с функциями для установки этих свойств вместо использования get set

0 голосов
/ 06 июня 2018

Не уверен, где именно что-то пойдет не так, но наличие чтения / записи var type и отдельного свойства setType в одном классе звучит для меня очень подозрительно.Попробуйте переименовать setType во что-то вроде rawSetType, чтобы хотя бы быть уверенным, что оно не конфликтует со свойством type.

¹ Должно быть связано с Realm.Object как с классом Objective-C, что означаетчто для свойства type найдется сеттер с именем setType.

...