请向初学者解释在字典中查找最大值的功能是如何工作的。
我知道还有更简洁的解决方案,但我想一步一步地了解这里发生了什么。
var someDictionary = ["One": 41, "Two": 17, "Three": 23]
func maxValue() {
let maxValueOfSomeDictionary = someDictionary.max { a, b in a.value < b.value }
print(maxValueOfSomeDictionary!.value)
}
maxValue()
someDictionary
是一个字典。Dictionary是一种序列(请参阅Dictionary的"默认实现"部分,了解它是一个序列(。序列提供了方法max(by:)
,该方法为:
返回序列中的最大元素,使用给定的谓词作为元素之间的比较。
Swift有尾随闭包语法,因此您可以编写.max {...}
而不是.max(by: { ... })
。这两种语法是相同的,但大多数开发人员在可能的情况下使用尾随闭包语法。
参数定义为:
areInIncreasingOrder
如果第一个参数应在第二个参数之前排序,则返回true的谓词;否则为false。
作为序列的Dictionary元素是一个元组(key: Key, value: Value)
,因此这是传递给areInIncreasingOrder
的类型。
闭包定义了两个参数a
和b
,每个参数的类型都是(key: Key, value: Value)
。返回a.value
是否小于b.value
。Swift允许使用1语句闭包来省略return
。
这段话有点技术性,你可能想跳过它;DR是max
根据您的闭包返回最大元素如果闭包遵守文档中定义的规则,max
算法将返回最大元素,用于"的特定定义;最大值;即在根据CCD_ 15在该序列之后排序的序列中不存在元素。这个迂腐的定义在列表中有不可比较的东西时尤其重要。相等元素(有点奇怪的IMO(被定义为"相等元素";无与伦比的";因为两者都不在前。这对于NaN等值也很重要。
这将返回一个最大元素,如果Sequence为空,则返回nil
。(文档上说的是"最大元素",但在不可比元素的情况下,没有承诺会返回哪一个。(
maxValueOfSomeDictionary
的类型为(key: String, value: Int)?
,是字典元素的可选版本,因为它可以是一个值,也可以是nil
。
maxValueOfSomeDictionary!
将Optional转换为其包装值,或者在Optional为nil时崩溃。然后打印出其中的.value
。
要准确了解max
的操作方式,可以阅读stdlib中的默认实现。