Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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
Swift中的链接选项_Swift_Optional - Fatal编程技术网

Swift中的链接选项

Swift中的链接选项,swift,optional,Swift,Optional,到目前为止,我一直在Swift 2.1中展开Optionals,如下所示: @IBOutlet var commentTextView: UITextView! if let comment = user["comment"] as? String { commentTextView.text = comment } 我从来没有真正考虑过,但我认为我这样做的原因是因为我担心如果user[“comment”]返回的不是字符串的内容,该语句会引发错误: commentTextView.t

到目前为止,我一直在Swift 2.1中展开Optionals,如下所示:

@IBOutlet var commentTextView: UITextView!

if let comment = user["comment"] as? String {
    commentTextView.text = comment
}
我从来没有真正考虑过,但我认为我这样做的原因是因为我担心如果
user[“comment”]
返回的不是
字符串的内容,该语句会引发错误:

commentTextView.text = user["comment"] as? String

如果
user[“comment”]
不是
字符串
,赋值运算符左侧的变量是否会被赋值并抛出错误,或者赋值是否会被跳过?

nil
将被赋值给变量

如果变量的类型是非可选的,则会出现运行时错误


但是,如果
user[“comment”]
字符串,您将得到一个关于缺少
的编译器错误

首先,我们需要知道字典“user”是什么类型的

我假设它是一种未知类型,比如[String:AnyObject],否则为什么要尝试将其作为字符串展开呢。让我们编写一个简短的测试,看看会发生什么:

let dict: [String: AnyObject] = ["SomeKey" : 1]
if let y = dict["SomeKey"] as? String {
    print(y)
}
您可以清楚地看到“SomeKey”的值是一个整数。尝试将其作为字符串展开不会触发错误,只是跳过“if”语句。如果一个赋值真的发生了很难证明(可能是通过查看汇编代码),因为变量“y”在If语句之后根本不存在。我认为它根本不会被创建

如果字典的类型为[String:String],则可以省略该选项,并尝试将其作为字符串展开,因为该类型始终是String

let dict2: [String: String] = ["SomeKey" : "SomeValue"]
if let y = dict2["WrongKey"] {
    // In this case print(y) will not be called because the subscript operator of the dictionary returns nil
    print(y)
}

// In this case print(y) will be called because the key is correct
if let y = dict2["SomeKey"] {
    print(y)
}

我猜
user
实际上是一本字典
[String:Any]
,如果让comment=user[“comment”]作为,你真正要做什么?字符串{…}
不仅仅是展开可选的,而是(然后展开可选的结果):

如果不确定向下转换是否成功,请使用类型转换运算符(
as?
)的条件形式。这种形式的运算符将始终返回一个可选值,如果无法向下转换,则该值将为
nil
。这使您能够检查是否成功向下广播

现在,为了回答您的问题,如果
user[“comment”]
不是
String
,那么结果将是
commentTextView.text
将被分配
nil
值,这是错误的,因为它的类型是
String(),我们承诺它永远不会是零。因此,是的,会有一个错误,实际上是一个异常,但不是在您希望的位置,但此时您的应用程序将尝试访问它的值,假设它不会是
nil

你真正应该做什么取决于具体情况

例如,如果你能把
user
变成像
[String:String]
那样的字典,那么你就能够真正开始解包选项,并使用类似于
的东西,如果让comment=user[“comment”]{…}
。或者,如果您完全确定
“comment”
键的值始终存在,那么您可以执行
让comment=user[“comment”]


但如果这不可能,那么你必须坚持向下转换,你唯一能做的就是使用强制形式,即
commentTextView.text=user[“comment”]as!字符串
。如果
“comment”
处的值恰好不是
字符串,而是其他的值,那么这个值至少会立即产生一个异常。

否,在
中,如果let
,则从未将nil赋值给变量。问题是关于可选链接,这是第二个代码段,赋值表达式No,您不会得到运行时错误,只是尝试一下。这就是为什么?接线员大约是?意思是“可以”!表示“应该”,如果不是,则触发运行时错误。啊,我明白了!有道理。OP询问的是可选链接而不是可选绑定。标题错误。这是可选的链接: