【问题标题】:Swift 2 optional guard on stringSwift 2 可选的字符串防护
【发布时间】:2016-06-02 19:26:25
【问题描述】:

我正在处理 swift 2.0 中的一个问题

我从 API 获得了一个 json 文件,我正在尝试从中解开一些字符串。

有时这个 json 会给我一个带有场地街道名称的字符串,但有时不会。 所以当我尝试这个时

var street = arrRes[indexPath.row]["venueLocation"]!["street"] as! String 

它总是让我的应用程序崩溃,说它是 nil。当我评论它时,我的应用程序运行完美,但它没有显示街道。 知道如何解开字符串而不会对nil 产生任何问题吗??

如果尝试过这段代码

var street = arrRes[indexPath.row]["venueLocation"]!["street"] as! String 

if street == "" {
   street = "n/a"
}

但它也失败了。

【问题讨论】:

    标签: swift2 guard-statement


    【解决方案1】:

    任何时候你用! 强制解包,你都会冒着在值为 nil 的地方崩溃的风险。相反,您可以尝试像这样展开:

    guard let venueDictionary = arrRes[indexPath.row]["venueLocation"] as? [String:AnyObject], let street = venueDictionary["street"] as? String else {
       //You don't have a street string, fail gracefully 
    }
    print(street)//Now you can use street safely as a string here
    

    【讨论】:

    • 我必须在else 内写return ??
    • @KwnstantinosNatsios 是的,或者fatalError()break 或者退出范围的东西,这就是guard 语句的作用。如果不想提前退出或者使用guard,那么可以改成:if let venueDictionary = arrRes[indexPath.row]["venueLocation"] as? [String:AnyObject], let street = venueDictionary["street"] as? String { print(street) //Now you can use street safely as a string here }
    • 我正在尝试将这个变量发送到另一个视图控制器。但是在具有nil 街道的某个单元格中,它不允许我进入下一个视图控制器...但是对于其他具有正常街道的单元格,我没有任何问题。
    • @KwnstantinosNatsios 这样的事情怎么样:if let venueDictionary = arrRes[indexPath.row]["venueLocation"] as? [String:AnyObject], let street = venueDictionary["street"] as? String { otherViewController.streetText = street } else { otherViewController.streetText = ""}
    • @KwnstantinosNatsios 太棒了! :)
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多