我是Swift的新手。 我有这个代码的错误,我在这个网站上找不到任何答案。 我打印的数字最多,但我想打印最大数量的那种。
$lastId = $mysqli->insert_id; // this is how you will get last inserted id
答案 0 :(得分:2)
请改为尝试:
var largestNumber = 0
var largestNumberKind: String!
for (kind, numbers) in interestingNumbers {
for x in numbers {
if x > largestNumber {
largestNumber = x
largertNumberKind = kind
}
}
}
print("the largest number is = \(largestNumber)")
print("the largest number kind is = \(largestNumberKind)")
关于您的原始代码:
largestNumberKind
变量就是这样。 kind: String
没有任何意义(for y in kind
行)。你的外部循环已经一次迭代一个键,所以这样的内部循环是没有意义的。 答案 1 :(得分:1)
Paulo的方法没有任何问题(有一些小的修正;请参见那里的评论),但这是探索更多不需要循环和变异的功能方法的合理问题。
例如,我们可以将每种类型展平为最大元素(如果它为空,则为Int.min
),然后采用最高最大值的种类:
interestingNumbers
.map { (kind: $0, maxValue: $1.max() ?? .min) } // Map each kind to its max value
.max { $0.maxValue < $1.maxValue }? // Find the kind with the max value
.kind // Return the kind
这确实创造了一种我不爱的轻微边缘条件。如果您评估以下内容:
let interestingNumbers = [
"ImaginaryReals": [],
"Smallest": [Int.min],
]
这里没有明确定义哪些将被退回。显然,正确答案是&#34;最小,&#34;但它依赖于顺序。通过更多的思考(和代码),我们可以解决这个问题。问题是我们通过将空列表视为最大Int.min
来采取一点捷径(这也阻止了我们的系统为Float
之类的事情工作,所以很难过)。所以,让我们解决这个问题。让我们准确一点。空列表的max
为nil
。我们想放弃这些元素。
我们可以使用mapValues
的修改版本(我相信coming in Swift 4)。我们会flatMapValues
:
extension Dictionary {
func flatMapValues<T>(_ transform: (Value) throws -> T?) rethrows -> [Key: T] {
var result: [Key: T] = [:]
for (key, value) in self {
if let newValue = try transform(value) {
result[key] = newValue
}
}
return result
}
}
有了这个,我们可以完全精确,即使混合中有空列表:
interestingNumbers
.flatMapValues { $0.max() }
.max { $0.1 < $1.1 }?
.key
再一次,如果你发现这一点,保罗的方法没有错,但还有其他方法可以解决这个问题。
顺便说一句,迭代的等效版本看起来像这样:
var largestNumber: Int? = nil
var largestNumberKind: String? = nil
for (kind, numbers) in interestingNumbers {
for x in numbers {
if largestNumber == nil || largestNumber! < x {
largestNumber = x
largestNumberKind = kind
}
}
}