如何使用警卫同时解开 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
来填充title
和content
可能是String
的属性(对吗?)
您不能将(在编译时)声明为 AnyObject
的内容放入 String
属性中。
替换这个
entity.title = article["title"]
entity.content = article["content"]
有了这个
entity.title = article["title"] as? String
entity.content = article["content"] as? String
更新
此更新将丢弃 title
和 content
值不是正确字符串的文章。
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 可选和强制类型转换?的主要内容,如果未能解决你的问题,请参考以下文章