Swift中的链接选项
到目前为止,我一直在Swift 2.1中展开Optionals,如下所示: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
@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询问的是可选链接而不是可选绑定。标题错误。这是可选的链接: