Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 3中的NSKeyValueChangeKey类型转换错误_Swift - Fatal编程技术网

Swift 3中的NSKeyValueChangeKey类型转换错误

Swift 3中的NSKeyValueChangeKey类型转换错误,swift,Swift,我一直在尝试从2.3版迁移到Swift 3版,在阅读了所有这些之后,其中两个版本显示了类似的错误,但不完全相同,但我无法解决此错误 “[NSKeyValueChangeKey:Any]”不能转换为“[String:Int]” override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawP

我一直在尝试从2.3版迁移到Swift 3版,在阅读了所有这些之后,其中两个版本显示了类似的错误,但不完全相同,但我无法解决此错误

“[NSKeyValueChangeKey:Any]”不能转换为“[String:Int]”

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

        guard let changeKeys = change  as? [String: Int] else {
            print("changeKeys  failed")
            return
        }
}

如何解决此问题?

在Swift 3中,
change
参数包含一个带有预定义
NSKeyValueChangeKey
键的字典

  • indexesKey
  • kindKey
  • newKey
  • notificationIsPriorKey
  • oldKey
相应的值是已更改的对象。比如说

if let foo = change?[.newKey] as? Int 

我终于知道错误告诉了我什么,并通过更改类型解决了问题。我相信Swift 2.x是一种字符串类型

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

        guard let changeKeys = change  as? [NSKeyValueChangeKey: Int] else {
            print("changeKeys  failed")
            return
        }
}

所以不再有守卫声明了?有时我不知道他们是在让斯威夫特变得更好还是更糟。这和ObjC一样多<代码>如果let或
保护let
取决于需要。在Swift中,你应该更加注意你在做什么,在这种情况下,你应该知道你在观察什么。