NSObject setValuesForKeys ошибка кодирования-жалобы в Swift 4.0.2

Я обычно создаю NSObject, как в примере ниже, чтобы заставить firebase наблюдать за одиночным вызовом события, чтобы получить данные, затем я бы создал экземпляр NSObject и просто вызвал бы метод setValueForKeys для NSObject, и тогда значения я мог бы легко передать используйте оператор if let, чтобы получить нужные мне данные. это перестало работать с тех пор, как я обновился до swift 4.0.2 с swift 3.1, см. фрагмент кода ниже. Я считаю, что я делаю это неправильно, так как новое обновление. Поскольку требуемое значение ключа существует, это можно увидеть в декларации NSObject, а также в распечатке. Любое предложение будет оценено.

class BarberMarker: NSObject {
var companyID: String?
var companyName: String?
var companyLogoImageUrl: String?
var companyLogoImage: UIImage?
var companyFormattedAddress: String?
var companyAddressLongitude: String?
var companyAddressLatitude: String?
var distanceFromCurrentUser: Double?
var dateCreated: String?
var timezone: String?
var calendar: String?
var local: String?
var ratingValue: CGFloat?
}

вызов firebase для получения данных из базы данных

    func getAllMarkers(){
    firebaseRef.child("barberMarkers").observeSingleEvent(of: .value, with: { (snapshotssshhh) in
        if let dictionary = snapshotssshhh.value as? [String: AnyObject] {

            for marker in dictionary {
                if let locMarker = marker.value as? [String: AnyObject] {
                    var markerB = BarberMarker()
                    print(locMarker)
                    markerB.setValuesForKeys(locMarker)
                    self.barbermarkers.append(markerB)
                    guard let lon = markerB.companyAddressLongitude, let lat = markerB.companyAddressLatitude else {
                        return
                    }
                    let latitude = (lat as NSString).doubleValue
                    let longitude = (lon as NSString).doubleValue

                    let locValue:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)
                    DispatchQueue.main.async{
                        let desiredMarker = GMSMarker(position: locValue)
                        desiredMarker.icon = GMSMarker.markerImage(with: UIColor(r: 118, g: 187, b: 220))
                        desiredMarker.map = self.mapView
                        self.bMarkers.append(desiredMarker)
                    }
                }
            }
        }
    }, withCancel: nil)
}

я получаю сообщение об ошибке

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<maizewars.BarberMarker 0x7fb62ff5f5b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key companyAddressLongitude.'

1 ответ

Решение

Попробуй это, братан

@objcMembers class BarberMarker: NSObject {
...
}

причина @objcMembers Использование в Swift 4

Когда класс Swift вводит много новых методов или свойств, которые требуют поведения из среды выполнения Objective C, используйте атрибут @objcMembers в объявлении этого класса.

Применение атрибута @objcMembers к классу неявно добавляет атрибут @objc ко всем его совместимым с Objective C членам.

Поскольку применение атрибута @objc может увеличить скомпилированный размер приложения и негативно повлиять на производительность, атрибут @objcMembers можно применять к объявлениям только тогда, когда к каждому члену должен быть применен атрибут @objc.

Другие вопросы по тегам