如何使用警卫同时解开 Swift 可选和强制类型转换?

Posted

技术标签:

【中文标题】如何使用警卫同时解开 Swift 可选和强制类型转换?【英文标题】:How to unwrap Swift optional and cast type at the same time using guard? 【发布时间】:2016-01-04 01:26:49 【问题描述】:

我有以下代码。 response.result.value 的类型是 Optional(AnyObject),我想检查一下

    它的类型是[[String: AnyObject]]

    解开可选的

    检查数组的计数

    比起 if...return... 语句,我更喜欢一个 line 守卫

    Alamofire.request(.GET, API.listArticle).responseJSON  response in
        print(response.result.value)
    
        guard let articles = response.result.value as? [[String: AnyObject]] where articles.count > 0 else 
            return
        
    
        for article in articles 
            let entity = NSEntityDescription.insertNewObjectForEntityForName("Article", inManagedObjectContext: DBHelper.context()) as! Article
            entity.title = article["title"]
            entity.content = article["content"]
    
        
    
    

错误是article["content"] 行:

不能用 String 类型的索引为 Dictionary 类型的值下标

我还需要检查title 是否存在于article 中吗?它会崩溃还是什么都不做?

【问题讨论】:

尝试使用 enumerate() 遍历它 文章[jndex]["content"] 为什么for in 循环不起作用 【参考方案1】:

问题是您正在使用字典,其中value 的类型为AnyObject 来填充titlecontent 可能是String 的属性(对吗?)

您不能将(在编译时)声明为 AnyObject 的内容放入 String 属性中。

替换这个

entity.title = article["title"]
entity.content = article["content"]

有了这个

entity.title = article["title"] as? String
entity.content = article["content"] as? String

更新

此更新将丢弃 titlecontent 值不是正确字符串的文章。

for article in articles 

     if let
         title = article["title"] as? String,
         content = article["content"] as? String 

         let entity = NSEntityDescription.insertNewObjectForEntityForName("Article", inManagedObjectContext: DBHelper.context()) as! Article

         entity.title = title
         entity.content = content
     

【讨论】:

content 属性必须是可选字符串 添加 ?? "" 使其非可选 如果article["title"] 不是字符串,或者title 不存在怎么办?它会做些什么吗? 零合并运算符 @LeoDabus:你说得对,我更新了我的答案来管理那个场景。

以上是关于如何使用警卫同时解开 Swift 可选和强制类型转换?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 的绑定中解开可选值?

Swift 3 更好的方式来解开一个可选的

Swift之深入解析如何避免单元测试中的强制解析

为啥我不能强制解开我的 $string 以用作 TextField 值?

为啥你可以在 Swift 中为可选类型分配非可选值?

Swift中的Optional类型 (可选类型)与强制解包 ? !