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

前端之家收集整理的这篇文章主要介绍了如何在Swift中编写任何(s:SequenceType)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Swift似乎没有任何()或所有()的函数,所以我试图创建自己的函数.我得到的最接近的是
  1. func any<S: SequenceType
  2. where S.Generator.Element: BooleanType>
  3. (sequence: S) -> Bool{
  4.  
  5. var __g = sequence.generate()
  6. var first_element = __g.next()
  7. if first_element == nil{
  8. return false
  9. }
  10. return reduce(sequence,first_element!,{$0 || $1})
  11. }

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

  1. func any<S: SequenceType
  2. where S.Generator.Element: BooleanType>
  3. (sequence: S) -> Bool{
  4.  
  5. return reduce(sequence,false,{$0 || $1})
  6. }

编译告诉我

  1. 'S.Generator.Element' is not convertible to 'Bool'

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

你的问题是next返回一个可选项.这意味着reduce期望返回一个可选项,$0是可选项.您必须打开可选项才能使用||操作符.你也不知道这个类型是Bool,只是它是一个BooleanType.您还必须通过调用boolValue将其转换为实际的Bool:
  1. func any<S: SequenceType
  2. where S.Generator.Element: BooleanType>
  3. (sequence: S) -> Bool{
  4.  
  5. var __g = sequence.generate()
  6. var first_element = __g.next()
  7. if first_element == nil{
  8. return false
  9. }
  10. return reduce(sequence,first_element!.boolValue,{$0 || $1})
  11. }

但是,在这种情况下,我认为简洁是最好的:

  1. func any<S: SequenceType
  2. where S.Generator.Element: BooleanType>
  3. (sequence: S) -> Bool{
  4.  
  5. for element in sequence {
  6. if element.boolValue {
  7. return true
  8. }
  9. }
  10. return false
  11. }

这实际上也更有效,因为它一找到第一个就返回而不是总是通过整个事情.

猜你在找的Swift相关文章