后卫放手后强制解开

问题描述

有人告诉我我的代码包含许多强制展开的功能。我认为如果可以确定操作的值不会为零,则可以这样做:

private var x: Int?
private var y: Int?

@IBAction func startButtonPressed(_ sender: UIButton) {
    
    guard let numberOfRooms = selectedRooms.text,!numberOfRooms.isEmpty else {
        return selectedRooms.placeholder = "type it,dude"
    } 
    let rooms = Int(numberOfRooms)
                   
    x = Int(ceil(sqrt(Double(rooms!))))
    y = x //grab some values from user input
    maze = MazeGenerator(x!,y!) //generate a maze 
    hp = 2 * (x! * y!) //get hp value depending on user input
    
    currentX = getRandomX(x!) //get random value in 0...x
    currentY = getRandomY(y!)
    currentCell = maze?.maze[currentX!][currentY!] //game starts in a random part of the maze
                            
    refreshButtons() //refresh UI
    maze!.display() //print maze scheme in debug console
    }

看起来不错吗?如果没有,该怎么办?

解决方法

建议避免使用 强制展开变量optional

即使您确定,在某些您未曾期望的特殊情况下,代码也可能会生成nil值。然后,这将导致您的应用不必要地崩溃并带来糟糕的用户体验。

尝试使用可选绑定 if-let / guard-let 语句来安全地打开可选内容。

@IBAction func startButtonPressed(_ sender: UIButton) {
    
    guard let numberOfRooms = selectedRooms.text,!numberOfRooms.isEmpty,let rooms = Double(numberOfRooms) else {
        return selectedRooms.placeholder = "type it,dude"
    }
    
    self.x = Int(ceil(sqrt(rooms)))
    self.y = x //grab some values from user input
    
    guard let x = self.x,let y = self.y else {
        return
    }
    
    maze = MazeGenerator(x,y)
    hp = 2 * (x * y)
    
    //for rest of the code I need to know the declaration of currentX,currentY,maze variables
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...