В Swift 2 я смог написать функцию, которая работала в любой последовательности, например, (String, Int)
. Это выглядело примерно так:Как ограничить общий параметр последовательности для кортежа в Swift 3?
func test<T: SequenceType where T.Generator.Element == (String, Int)>(input: T) {
for (k, v) in input {
print(k, "=", String(v))
}
}
Использование кортежа в качестве ограниченного типа был особенно полезен тем чтобы он мог принять словари, такие как [String:Int]
, так как их тип последовательности состоит из кортежей.
В Swift 3, я считаю, подобная функция будет:
func test<T: Sequence>(input: T) where T.Iterator.Element == (String, Int) {
for (k, v) in input {
print(k, "=", String(v))
}
}
Но попытка пройти в [String:Int]
, например: test(input: ["a": 1, "b": 2])
, вызывает ошибку:
Generic parameter 'T' could not be inferred
Насколько Я могу сказать, что словари в Swift 3 по-прежнему используют кортеж (Key, Value) как свой тип итератора, поэтому я думаю, что это должно сработать. На самом деле, если я не использую один тип в качестве типа итератора с ограничениями, например where T.Iterator.Element == String
, я могу передать что-то вроде [String]
и он работает правильно.
Есть ли что-то, что мне не хватает, или это может быть регрессия в Swift 3?
На самом деле, я думаю, я помню, что читал, что кортежи теперь более строгие в отношении своих ярлыков, поэтому это может быть особенностью. Я посмотрю, смогу ли я его найти ... – Robert
Кажется, я не могу найти его сейчас, но это в основном решает проблему для меня в любом случае. Благодаря! – Robert