Swift 4.0.2 中的 NSObject setValuesForKeys 编码投诉错误
NSObject setValuesForKeys coding-complaint error in Swift 4.0.2
我通常会像下面的示例那样创建一个 NSObject 进行 firebase 观察单个事件调用以获取数据,然后我会创建一个 NSObject 的实例并简单地调用 NSObject 上的 setValueForKeys 方法,然后将传递值然后我可以轻松地使用 if let 语句来获取我需要的特定数据。自从我从 swift 3.1 升级到 swift 4.0.2 后,这已停止工作,请参阅下面的代码片段。自从新更新以来,我相信我做错了。正如在 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.'
兄弟试试这个
@objcMembers class BarberMarker: NSObject {
...
}
原因@objcMembers 在Swift4
中使用
当 Swift class 引入许多需要 Objective-C 运行时行为的新方法或属性时,请使用 @objcMembers 属性在 class 的声明中。
将 @objcMembers 属性应用于 class 会隐式地将 @objc 属性添加到其所有 Objective-C 兼容成员。
因为应用@objc 属性会增加应用程序的编译大小并对性能产生不利影响,所以只有在每个成员都需要应用@objc 属性时才在声明上应用@objcMembers 属性。
我通常会像下面的示例那样创建一个 NSObject 进行 firebase 观察单个事件调用以获取数据,然后我会创建一个 NSObject 的实例并简单地调用 NSObject 上的 setValueForKeys 方法,然后将传递值然后我可以轻松地使用 if let 语句来获取我需要的特定数据。自从我从 swift 3.1 升级到 swift 4.0.2 后,这已停止工作,请参阅下面的代码片段。自从新更新以来,我相信我做错了。正如在 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.'
兄弟试试这个
@objcMembers class BarberMarker: NSObject {
...
}
原因@objcMembers 在Swift4
中使用当 Swift class 引入许多需要 Objective-C 运行时行为的新方法或属性时,请使用 @objcMembers 属性在 class 的声明中。
将 @objcMembers 属性应用于 class 会隐式地将 @objc 属性添加到其所有 Objective-C 兼容成员。
因为应用@objc 属性会增加应用程序的编译大小并对性能产生不利影响,所以只有在每个成员都需要应用@objc 属性时才在声明上应用@objcMembers 属性。