与 try 的可选绑定?并作为?仍然产生一个可选类型
Posted
技术标签:
【中文标题】与 try 的可选绑定?并作为?仍然产生一个可选类型【英文标题】:Optional binding with try? and as? still produces an optional type 【发布时间】:2016-10-05 10:18:55 【问题描述】:我有代码用于执行NSFetchRequest
并将其结果转换为我的自定义数据模型类型的数组。获取可能会抛出,但我不想关心错误,所以我使用try?
,并且我也在铸造中使用as?
。在 Swift 2 中,这曾经很好,但 Swift 3 产生了一个双可选:
var expenses: [Expense]?
let request = NSFetchRequest<NSFetchRequestResult>(entityName: Expense.entityName)
request.predicate = NSPredicate(format: "dateSpent >= %@ AND dateSpent <= %@", [self.startDate, self.endDate])
// Returns [Expense]? because right side is [Expense]??
if let expenses = try? App.mainQueueContext.fetch(request) as? [Expense],
expenses?.isEmpty == false
return expenses
return nil
如何在if let
中重新表述我的可选绑定的右侧,使其类型只是一个数组[Expense]
?我认为在以下布尔条件(以前是where
子句)中,数组仍然是可选的,这看起来很荒谬。
【问题讨论】:
【参考方案1】:您必须将您的 try?
调用用括号括起来,如下所示:
if let expenses = (try? App.mainQueueContext.fetch(request)) as? [Expense]
这是因为as?
的优先级高于try?
(可能是因为try?
可以应用于整个表达式)。
【讨论】:
确认这有效。多么乏味的语法。【参考方案2】:@Fantattitude 的回答给出了你想要的。但是我花了一些时间来阅读文档以找出为什么。很想发表评论,所以这里是参考:
根据 Swift 编程语言(Swift 3)Expressions 章节
当 二元运算符 左侧的表达式标有 try、try? 或 try! 时,该运算符适用于 整个 二元表达式。
首先,我认为as
可能不是是二元运算符,而是Swift Standard Library Operators
as
、as?
和as!
是中缀运算符运算符
在Operator Declaration章节中
中缀运算符是写在其两个操作数之间的二元运算符,例如表达式 1 + 2 中熟悉的加法运算符 (+)。 p>
【讨论】:
伟大的调查! 嗯。我对此的技术细节仍然有些困惑。如果它在尝试评估/应用尝试之前执行 App.mainQueueContext.fetch() 的代码并将结果转换为 [Expense]? -- 这不应该抛出一个关于运行没有任何错误处理的代码的错误吗? 没有时间浏览文档,但我猜as
有错误/抛出传播。以上是关于与 try 的可选绑定?并作为?仍然产生一个可选类型的主要内容,如果未能解决你的问题,请参考以下文章