找到一个数字的最大值为我提供了 Optional()



当试图在我的数组中找到最高数字并将其显示在标签上时,我得到了一个带有Optional()的解决方案。我做了什么导致这种情况,另外,我如何在标签中没有围绕它的Optional()的情况下显示我的解决方案。

class ViewController: UIViewController {
@IBOutlet weak var game1: UITextField!
@IBOutlet weak var game2: UITextField!
@IBOutlet weak var game3: UITextField!
@IBOutlet weak var series: UILabel!
@IBOutlet weak var average: UILabel!
@IBOutlet weak var high: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func calculate(_ sender: Any) {
guard
let text1 = game1.text,
let text2 = game2.text,
let text3 = game3.text
else { return }
guard
let game1Results = Int(text1),
let game2Results = Int(text2),
let game3Results = Int(text3)
else { return }
let gameResultsArray = [game1Results, game2Results, game3Results]
high.text = "(String(describing: gameResultsArray.max()))"
}

gameResultsArray.max()返回可选值

max()@warn_unqualified_access func max() -> Element?

返回序列中的最大元素。

像这样更改代码

let gameResultsArray = [game1Results, game2Results, game3Results]
if let maximumVal = gameResultsArray.max() {
high.text = String(maximumVal)
}

上面的答案将适用于您。您需要解开max()函数返回给您的可选包。


有 5 种方法可以解开可选包。

  1. if-let 语句

  2. 警卫声明

  3. 强制展开

  4. 零聚结运算符

  5. 可选链接

如果您仍然感到困惑,请观看我在下面链接的视频。希望能清除一些东西。

来源: https://youtu.be/HntTRJHtLtA

您在字符串表示形式周围看到"Optional(("的原因是,不出所料,它是一个"可选"。我建议你参考 The Swift Programming Language: Optionals。

您正在使用guard let模式来解开其他选项的包装,您可以对max的结果执行相同的操作:

@IBAction func calculate(_ sender: Any) {
guard
let text1 = game1.text,
let text2 = game2.text,
let text3 = game3.text,
let value1 = Int(text1),
let value2 = Int(text2),
let value3 = Int(text3),
let highScore = [value1, value2, value3].max()
else { return }
high.text = "(highScore)"
}

我个人建议不要使用Int()将用户输入的文本字符串转换为数字,因为它不是"本地化的"。例如,美国用户通常使用,作为千位分隔符(例如"10,000"(,并非所有区域设置都这样做。例如,在德国,他们使用.(例如"10.000"(。您可以使用数字格式化程序将用户输入的文本转换为数字并返回,并遵循设备的首选区域设置首选项,例如:

let formatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter
}()
@IBAction func calculate(_ sender: Any) {
guard
let text1 = game1.text,
let text2 = game2.text,
let text3 = game3.text,
let value1 = formatter.number(from: text1)?.intValue,
let value2 = formatter.number(from: text2)?.intValue,
let value3 = formatter.number(from: text3)?.intValue,
let highScore = [value1, value2, value3].max()
else { return }
high.text = formatter.string(for: highScore)
}

最新更新