为什么Swift的这个通用集合实现不起作用?

时间:2014-06-05 23:43:48

标签: swift

我正在尝试将一个简单的可变集实现为学习Swift的方法,但下面的代码为addremove方法提供了以下编译器错误:

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)
    }
}

2 个答案:

答案 0 :(得分:3)

因为您试图在let _underlyingSetadd()方法中修改使用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>