首先,这个问题不是"0美元的意思".我在swift文档中了解到$ 0就像索引一样.
我的问题是"如何numbers.sort { $0 > $1 }用于实现排序功能".我numbers.sort { $0 > $1 }在其他一些网站上搜索过这种语法,比如这个.它显然不是当前的版本.所以我还是无法理解它的含义.
print(numbers) //[20, 19, 1, 12]
let sortedNumbers = numbers.sort { $0 > $1 }
print(sortedNumbers) //[20, 19, 12, 1]
Run Code Online (Sandbox Code Playgroud)
有人可以为我解释上面这段简单的代码吗?就像这个简单的代码如何$0 > $1实现sort函数一样,将数字从大到小排序.
我知道一些关于索引,这个$ 0看起来像索引,但它只有$ 0和$ 1两个索引.那怎么能用到4个数字呢?根据我之前在C++中的知识,我无法理解其中的原理.
请尽可能具体说明您的答案.谢谢!
-----------------以下是编辑的额外部分-------------------
我不知道stackoverflow是否允许我像这样编辑我的问题,但是这个额外的部分太长了,所以我不能在评论中添加它.@pbodsk @Paul Richter
所以swift中的sort()语法使用快速排序来处理排序函数?
其实我的问题更多的是关于"什么是工作原理的sort{$0 > $1}".我知道你的意思,我认为这与swift 2.1文件所说的相似,但你的回答并不是我真正想知道的.对不起,我的英文表达不是很好.让我尝试另一种方式.
当我之前学习C++时,总会有一些文档来解释函数的操作原理是什么,或者这个函数(如此处的sort()如何)在后台运行.Sort()这里需要比较第一次和第二次交换.在C++中,它就像
if numbers[1] < numbers[2]{ //just consider this pseudocode
int k;
k = numbers[1];
numbers[1] = numbers[2];
numbers[2] = k;
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到这个过程很明显.在快速,就像
numbers.sort({(val1: Int, val2: Int) -> Bool in
return val1 > val2
})
Run Code Online (Sandbox Code Playgroud)
它在哪里比较?它是如何互换的?是return val1 > val2自动比较和交换这两个值并返回它们?只需这一个语法就可以实现这3个进程吗?怎么样?这是我真正想知道的.对于我糟糕的英语表达再次抱歉.
pbo*_*dsk 25
@the_UB和@moonvader都是对的,但我只是想我会从@moonvader中扩展一下这个例子,只是为了告诉你我们最终如何 $0 > $1
如果你看一下关于Closure Expressions的 "Swift编程语言"中的例子,你可以看到对数组进行排序,你可以调用该sort方法,然后可以将函数作为参数.
此函数必须采用两个参数并进行比较,然后返回一个布尔值.
所以如果我们有这个数组:
let numbers = [4, 6, 8, 1, 3]
而这种方法
func sortBackwards(val1: Int, val2: Int) -> Bool {
print("val1: \(val1) - val2: \(val2)" )
return val1 > val2
}
Run Code Online (Sandbox Code Playgroud)
我们可以像这样对元素进行排序:
numbers.sort(sortBackwards) //gives us [8, 6, 4, 3, 1]
该sort方法将对sortBackwards数组中的每个元素使用我们的方法并进行比较.
这是输出 print
val1: 6 - val2: 4
val1: 8 - val2: 4
val1: 8 - val2: 6
val1: 1 - val2: 4
val1: 3 - val2: 1
val1: 3 - val2: 4
Run Code Online (Sandbox Code Playgroud)
好吧,让我们减少它.
我们可以直接将其作为参数添加到sort方法中,而不是定义函数,如下所示:
numbers.sort({(val1: Int, val2: Int) -> Bool in
return val1 > val2
})
Run Code Online (Sandbox Code Playgroud)
我们最终还是[8,6,4,3,1](多么幸运!)
好的,接下来我们可以做的是"Swift编程语言"(上面的链接)被称为"从上下文中推断类型".正如我们所说的阵列上这种方法IntS,斯威夫特可以计算出,我们val1和val2参数必须是Int太,没有必要为我们讲述它.所以,让我们删除类型.这让我们:
numbers.sort({val1, val2 in
return val1 > val2
})
Run Code Online (Sandbox Code Playgroud)
而且结果仍然相同.
好的,到那儿.我们接下来要做的是书中的内容称为"单表达式闭包的隐式返回"
由于我们的比较可以在一行中完成,因此我们无需使用return.所以:
numbers.sort({val1, val2 in val1 > val2})
Run Code Online (Sandbox Code Playgroud)
还给我们[8,6,4,3,1]
最后我们得到@moonvader使用了更少的单词来解释:-)即"速记参数名称"
正如书中所说:
Swift自动为内联闭包提供简写参数名称,可用于通过名称$ 0,$ 1,$ 2等引用闭包参数的值.
所以,在我们的例子中,val1可以被替换$0,并val2可以被替换$1
这给了我们:
numbers.sort({$0 > $1})
Run Code Online (Sandbox Code Playgroud)
我们仍然得到[8,6,4,3,1]
然后我们可以继续使用"Trailing Closure",这意味着如果函数的最后一个参数是闭包,我们可以在函数"外部"添加该参数.
所以我们最终得到:
numbers.sort{$0 > $1}
Run Code Online (Sandbox Code Playgroud)
结果仍然是[8,6,4,3,1]
希望有助于澄清事情.
| 归档时间: |
|
| 查看次数: |
4403 次 |
| 最近记录: |