我不明白 Swift 中的 nil
I do not understand nil in Swift
我之前尝试阅读了很多帖子,但我似乎仍然无法理解"nil"。
let mass = Double(density! * volume!)
在这部分代码中它告诉我:
"Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value"
当我 运行 我的应用程序 运行 如果我在所有文本字段都为空时不按下按钮,它会很顺利,但是当我按下按钮时它崩溃了,调试器工具告诉我这里有错误,但我不确定为什么它不起作用。
我真的不明白 Stack Overflow 上的其他 nil 解释论坛,Swift 对我来说非常混乱。
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var massInput: UITextField!
@IBOutlet weak var volumeInput: UITextField!
@IBOutlet weak var densityInput: UITextField!
@IBOutlet weak var answerOutput: UITextField!
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func calculateButton(_ sender: UIButton) {
clearAnswer()
mvdCalc()
clearBoxes()
}//end of btn
//------------------------FUNCTIONS-----------------------------------
func mvdCalc(){
if massInput.text!.isEmpty {massFormula()}
if volumeInput.text!.isEmpty {volumeFormula()}
if densityInput.text!.isEmpty {densityFormula()}
}//end of mvdCalc
func clearBoxes(){
massInput.text = ""
volumeInput.text = ""
densityInput.text = ""
}//end of clear boxes
func massFormula(){
let density = Double(densityInput.text!)
let volume = Double(volumeInput.text!)
let mass = Double(density! * volume!)
answerOutput.text = "\(mass)"
}//end of mass
func volumeFormula(){
let density = Double(densityInput.text!)
let mass = Double(massInput.text!)
let volume = Double(mass! / density!)
answerOutput.text = "\(volume)"
}//end of volume
func densityFormula(){
let volume = Double(volumeInput.text!)
let mass = Double(massInput.text!)
let density = Double(mass! / volume!)
answerOutput.text = "\(density )"
}//end of density
func clearAnswer() {
if massInput.text == "" && volumeInput.text == "" && densityInput.text == "" {
answerOutput.text = ""
}
}//end of clearAnswer
}//end of class
应用程序崩溃,因为 density
和 volume
都是 nil
。如果您强制解包 nil
(通过使用 !
),您的应用程序会崩溃。
为什么 density
和 volume
为零?
因为这里的 Double
初始化器返回 nil
:
let density = Double(densityInput.text!)
let volume = Double(volumeInput.text!)
这是由于您传递给它的字符串格式错误造成的。 densityInput.text
和 volumeInput.text
不是有效的双字符串。为什么它们无效?好吧,正如您所说,文本字段是空的。空字符串 (""
) 无法转换为双精度数。
要解决此问题,您可以选择在任一文本字段无效时不进行计算:
if let density = Double(densityInput.text!), let volume = Double(volumeInput.text!) {
let mass = density * volume
answerOutput.text = "\(mass)"
}
如果其中一个是 nil
,则 if 不会 运行。
对所有其他计算也执行此操作!
是的,应用程序会因您的问题本身的当然答案而崩溃
您将其称为按钮操作
@IBAction func calculateButton(_ sender: UIButton) {
clearAnswer()
mvdCalc()
clearBoxes()
}
第 1 步 clearAnswer()
的执行很顺利因为你只是清除了文本字段
步骤2当涉及到mvdCalc()
执行
let mass = Double(density! * volume!)
应用程序在此处崩溃 - 请查看以下屏幕截图
如果您看到密度值打印到控制台,则 densityStr 不是“”
和
由于 massStr 为“”
,因此打印 mass 时出错
因此,为了解决您需要在调用函数计算值之前进行检查
为
if mass != nil {
print("call function")
let massValue = Double(density! * volume!)
answerOutput.text = "\(massValue)"
}
else{
print("Value is empty no calculation to be performed")
}
注意:在您没有执行计算之前不要清除您的 TF 值
其次,在该块所需的 TF 为空之前不要调用 mvdCalc()
在按钮按下时显示警报 "Value for this TF is required " 如果满足条件则执行 mvdCalc()
我之前尝试阅读了很多帖子,但我似乎仍然无法理解"nil"。
let mass = Double(density! * volume!)
在这部分代码中它告诉我:
"Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value"
当我 运行 我的应用程序 运行 如果我在所有文本字段都为空时不按下按钮,它会很顺利,但是当我按下按钮时它崩溃了,调试器工具告诉我这里有错误,但我不确定为什么它不起作用。
我真的不明白 Stack Overflow 上的其他 nil 解释论坛,Swift 对我来说非常混乱。
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var massInput: UITextField!
@IBOutlet weak var volumeInput: UITextField!
@IBOutlet weak var densityInput: UITextField!
@IBOutlet weak var answerOutput: UITextField!
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func calculateButton(_ sender: UIButton) {
clearAnswer()
mvdCalc()
clearBoxes()
}//end of btn
//------------------------FUNCTIONS-----------------------------------
func mvdCalc(){
if massInput.text!.isEmpty {massFormula()}
if volumeInput.text!.isEmpty {volumeFormula()}
if densityInput.text!.isEmpty {densityFormula()}
}//end of mvdCalc
func clearBoxes(){
massInput.text = ""
volumeInput.text = ""
densityInput.text = ""
}//end of clear boxes
func massFormula(){
let density = Double(densityInput.text!)
let volume = Double(volumeInput.text!)
let mass = Double(density! * volume!)
answerOutput.text = "\(mass)"
}//end of mass
func volumeFormula(){
let density = Double(densityInput.text!)
let mass = Double(massInput.text!)
let volume = Double(mass! / density!)
answerOutput.text = "\(volume)"
}//end of volume
func densityFormula(){
let volume = Double(volumeInput.text!)
let mass = Double(massInput.text!)
let density = Double(mass! / volume!)
answerOutput.text = "\(density )"
}//end of density
func clearAnswer() {
if massInput.text == "" && volumeInput.text == "" && densityInput.text == "" {
answerOutput.text = ""
}
}//end of clearAnswer
}//end of class
应用程序崩溃,因为 density
和 volume
都是 nil
。如果您强制解包 nil
(通过使用 !
),您的应用程序会崩溃。
为什么 density
和 volume
为零?
因为这里的 Double
初始化器返回 nil
:
let density = Double(densityInput.text!)
let volume = Double(volumeInput.text!)
这是由于您传递给它的字符串格式错误造成的。 densityInput.text
和 volumeInput.text
不是有效的双字符串。为什么它们无效?好吧,正如您所说,文本字段是空的。空字符串 (""
) 无法转换为双精度数。
要解决此问题,您可以选择在任一文本字段无效时不进行计算:
if let density = Double(densityInput.text!), let volume = Double(volumeInput.text!) {
let mass = density * volume
answerOutput.text = "\(mass)"
}
如果其中一个是 nil
,则 if 不会 运行。
对所有其他计算也执行此操作!
是的,应用程序会因您的问题本身的当然答案而崩溃
您将其称为按钮操作
@IBAction func calculateButton(_ sender: UIButton) {
clearAnswer()
mvdCalc()
clearBoxes()
}
第 1 步 clearAnswer()
的执行很顺利因为你只是清除了文本字段
步骤2当涉及到mvdCalc()
执行
let mass = Double(density! * volume!)
应用程序在此处崩溃 - 请查看以下屏幕截图
如果您看到密度值打印到控制台,则 densityStr 不是“”
和
由于 massStr 为“”
,因此打印 mass 时出错因此,为了解决您需要在调用函数计算值之前进行检查
为
if mass != nil {
print("call function")
let massValue = Double(density! * volume!)
answerOutput.text = "\(massValue)"
}
else{
print("Value is empty no calculation to be performed")
}
注意:在您没有执行计算之前不要清除您的 TF 值
其次,在该块所需的 TF 为空之前不要调用 mvdCalc()
在按钮按下时显示警报 "Value for this TF is required " 如果满足条件则执行 mvdCalc()