如何在Swift中编写任何(s:SequenceType)

Ham*_*mer 7 swift

Swift似乎没有任何()或所有()的函数所以我试图创建自己的函数.我得到的最接近的是

func any<S: SequenceType
    where S.Generator.Element: BooleanType>
    (sequence: S) -> Bool{

    var __g = sequence.generate() 
    var first_element = __g.next()
    if first_element == nil{
        return false
    }
    return reduce(sequence, first_element!, {$0 || $1})
}
Run Code Online (Sandbox Code Playgroud)

编辑:根据评论,这个功能应该看起来像这样

func any<S: SequenceType
    where S.Generator.Element: BooleanType>
    (sequence: S) -> Bool{

    return reduce(sequence, false, {$0 || $1})
}
Run Code Online (Sandbox Code Playgroud)

编译告诉我

'S.Generator.Element' is not convertible to 'Bool'
Run Code Online (Sandbox Code Playgroud)

在我看来,我明确地告诉编译器它在第二行.我错过了什么?

dre*_*wag 3

你的问题是next返回一个可选的。这意味着reduce期望返回一个可选值并且$0是一个可选值。您必须解开可选选项才能使用该||运算符。您也不知道类型是 a Bool,只是知道它是 a BooleanType。您还必须Bool通过调用boolValue它来将其转换为实际值:

func any<S: SequenceType
    where S.Generator.Element: BooleanType>
    (sequence: S) -> Bool{

    var __g = sequence.generate() 
    var first_element = __g.next()
    if first_element == nil{
        return false
    }
    return reduce(sequence, first_element!.boolValue, {$0 || $1})
}
Run Code Online (Sandbox Code Playgroud)

然而,在这种情况下,我认为简单是最好的:

func any<S: SequenceType
    where S.Generator.Element: BooleanType>
    (sequence: S) -> Bool{

    for element in sequence {
        if element.boolValue {
            return true
        }
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)

这实际上也更有效,因为它一找到第一个就返回,true而不是总是遍历整个过程。