我在Xcode中使用Swift创建了一个测试应用程序,而且我遇到了一个恼人的问题。我正在编写一个简单的类,它将使用Dictionary对象充当缓存。我的实现如下:
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声明&#34;无法找到成员&#39; UpdateValue&#39;&#34;。这很奇怪,因为代码提示似乎表明它很好:
但是当我尝试编译时:
这可能是Xcode中的一个错误吗?或者我错过了一些非常明显的东西?
答案 0 :(得分:2)
在编译器中闻起来像个bug或怪癖。
我刚试过像
这样的东西var d = dict!
d.updateValue(data, forKey: id)
它按预期工作。
答案 1 :(得分:2)
这不是编译器中的错误或怪癖。
Optional
实施的方式(可能存在缺陷或不存在)
发生的事情是Optional
将Dictionary
存储为不可变对象(也许是let
)。因此,即使Optional
它是可变的,您也无法直接修改基础Dictionary
对象(无需重新分配Optional对象)。
updateValue(forKey:)
是一种变异方法,你不能在不可变对象上调用它,因此也就是错误。
你可以通过
来解决它var d = dict!
d.updateValue(data, forKey: id)
因为您将字典复制到另一个可变变量,该变量然后是可变的并且能够在其上调用变异方法
但没有dict = d
,您的更改不会应用于dict
,因为Dictionary
是值类型,它会在每个作业上复制