Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 字符串为空时,Swift将给出致命错误_String_Swift - Fatal编程技术网

String 字符串为空时,Swift将给出致命错误

String 字符串为空时,Swift将给出致命错误,string,swift,String,Swift,我有一些字符串代码,但当我的字符串值为null时,我的应用程序出现致命错误,我的代码在这里,我需要做哪些更改 let pCodeTextFieldStr:NSString = pCodeTextField.text! let pNameTextFieldStr:NSString = pNameTextField!.text! let pQuantityTextFieldStr:NSString = pQuantityTextField.text! let commingReadyIDs:NSS

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

感叹号
告诉编译器“如果此项为零,请崩溃”。因此,第一步是不要这样做。第二步是弄清楚如果某个值为零,你想做什么。通常使用
if let…
或使用nil合并运算符

来处理此问题,因为这些字符串值可能不存在,所以不应强制展开它们。可选变量表示一个变量,该变量可能有值,也可能有nil。Swift鼓励作为开发人员的您承认这一点,并在值可能返回零的情况下展开。使用!,你告诉编译器,我知道这里有一个值,在你的例子中,没有,并且抛出了一个异常

在下面的示例中,如果键存在字符串,它将进入块的范围,您可以使用常量变量commingReadyIDs访问该字符串。否则,将不会输入该块,也不会发生异常

我鼓励您在Swift文档中阅读更多关于选项的内容,因为您经常会遇到它们,它们鼓励开发人员避免这些空指针异常

if let commingReadyIDs = prefs.valueForKey("addClientID") as? String{
    //do whatever
}
他们不是“意见”,而是事实

让commingCurrs:NSString
说明
commingCurrs
永远不能为零

同样地,片段
prefs.valueForKey(“addClientID”)为!绳子
声明
prefs.valueForKey(“addClientID”)
永远不能返回nil

由于您的数据显然可能为零,因此您必须解决差异

您已获得3个选项,唯一可能的其他选项是将变量声明为可选变量而不是必需变量:

let commingReadyIDs:String?  = prefs.valueForKey("addClientID") as? String
但那只是在路上踢易拉罐而已。迟早你会不得不面对这样一个事实:这些值在某个时刻将为零


只要一个提示,任何时候你都可以选择放置
在swift程序中,您需要仔细思考,这真的是正确的做法吗?这真的永远不会是零吗<代码>
是swift语言中最邪恶、最阴险的字符。

如果您不知道变量的值何时存在或何时不存在,那么您应该使用下面的代码

// 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

是的,很好的意见,但我还有5个字符串,我需要全部使用,如果是的话,对于您的用例,看起来您需要展开其中的每一个,因为变量彼此独立,但是如果值为零,则可能取决于您要执行的操作。是的,好的意见,但我还有5个字符串,我需要使用所有字符串,如果?@SwiftDeveloper您必须回答的问题是,当特定键的值为
nil
或无法解释为字符串时,您希望执行什么操作。你必须定义(或要求产品负责人)来定义这种情况下的预期行为。多谢老兄,我认为解决方案永远不会是零