2017-08-11 102 views
0

我只是遵循迭代器模式,你能告诉我什么是S.Iterator.Element在下面的代码&什么意思是Int where Turn == S.Iterator.Elementswift中的iterator.element是什么?

func computeScoreIncrement<S : Sequence>(_ pastTurnsReversed: S) -> Int where Turn == S.Iterator.Element { 
    var scoreIncrement: Int? 
    for turn in pastTurnsReversed { 
     if scoreIncrement == nil { 
     scoreIncrement = turn.matched! ? 1 : -1 
     break 
     } 
    } 
//Turn is class name & nextScorer is protocol instance. 
    return (scoreIncrement ?? 0) + (nextScorer?.computeScoreIncrement(pastTurnsReversed) ?? 0) 
    } 

回答

3

Iterator.Element是这里最容易理解的。泛型参数S必须符合Sequence一个类型,因为你已经在这里指定:

func computeScoreIncrement<S : Sequence>(_ pastTurnsReversed: S) -> Int 
//      ^^^^^^^^^^^^^^ 

因此,S.Iterator.Element指的是序列的类型S是。如果假设S被推断为[Int],则S.Iterator.ElementInt-[Int]Int的序列。

现在进入where Turn == S.Iterator.Element部分。

如上所述,S必须是符合Sequence的类型,但这不是所有的约束! S.Iterator.Element也必须是相同类型为Turn。你没有说明如何定义Turn。它可能是封闭类,类,结构或枚举的通用参数。

因此,我可以将[Turn]传递给此方法,以将某个其他类型的实例传递给Turn s。

+0

谢谢!很好的解释。 – Amit

相关问题