我有一些字符串代码,但是当我的字符串值为null时,我的应用程序会出现致命错误,我的代码在这里需要做哪些更改?
let pCodeTextFieldStr:NSString = pCodeTextField.text!
let pNameTextFieldStr:NSString = pNameTextField!.text!
let pQuantityTextFieldStr:NSString = pQuantityTextField.text!
let commingReadyIDs:NSString = prefs.valueForKey("addClientID") as! String!
let commingCurrs:NSString = prefs.valueForKey("addClientCurrency") as! String!
let commingtype:NSString = prefs.valueForKey("addProductType") as! String!
let productnameclean:NSString = prefs.valueForKey("addProductName") as! String!
答案 0 :(得分:3)
感叹号!
告诉编译器“如果此项目为nil则请崩溃”。所以第一步就是不要这样做。第二步是找出你想要做的事情,如果事情是零。您通常使用if let ...
或使用nil-coalescing运算符??
处理此问题。
答案 1 :(得分:2)
他们不是"意见"他们是怎么回事。
let commingCurrs:NSString
声明commingCurrs
不能为零。
同样,片段prefs.valueForKey("addClientID") as! String!
表明prefs.valueForKey("addClientID")
不能返回nil。
由于您的数据显然可以为零,因此您必须解决差异。
您已获得3个选项,唯一可能的其他选项是将变量声明为可选而非所需:
let commingReadyIDs:String? = prefs.valueForKey("addClientID") as? String
但那只是在踢路的时候。迟早你将不得不处理这些价值在某些时候都没有的事实。
请注意,任何时候你都可以选择将!
置于一个快速的程序中,你需要长时间仔细思考,这是否真的是正确的做法?这真的永远不会是零吗? !
是快速语言中最邪恶,最阴险的角色。
答案 2 :(得分:1)
由于这些字符串值可能不存在,因此您不应强行打开它们。可选表示可能具有值的变量,或者可能具有nil的变量。 Swift鼓励您作为开发人员承认这一点并解开值可能返回零的情况。通过使用!,你告诉编译器,我知道这里有一个值,在你的情况下,没有,并且抛出了异常。
在下面的示例中,如果键存在一个字符串,它将进入块的范围,您可以使用常量变量commingReadyIDs访问该字符串。如果不是,则不会输入该块,也不会发生异常。
我建议您阅读更多关于Swift文档中的选项,因为您经常会遇到它们,并且它们鼓励开发人员避免这些空指针异常。
if let commingReadyIDs = prefs.valueForKey("addClientID") as? String{
//do whatever
}
答案 3 :(得分:1)
如果您不知道变量的值何时存在,或者何时不知道,那么您应该使用Optional Chaining,您可以尝试下面的代码
// all defined variables (like pCodeTextField) can have value or can be nil so don't use forcefully unwrapped optional value without cheking nil
let pCodeTextFieldStr:NSString? = pCodeTextField?.text
let pNameTextFieldStr:NSString? = pNameTextField?.text
let pQuantityTextFieldStr:NSString? = pQuantityTextField?.text
let commingReadyIDs : NSString? = prefs?.valueForKey("addClientID") as? String
let commingCurrs : NSString? = prefs?.valueForKey("addClientCurrency") as? String
let commingtype : NSString? = prefs?.valueForKey("addProductType") as? String
let productnameclean : NSString? = prefs?.valueForKey("addProductName") as? String