这会导致崩溃..?或者我们也可以在 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 时才会执行wherebooking.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 会导致应用程序崩溃

使用大型UIImage数组时的内存问题导致崩溃(swift)

swift 3 DispatchGroup leave 在帮助类函数中调用时导致崩溃