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.