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})
}
编辑:根据评论,此功能应该看起来像这样
func any<S: SequenceType
where S.Generator.Element: BooleanType>
(sequence: S) -> Bool{
return reduce(sequence, false, {$0 || $1})
}
编译器告诉我
'S.Generator.Element' is not convertible to 'Bool'
在我看来,我明确地告诉编译器它在第二行。我错过了什么?
答案 0 :(得分:3)
您的问题是next
返回一个可选项。这意味着reduce期望返回一个可选项,$0
是可选的。您必须打开可选项才能使用||
运算符。您还不知道该类型是Bool
,只是它是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})
}
然而,在这种情况下,我认为简洁是最好的:
func any<S: SequenceType
where S.Generator.Element: BooleanType>
(sequence: S) -> Bool{
for element in sequence {
if element.boolValue {
return true
}
}
return false
}
这实际上也更有效率,因为它会在找到第一个true
后立即返回,而不是总是通过整个事情。