Swift 4.0.2 中的 NSObject setValuesForKeys 编码投诉错误

Posted

技术标签:

【中文标题】Swift 4.0.2 中的 NSObject setValuesForKeys 编码投诉错误【英文标题】:NSObject setValuesForKeys coding-complaint error in Swift 4.0.2 【发布时间】:2017-11-27 10:30:59 【问题描述】:

我通常会像下面的示例一样创建一个 NSObject 进行 firebase 观察单个事件调用以获取数据,然后我会创建一个 NSObject 的实例并简单地调用 NSObject 上的 setValueForKeys 方法,然后将传入值我可以轻松地使用 if let 语句来获取我需要的特定数据。自从我从 swift 3.1 升级到 swift 4.0.2 后,这已经停止工作,请参见下面的代码 sn-p。我相信我做错了,因为新的更新。正如在 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 属性会增加应用程序的编译大小并对性能产生不利影响,所以只有在每个成员都需要应用@objc 属性时才对声明应用@objcMembers 属性。

【讨论】:

感谢您的帮助。仅代码的答案并没有真正的帮助。请解释这如何解决问题中的错误。 继续阅读:- github.com/apple/swift-evolution/blob/master/proposals/… 也:- developer.apple.com/library/content/documentation/Swift/… 再次感谢您的帮助。我们仍然希望在答案中有解释,拜托。链接会随着时间的推移而失效,这比人们预期的要频繁。 好多了。非常感谢。 非常感谢兄弟,它运行良好。再次感谢@AshvinGudaliya :)

以上是关于Swift 4.0.2 中的 NSObject setValuesForKeys 编码投诉错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中单击 NSObject 内部的 tableView 中的项目时,如何在 NSObject 类中的 UIViewController 上的 UIView 之间正确切换?

如何在 NSObject 类中添加动态行为:Swift

从 NSObject 派生时,Swift iOS 内存泄漏指示 XCode8

在 Swift 中访问共享容器中的自定义对象

swift 与 NSObject

Swift3:类型“NSObject”不符合协议“URLAuthenticationChallengeSender”