问题描述
有人告诉我我的代码包含许多强制展开的功能。我认为如果可以确定操作的值不会为零,则可以这样做:
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
}