Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是';条件';在swift教程中是指函数吗?_Swift - Fatal编程技术网

什么是';条件';在swift教程中是指函数吗?

什么是';条件';在swift教程中是指函数吗?,swift,Swift,我知道在第一行中,我们可以使用lessThanTen(数字:Int)替换(Int),而contidion表示标签,但在第三行:*为什么不使用if条件:(item)替换if条件(item),因为条件是标签。 条件是一个Bool-返回提供给hasAnyMatches的闭包,需要调用该闭包以生成布尔值。闭包接受类型为Int的单个参数,该类型与列表的元素类型相同。因此,我们在每个项上调用提供的(Int)->Bool闭包,如果应用于项的条件返回真,我们将列表项的遍历缩短,并从函数中返回真 使用函数式编程技

我知道在第一行中,我们可以使用lessThanTen(数字:Int)替换(Int),而contidion表示标签,但在第三行:*为什么不使用if条件:(item)替换if条件(item),因为条件是标签。
条件
是一个
Bool
-返回提供给
hasAnyMatches
的闭包,需要调用该闭包以生成布尔值。闭包接受类型为
Int
的单个参数,该类型与
列表的元素类型相同。因此,我们在每个项上调用提供的
(Int)->Bool
闭包,如果应用于项的
条件
返回
,我们将
列表
项的遍历缩短,并从函数中返回

使用函数式编程技术,我们可以利用
list
上的
reduce
操作来压缩
hasAnyMatches
的实现:

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
    return list.reduce(false) { $0 || condition($1) }
}
或者,更好的方法是(允许退出
return
,就像在原始循环中一样),如@Hamish在下面的注释中所述(谢谢!),使用
contains

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
    return list.contains(where: condition)
}
用法示例:

func lessThanTen(number: Int) -> Bool {
    return number < 10
}

var numbers = [20, 19, 7, 12]
print(hasAnyMatches(list: numbers, condition: lessThanTen)) // true
func-lessThanTen(数字:Int)->Bool{
返回编号<10
}
变量数=[20,19,7,12]
打印(hasAnyMatches(列表:编号,条件:lessThanTen))//true

条件是您在该方法上收到的方法,如果您查看该方法签名:

condition: (int) -> Bool
这意味着您收到的条件可以使用Int类型的参数调用,并将返回bool。任何地方,在里面:

hasAnyMatches 
你可以使用

condition(anyInt)

现在,如果查看方法调用方:

hasAnyMatches(list: numbers, condition: lessThanTen)
那么,你是说“hasAnyMatches”的“条件”将是“Lessthaten”。这意味着在你的

if condition(item)
真正发生的是:

if lessThanTen(item)

我希望这能让事情更清楚

请注意,在这种情况下,使用
contains(其中:)
reduce
更好,因为它会在找到
true
时提前返回(您也可以说
return list.contains(其中:条件)
)。虽然我们现在已经真正达到了
hasAnyMatches
函数从实用角度来看是完全冗余的;)@Hamish true,完全忘记了
包含
,这里更好,也更好地反映了原始
for
循环。作为旁注,我相信
reduce
也会允许短路,我记得我测试过这一点(不过使用了一些不必要的布尔计算),但是自然地
包含
更适合这个目的,感谢您的反馈!没问题:)只是好奇,你是怎么想让
reduce
短路的?我能想到的实现这一点的唯一方法是定义一个自定义的
错误
类型,并将其从传递给
reduce
的函数中抛出(然后在调用方捕获并返回)@Hamish仔细想想,我在分析这一点时可能犯了错误,但我得出了天真的结论(简单地基于
循环的reduce与simple early exit
的基准执行时间)编译器magic会将上述简单的reduce操作简化为类似于“
condition1()| | condition2()| |……| | conditionN()
”的操作对于第一个返回的
conditionX(),允许在运行时短路
。但是,当我仔细考虑后,它似乎不太可能出现,但回头做一个更好的分析会很有趣。啊,好吧,我不太明白你说的是编译器优化。我不相信编译器会因为数组的长度直到运行时才知道而短路(虽然我认为如果编译器知道它使用的是数组文字,就有可能进行积极的优化,但我不知道它是否真的这样做了)。我同意,看看编译器在这种情况下到底能做些什么肯定很有意思——如果有时间,我会尝试自己做一些研究:)为什么我们可以用“lessThanTen”来代替“condition”?既然“lessThanTen”是一个函数标题,而“condition”是标签。既然在第一行中,“condition”代表标签。你知道第三行中的“condition”代表什么吗?如果它代表标签,我们为什么不使用“:”或者我们不使用它,因为这只是一个我们可以忽略它的规则?另一方面,我们知道:在第一行:(int)代表一个函数,这里是“lessThanTen”,在第三行(item)也代表一个函数,为什么我们不将“条件(item)”改为“(item)”?