var add: (Int,Int,Int)->Int
add = {
//So here the $0 is first argument $1 is second argument $2 is third argument
return $0 + $1 + $2
//The above statement can also be written as $0 + $1 + $2 i.e is return is optional
}
let result = add(20, 30, 40)
print(result) // Prints 90
var printer = { (n: Int) -> Void in
print(n)
}
// Test calling printer closure on a number 3 for example:
printer(3) // prints 3 - it works
// Now, use printer to print numbers (from the previous example):
numbers.forEach(printer) // prints 1, 2, 3, 4, 5
7条答案
按热度按时间inn6fuwd1#
$0
是传递到闭包中的第一个参数。$1
是第二个参数,依此类推。qco9c6ql2#
TL;DR
SWIFT 5.7
$0
和$1
是闭包的第一个和第二个速记参数名称(简称SAN)或隐式参数名称。速记参数名称由SWIFT自动提供。第一个参数被**$0
引用,第二个参数被**$1
引用,第三个参数被$2
**引用,依此类推。如您所知,Closure是一个自包含的功能块(没有名称的函数),可以在代码中传递和使用。闭包在其他编程语言中有不同的名称,含义也略有不同--在Python和Kotlin中是Lambda,在C和Objective-C中是Block。
缩短封闭期
1.常规函数
2.内联闭包表达式
3.隐式返回的闭包从上下文推断类型
4.速记参数名称
5.运算符方法
带闭包的高阶函数
速记参数名称$0
带余数运算符的完整闭包表达式(又名模数)
带余数运算符的速记参数名
各种函数中的SAN
变量函数是接受任意数量的参数的函数。最著名的变分方法之一是
print(...)
。速记参数名称非常适合各种函数。存在序列类型$0
这里,
allSatisfy()
方法指示序列的每个元素是否满足给定的 predicate 。Any
类型表示任何类型的值。存在的any
类型用于存储符合特定协议的任何类型的值。另外,我在这里使用了可选绑定(跟踪现有常量)的简写语法。重复$0
闭包捕获$0
如果您在闭包内使用外部值,则SWIFT会捕获它们。
速记参数名称$0、$1、$2
sans$0、$1、$2、$3、$4
密钥路径表达式
从SWIFT 5.2+开始,您可以通过关键路径表达式访问每个示例的参数:
当然,您也可以使用熟悉的语法:
常规语法-
$0.property
:带下标的SAN
(如果你想知道如何在数组中实现
negative indexing
,请阅读这篇文章。)另一个带有
key
快捷方式(SWIFT 5.6)和下标的示例:或者看看无序集合的例子:
完成处理程序中的SAN
但是,常规语法如下所示:
SAN in Form SwiftUI中的每个结构
运营商方式VS SAN
操作员方法:
速记参数名称$0和$1:
取值为$0
当SwiftUI手势更改或结束时,
.onChanged
和.onEnded
修饰符执行*@转义闭包*。SWIFT VSKotlinVS PYTHON
另外,让我们看看Kotlin的lambda与Swift的闭合有什么相似之处:
SWIFT
柯特林
Kotlin的lambda表达式只有一个隐式名称的参数:
it
。换句话说,如果您的函数文本只有一个参数,则不需要显式定义该参数,您可以改用it
(就像SWIFT中的$0
)。But in Python there's no equivalent of Shorthand Argument Name
。Python
ulmd4ohb3#
它表示发送到闭包中的人手不足的参数,本例对其进行了分解:
SWIFT 4:
svgewumm4#
指的是排序的第一个和第二个参数。在这里,
sort
比较两个元素并对它们进行排序。您可以在Swift official documentation上查找更多信息:SWIFT自动为内联闭包提供简写参数名称,可用于通过名称$0、$1、$2等引用闭包参数的值。
jk9hmnmh5#
除了@Bobby的回答,我还想加一个例子
50pmv0ei6#
它是参数的速记名称。
SWIFT自动为内联闭包提供简写参数名称,可用于通过名称$0、$1、$2等引用闭包参数的值。
如果在闭包表达式中使用这些速记参数名称,则可以从其定义中省略闭包的参数列表,并且速记参数名称的数量和类型将从预期的函数类型中推断出来。也可以省略in关键字,因为闭包表达式完全由其正文组成:
这里,$0和$1指的是闭包的第一个和第二个字符串参数。
dffbzjpn7#
$0
、$1,
等表示在集合上执行操作时的项。例如,要打印数字列表,可以使用内置的
forEach()
函数和$0
,如下所示:这里,
$0
一次表示数组中的每个数字。SWIFT中的🛑**$0和$1**
在解释什么是
$0
和$1
之前,让我们先看一个例子。假设您有一个数字数组,并且想要打印它们。您可以使用for循环来完成此操作:
但是,还有另一种使用
forEach
和$0
的替代方法:让我们检查一下代码,看看它有什么作用:
numbers
数组并调用forEach来运行数组中的代码for each
number元素。forEach
方法接受带有数字参数的闭包。在本例中,闭包是{ print($0) }
。对数组中的每个数字逐个调用此闭包。$0
表示来自numbers
数组的不同数字参数。🛑更详细的解释
让我们创建一个闭包,并将其赋给一个名为
printer
的变量。此闭包将一个数字作为其参数并打印出来:您可以简化这个闭包:最后,使用这个闭包打印一个整数数组。因此,SWIFT可以自动推断参数类型(整型),而无需明确指定。因此,
printer
可以简化为:现在,这就是
$0
的用武之地:在SWIFT中,也可以省略闭包中的参数名。在执行此操作时,可以使用$0
、$1
、$2
引用省略的参数。让我们通过省略数字参数来简化打印机关闭:最后,没有什么可以强迫您将
printer
赋给一个名为printer
的变量。您可以匿名使用闭包来实现相同的行为:这就是你之前看到的那条线。
创建一个数组,其中Numbers数组中的所有
numbers
都使用map
方法进行二次幂运算。Code Happy;)