Swift下标,具有不同的getter和setter签名

时间:2015-12-17 19:24:04

标签: swift swift2 setter getter

是否可以在Swift中使用subscriptgettersetter具有不同的签名?

例如,我希望getter返回Set<Int>setter返回Int(而不是Set<Int>)。

此代码无法编译,但它可以让您了解我正在尝试做什么:

struct Foo{

    subscript(index: Int)->String{
        get{
            return "bar" // returns a String
        }
        set(newValue: String?){ // takes a String? instead of a String
            print(newValue)
        }
    }
}

我该怎么做?

1 个答案:

答案 0 :(得分:2)

这非常难看,我强烈反对你这样做,但从技术上来说这是可能的:

animation-play-state: paused !important;

对于前面的多图,我做了类似的事情:

struct Foo {

    subscript(concreteValueFor index: Int) -> String {
        return "Get concrete \(index)"
    }

    subscript(optionalValueFor index: Int) -> String? {
        get { return nil }
        set { print("Set optional \(index)") }
    }

}

var foo = Foo()

foo[concreteValueFor: 1]            // Returns "Get concrete 1"
foo[optionalValueFor: 2] = ""       // Prints "Set optional 2"

用法:

public struct Multimap<Key: Hashable, Value: Hashable>: CollectionType {

    public typealias _Element = Set<Value>
    public typealias Element = (Key, _Element)
    public typealias Index = DictionaryIndex<Key, _Element>
    public typealias Generator = DictionaryGenerator<Key, _Element>

    private typealias Storage = [Key: _Element]

    private var storage = Storage()

    public var startIndex: Index { return storage.startIndex }
    public var endIndex: Index { return storage.endIndex }

    public subscript(position: Index) -> _Element { return storage[position].1 }
    public subscript(position: Index) -> Element { return storage[position] }

    subscript(key: Key) -> Set<Value> {
        get { return storage[key] ?? Set<Value>() }
        set { storage[key] = newValue.isEmpty ? nil : newValue }
    }

    public func generate() -> Generator { return storage.generate() }

}