2016-09-26 72 views
4

我想要一個函數,接受序列Int。下面是我想寫什麼:功能,接受類型的序列

func process(items: Sequence<Int>) { 
    items.forEach { ... } 
} 

Error: "Cannot specialize non-generic type 'Sequence'".

更正(我認爲):

func process<S: Sequence>(items: S) where S.Iterator.Element == Int { 
    items.forEach { ... } 
} 

相當多的繁瑣。

我知道序列協議有一個關聯的類型Iterator它有Element。但我不太清楚爲什麼我必須以這種奇怪的方式解決Int需求。

什麼是使第一個版本不起作用,但第二個?錯誤是什麼意思?

+0

func process(items:Int) - > Sequence {} –

回答

1

你提的問題是與泛型類型相關類型之間的區別做。請參閱here(標題爲「Generic Types」,「Associated Types」的章節),以便在Swift中對其目的進行基本解釋。協議,如序列,使用相關的類型,而不是泛型類型。如果Sequence是一個具有泛型類型的具體類,那麼你的第一個代碼示例是有意義的 - 這種差異應該解釋錯誤消息。

至於爲什麼協議使用關聯類型而不是泛型,請參閱this question的頂部答案。實質上,雖然它們似乎具有相同的目的,但關聯類型意味着更靈活和更具描述性,其中泛型類型是關於實現的。這使得您的代碼示例更加冗長,但總體而言,使得許多代碼示例更簡單。

事實上,從Sequence source code,Sequence有一個關聯的類型迭代器,它符合IteratorProtocol協議,而IteratorProtocol協議又有它自己的關聯類型Element(可以是任何類型)。

0

你爲什麼不使用一組Int

func process(items: [Int]) { 
    items.forEach { ... } 
} 
+1

我想接受任何「Int」序列。我想了解我提出的問題。 – tombardey

+0

你是什麼意思的任何順序的Int? – PGDev

0

您可以使用Variadic Parameters

func process(items: Int...) { 
    items.forEach { (item) in 
     //do stuff with your 'item' 
    } 
}