updateValue不适用于Dictionary

我正在Xcode中使用Swift创build一个testing应用程序,我遇到了一个令人讨厌的问题。 我正在写一个简单的类,它将充当一个使用Dictionary对象的caching。 我的实现如下:

import Foundation import UIKit class ImageCache { var dict:Dictionary<String,NSData>?; init() { dict = Dictionary<String,NSData>(); } func exists(id:String) -> Bool { return dict!.indexForKey(id)!==nil; } func getImage(id:String) -> UIImage? { if(!exists(id)) { return nil; } return UIImage(data: (dict!)[id]); } func setData(id:String, data:NSData) { dict!.updateValue(data, forKey: id); } } 

这个问题是在最后一个方法,与Xcode陈述“无法find成员'UpdateValue'”。 这很奇怪,因为代码提示似乎显示它很好:

代码提示

但是当我尝试编译时:

编译错误

这可能是Xcode中的一个错误吗? 还是我错过了一些超级明显的东西?

这不是编译器中的一个bug或者一个怪癖。

这是如何Optional实施(可能有瑕疵或不)

发生了什么事情是Optional商店Dictionary作为不可变的对象(也许let )。 所以即使Optional它是可变的,你不能直接修改底层的Dictionary对象(不需要重新分配Optional对象)。

updateValue(forKey:)是变异的方法,你不能在不可变的对象上调用它,并因此出错。

你可以通过这样做来解决这个问题

 var d = dict! d.updateValue(data, forKey: id) 

因为你将字典复制到另一个可变的variables,这个variables是可变的,并且能够调用它的变异方法

但没有dict = d ,你的改变将不会应用在dict因为Dictionary是值types,它会复制每个赋值

相关的答案

闻起来像编译器中的一个错误或怪癖。

我只是试过类似的东西

 var d = dict! d.updateValue(data, forKey: id) 

并按预期工作。