我正在尝试将一个简单的可变集实现为学习Swift的方法,但下面的代码为add
和remove
方法提供了以下编译器错误:
Could not find an overload for 'subscript' that accepts the supplied arguments
我做错了什么?
class SwiftSet<T: Hashable> {
let _underlyingSet: Dictionary<T, Bool>
init() {
_underlyingSet = Dictionary<T, Bool>()
}
subscript(k: T) -> Bool {
if _underlyingSet[k] {
return true
}
else {
return false
}
}
func contains(k: T) -> Bool {
return self[k]
}
func add(k: T) {
_underlyingSet[k] = true
}
func remove(k: T) {
_underlyingSet[k] = nil
}
func allObjects() -> T[] {
return Array(_underlyingSet.keys)
}
}
答案 0 :(得分:3)
因为您试图在let _underlyingSet
和add()
方法中修改使用remove()
定义的不可变常量。
如果要在初始化后修改变量,则应将其更改为var _underlyingSet
,即:
class SwiftSet<T: Hashable> {
var _underlyingSet: Dictionary<T, Bool>
init() {
_underlyingSet = Dictionary<T, Bool>()
}
subscript(k: T) -> Bool {
if _underlyingSet[k] {
return true
}
else {
return false
}
}
func contains(k: T) -> Bool {
return self[k]
}
func add(k: T) {
_underlyingSet[k] = true
}
func remove(k: T) {
_underlyingSet[k] = nil
}
func allObjects() -> T[] {
return Array(_underlyingSet.keys)
}
}
答案 1 :(得分:2)
您已将_underlyingSet
声明为常量,因此它的下标没有定义的setter。将其声明更改为:
var _underlyingSet: Dictionary<T, Bool>