- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
到目前为止,我一直在 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"]
不是 String
,赋值运算符左边的变量会被赋值并抛出错误还是赋值被跳过?
最佳答案
我想 user
实际上是一个字典 [String: Any]
和你真正用做的事 if let comment =用户[“评论”]作为? String { ... }
不只是展开可选的,而是一个 conditional type casting (然后展开它的可选结果):
Use the conditional form of the type cast operator (
as?
) when you are not sure if the downcast will succeed. This form of the operator will always return an optional value, and the value will benil
if the downcast was not possible. This enables you to check for a successful downcast.
现在,回答你的问题,如果 user["comment"]
不是 String
那么结果将是 commentTextView.text
将被分配 nil
值,这很糟糕,因为它的类型是 String!
( implicitly unwrapped optional ) 我们 promise 它永远不会 为 nil
。所以,是的,会有一个错误,实际上是一个异常,但不是在你想要的地方,但此刻你的应用程序将尝试访问它的值,假设它不会是 nil
.
您真正应该做什么取决于具体情况。
例如如果你可以让 user
成为像 [String: String]
这样的字典,那么你就可以真正地解开可选值并使用类似 if 的东西让 comment = user["comment"] { ... }
。或者,如果您完全确定 "comment"
键的值将始终存在,那么您可以只做 let comment = user["comment"]!
.
但如果这不可能,那么您必须坚持使用向下转换,唯一可以做的就是使用它的强制形式,即 commentTextView.text = user["comment"] as!字符串
。如果 "comment"
的值恰好不是 String
而是其他东西,这至少会在现场产生异常。
关于swift - 在 Swift 中链接可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33744942/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!