对不起,我是新来的,我正在学习 iOS 从头开始开发。
我知道为了在 Int 数组中找到最大的 value,我们可以使用属性“.max()”。但我需要使用 for-in 循环来做到这一点。有人可以帮助我吗?我知道这很容易,但我找不到它,也不知道如何自己做。谢谢。
回答1
Swift 的 array.max() 的复杂度是 O(N) ,就像 for-in 循环一样。
Swift 中的for-in 有两种方法。
第一个解决方案(这里的 for-in 就像每个 value 一样)
let arr = [1, 4, 3]
var max = Int.min
// get each value
for val in arr {
if (max < val) {
max = val
}
}
第二种解决方案(这里的 for-in 是针对每个索引的)
let arr = [1, 4, 3]
var max = Int.min
// get each index
for i in 0..<arr.count {
if (max < arr[i]) {
max = arr[i]
}
}
两种方式具有相同的输出。在选择在您的进一步代码中使用哪个时,请随意。
回答2
如果您的数组为空,则返回 Int.min
作为最大值 value 是不正确的。
返回一个可选的更正确:
var max: Int? = nil
for val in arr {
guard let maxSoFar = max else {
max = val
continue
}
if val > maxSoFar {
max = val
}
}
尽管您可能更喜欢将其编写为 Collection 的扩展,例如:
extension Collection where Element: Comparable {
func mMax() -> Element? {
var max: Element? = nil
// get each value
for val in self {
guard let maxSoFar = max else {
max = val
continue
}
if val > maxSoFar {
max = val
}
}
return max
}
}
[1, 2, 3].mMax() // 3
([] as [Int]).mMax() // nil
["a", "c", "b"].mMax() // "c"
或者更一般地说,它不依赖于 '>' 函数,例如:
extension Collection {
func mMax(by compare: (Element, Element) -> Bool) -> Element? {
var max: Element? = nil
// get each value
for val in self {
guard let maxSoFar = max else {
max = val
continue
}
if compare(val, maxSoFar) {
max = val
}
}
return max
}
}
[1, 2, 3].mMax(by: >) // 3
([] as [Int]).mMax(by: >) // nil
let longestString = ["aaa", "a", "aaaaa"].mMax(by: { $0.count > $1.count }) /// "aaaaa"