2014-09-23 83 views
3

我正在玩弄一些可能的方法來從Swift詞典中一次提取多個值。我們的目標是做這樣的事情:從Swift詞典中一次提取多個鍵的值

var dict = [1: "one", 2: "two", 3: "three"] 
dict.multiSubscript(2...4) // Should yield ["two", "three", nil] 

或本:

dict.multiSubscript([1, 2]) // Should yield ["one", "two"] 

換句話說,現在看來似乎應該是可以實現multiSubscript()一般對於任何序列類型符合的標型。

然而,斯威夫特似乎並不像下面的實現,並且錯誤信息是不是很有啓發:

extension Dictionary { 
    func multiSubscript<S: SequenceType where S.Generator.Element == Key>(seq: S) -> [Value?] { 
     var result = [Value?]() 
     for seqElt in seq { // ERROR: Cannot convert the expression's type 'S' to type 'S' 
      result += self[seqElt] 
     } 
     return result 
    } 
} 

這似乎是仿製藥相對簡單的使用限制。有沒有人看到我在做什麼錯了?

對於獎勵積分,有沒有一種方法可以實現這一點,以允許使用正常的下標語法?例如:

dict[2...4] // Should yield ["two", "three", nil] 

回答

1

我不完全知道爲什麼for seqElt in seq不會在換在工程工作(我懷疑一個bug),但使用SequenceOf<Key>(seq)

func multiSubscript<S: SequenceType where S.Generator.Element == Key>(seq: S) -> [Value?] { 
    var result = [Value?]() 
    for seqElt in SequenceOf<Key>(seq) { 
     result.append(self[seqElt]) 
    } 
    return result 
} 

還要注意的是result += self[seqElt]沒有工作;我用result.append(self[seqElt])代替。

+0

感謝您的支持。有趣的是,沒有顯式類型的'SequenceOf(seq)'也不起作用。 (該錯誤消息同樣很模糊:'不能用'S'類型的參數調用'init')。實際上,查看Swift頭文件,'SequenceOf'的'init(sequence)'方法對通過的序列類型 - 關於序列類型的說法似乎很完美,例如在這個例子中'SequenceOf (seq)''。然後'seqElt'的類型是'String','self [seqElt]'是無效的,但'for'循環似乎沒有問題。 – GSnyder 2014-09-24 01:41:46