当前位置: 首页 > 面试题库 >

斯威夫特:有人可以为我解释这种语法`numbers.sort {$ 0> $ 1}`吗?

丁勇
2023-03-14
问题内容

首先,这个问题不是关于“ $ 0意味着什么”。我在迅速的文档中了解到$ 0就像索引。

我的问题是“如何numbers.sort { $0 > $1 }用于实现排序功能”。我numbers.sort { $0 > $1 }在其他一些网站(例如this)中搜索了这种语法。它显然不是当前版本。所以我仍然不明白它的含义。

print(numbers) //[20, 19, 1, 12]
let sortedNumbers = numbers.sort { $0 > $1 }
print(sortedNumbers) //[20, 19, 12, 1]

有人可以为我解释上面的这段简单代码吗?就像这个简单的代码如何$0 > $1实现排序功能一样,将数字从大到小排序

我对索引有些了解,这个 $ 0 看起来像index,但是它只有 $ 0$ 1
两个索引。那么如何将其用于4个数字呢?根据我以前对C ++的了解,我无法理解其中的原理。

请使您的答案尽可能 具体 。谢谢!

-----------------以下是编辑的额外部分-------------------

我不知道是否可以使用stackoverflow编辑这样的问题,但是这多余的部分太长了,因此无法在注释中添加它。@pbodsk @保罗·里希特

那么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;
}

我们可以看到这个过程是显而易见的。很快,就像

numbers.sort({(val1: Int, val2: Int) -> Bool in
   return val1 > val2
})

在哪里比较?以及如何互换?是否return val1 > val2自动比较和交换这两个值并返回它们?只是这一语法实现了所有这三个过程?怎么样?这就是我真正想知道的。再次抱歉我的英语表达不佳。


问题答案:

@the_UB和@moonvader都是正确的,但我只是想将示例从@moonvader扩展一点,只是为了向您展示我们最终如何 $0 > $1

如果查看“快速编程语言”中有关闭包表达式的示例,您会看到对数组进行排序的sort方法是调用方法,该方法随后可以将函数作为参数。

此函数必须接受两个参数并进行比较,然后返回布尔值。

所以如果我们有这个数组:

let numbers = [4, 6, 8, 1, 3]

和这种方法

func sortBackwards(val1: Int, val2: Int) -> Bool {
   print("val1: \(val1) - val2: \(val2)" )
   return val1 > val2
}

我们可以像这样对元素进行排序:

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

好的,我们减少它。

无需定义函数,我们可以将其作为参数直接添加到sort方法中,如下所示:

numbers.sort({(val1: Int, val2: Int) -> Bool in
   return val1 > val2
})

而且我们仍然以[8,6,4,3,1]结尾(多么幸运!)

好的,接下来我们可以做的是在“ Swift编程语言”(上面的链接)中进行的操作称为“从上下文推断类型”。当我们在Ints
数组上调用此方法时,Swift可以弄清楚我们的val1val2参数也必须是Ints,因此无需我们告诉它。因此,让我们删除类型。这给我们留下了:

numbers.sort({val1, val2 in
   return val1 > val2
})

仍然是相同的结果。

好,到那儿。我们接下来要做的是在书中称为“单表达闭包的隐式收益”

由于我们的比较可以一行完成,因此我们无需使用return。所以:

numbers.sort({val1, val2 in val1 > val2})

仍然给我们[8,6,4,4,3,1]

最后,我们要了解@moonvader用更少的词来解释:-)即“速记参数名称”

正如书中所说:

Swift会自动为内联闭包提供速记参数名称,可使用$ 0,$ 1,$ 2等名称来引用闭包参数的值。

因此,在我们的示例中,val1可以替换为,$0并且val2可以替换为$1

这给了我们:

numbers.sort({$0 > $1})

仍然得到[8,6,4,4,3,1]

然后,我们可以继续使用“尾随闭包”,这意味着如果函数的最后一个参数是闭包,则可以在函数的“外部”添加该参数。

因此,我们最终得到:

numbers.sort{$0 > $1}

结果仍然是[8、6、4、3、1]

希望这有助于澄清问题。



 类似资料:
  • 问题内容: 函数定义中的下划线是什么意思? 例如 我了解在定义函数时,我可以执行以下操作: 然后,我将其称为而不是,即故意隐藏参数名称吗? 问题答案: Swift需要一个约定来说明函数名称是什么,不仅包括函数名称本身(在括号之前),还包括参数的外部名称。约定是名称后跟冒号。因此,这是一个函数声明(在Swift 2.0中): 这是该函数的名称: 但是,在现实生活中,一个或多个参数有可能(实际上)不会

  • 问题内容: 我正在学习快速,并试图理解字典。我已经习惯了PHP,您可能会在其中编写以下内容… 在此示例中,将按以下顺序输出值:1、2、3 我的快速代码看起来像这样… 但是,值以意外的顺序出现。我可以做些干净的事情来保持值的创建顺序,还是不能对字典进行快速排序? 问题答案: 正如已经回答的那样,词典的要点是未排序。Swift(和Objective-C)中有三种类型的集合 数组是项目的有序列表。当项目

  • 问题内容: 什么之间的区别,以及何时该使用的呢? 例如,在Python中,如果我想打印字典,我只是,但是现在有2个其他选项。我应该如何以及何时使用它们? 问题答案: 一些区别: vs : 调试应用程序时,该功能在Xcode控制台中打印消息。 这是Swift 2中已删除且不再使用的变体。如果看到正在使用的旧代码,则可以安全地将其替换为。 回到Swift 1.x,没有在打印字符串的末尾添加换行符,而是

  • 问题内容: 为了在使用Swift时与C API集成,我需要使用sizeof函数。在C语言中,这很容易。在Swift中,我处于类型错误的迷宫中。 我有以下代码: 第二行显示错误“’NSNumber’不是’T.Type’的子类型”。为什么会这样,我该如何解决? 问题答案: 使用sizeof如下: 使用类型作为参数。 如果您想要变量的大小,可以将该字段传递给。 像这样: 或更简单地说(由user1020

  • 问题内容: NS和非NS类之间有什么区别?特别是vs ?是否代表围绕核心非功能性的某种包装器? 问题答案: Swift 3 为现有Foundation类类型引入了一些新的 覆盖值类型 ,例如for ,for 等。完整列表和详细信息可以在下面找到 SE-0069变异性和基础价值类型 一些原因是 提供适当的值语义, 而不是可变且不可变的变体, 更多的“ Swifty” API。 新的叠加层类型应提供相

  • 问题内容: 我一直在尝试实现单例,以用作我从网络上传到我的iOS应用的照片的缓存。我在下面的代码中附加了三个变体。我试图使版本2正常工作,但是它导致了我不理解的编译器错误,并希望就我做错的事情寻求帮助。变体1进行缓存,但我不喜欢使用全局变量。变体3并没有进行实际的缓存,我相信这是因为我在赋给var ic = ....的赋值中获得了副本,对吗? 任何反馈和见解将不胜感激。 谢谢Zvi 问题答案: 标