函数可以将另一个函数作为其参数之一

时间:2017-07-06 06:45:42

标签: swift swift-playground

我在游乐场中编写了以下代码,并尝试向Apple doc功能&类。
这是我的代码..

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, condition: lessThanTen)

我怎样才能直接传递不同的条件? 我能这样写吗......

hasAnyMatches(numbers, condition: { $0 < 10 })

实际上这个函数返回true / false,但是当我这样写的时候代表这行代码o / p :( 4次) 那么当我这样写的时候会发生什么。

并给我解决方案直接传递hasAnyMatches()函数中的条件。

3 个答案:

答案 0 :(得分:1)

你写它的方式很好!你只是错过了调用中的第一个参数标签。它应该是:

hasAnyMatches(list: numbers, condition: { $0 < 10 })

答案 1 :(得分:1)

当你这样写:

hasAnyMatches(numbers, condition: { $0 < 10 })

游乐场说“(4次)”。这是因为关闭{ $0 < 10 }执行了四次,numbers中每个项目执行一次。

要让它显示hasAnyMatches函数的返回值,有几种方法可以做到这一点。

  • 您可以将{$0 < 10}放在自己的行上:

    hasAnyMatches(list: numbers, condition: // shows true on this line
        {$0 < 10} // shows (4 times) on this line
    )
    
  • 您可以将结果存储到变量中,然后获取变量的值:

    let val = hasAnyMatches(list: numbers, condition: {$0 < 10})
    val // shows true on this line
    

答案 2 :(得分:1)

hasAnyMatches函数获取数字列表和条件闭包,这样你就可以传递任何带Int的闭包并返回bool

let numbers = [20, 19, 7, 12]
let lessThan: (Int) -> Bool = { $0 < 10 }
let match = hasAnyMatches(list: numbers, condition: lessThan)
print(match)

编写相同内容的另一种方法是使用filters迭代一个集合并返回一个只包含与include条件匹配的元素的Array。使用过滤器的主要优点是它内置,你不需要单独的hasAnyMatches函数来检查条件

let numbers = [20, 19, 7, 12]
let match = numbers.filter ({ $0 < 10 }).count > 0
print(match)