这会导致崩溃..?或者我们也可以在 Swift 中向 nil 发送消息..?
Posted
技术标签:
【中文标题】这会导致崩溃..?或者我们也可以在 Swift 中向 nil 发送消息..?【英文标题】:Will this result in a crash.. ? or can we send a message to nil in Swift as well..? 【发布时间】:2016-01-25 07:10:04 【问题描述】:我想了解一下 Swift 并有一个疑问。
if let cn = respObj["cabNumber"].string where !cn.isEmpty
booking.cabNumber = cn
我知道这会检查字符串是否为零但是 如果响应对象中没有 cabNumber 键和对象对,在这种情况下会发生什么。我们正在使用 SwiftyJSON。
【问题讨论】:
您有条件地解开可选的if let...
,因此如果该键不存在,则 if 语句中的子句将不会执行。
注意 where 部分只有 let 部分成功才会执行。因此,在您的情况下,代码不会崩溃,如果 cn 不存在,它首先不会评估 where 部分。
【参考方案1】:
一定是:
if let cn = respObj["cabNumber"] as? String where !cn.isEmpty
booking.cabNumber = cn
在那里,表达式let cn = respObj["cabNumber"] as? String
将检查键cabNumber
是否存在于字典中。第二个表达式where ! cn.isEmpty
检查值是否为空字符串。
请注意,如果 cabNumber
键存在但具有 JSON 空值,它将返回 NSNull
的实例而不是 nil。
【讨论】:
SwiftyJSON 中没有这样的NSNull
。
.string
是有效的,它是 SwiftyJSON 的“可选 getter”之一。【参考方案2】:
它不会崩溃。您的代码是正确的。
事实上你是有条件地解开键内的值
respObj["cabNumber"].string
仅当respObj["cabNumber"].string
是有效的String
时才会执行where
。
booking.cabNumber = cn
仅在 respObj["cabNumber"].string
是有效的非空 String
时执行
更具体地说:
if let cn = respObj["cabNumber"].string
where !cn.isEmpty // executed only if cn is a a valid String
booking.cabNumber = cn // executed only if cn is a valid non empty String
【讨论】:
以上是关于这会导致崩溃..?或者我们也可以在 Swift 中向 nil 发送消息..?的主要内容,如果未能解决你的问题,请参考以下文章
Swift-由于statusBarWindows而导致应用程序崩溃
将 FBO 保存到相机胶卷后清理后崩溃错误? Swift 2.0 选择器语法
嵌套的 JSON 数据将导致使用 NS 字典(在 Swift 中)崩溃
在 Swift 中打开一个关闭的 NSWindow 会导致应用程序崩溃