字符串为空时的Swift会导致致命错误

时间:2016-03-18 15:52:23

标签: string swift

我有一些字符串代码,但是当我的字符串值为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!

4 个答案:

答案 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