【问题标题】:Finding a max of a number provides me with Optional()找到一个数字的最大值为我提供了 Optional()
【发布时间】:2020-05-22 22:48:15
【问题描述】:

当试图在我的数组中找到最大的数字并将其显示在标签上时,我得到了我的解决方案,其周围有一个 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()))"
}

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    gameResultsArray.max() 返回可选值

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

    返回序列中的最大元素。

    像这样更改你的代码

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

    【讨论】:

      【解决方案2】:

      您在字符串表示周围看到“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)
      }
      

      【讨论】:

        【解决方案3】:

        以上答案对您有用。您需要解开 max() 函数返回给您的可选项。


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

        1. if-let 语句

        2. 保护语句

        3. 强制展开

        4. 零合并运算符

        5. 可选链接

        如果您仍然感到困惑,请观看我在下面链接的视频。希望这能解决一些问题。

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

        【讨论】:

          猜你喜欢
          • 2014-07-28
          • 2020-01-26
          • 1970-01-01
          • 1970-01-01
          • 2022-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-24
          相关资源
          最近更新 更多