我有执行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
子句)中看起来很荒谬,数组仍然是可选的。
答案 0 :(得分:7)
您必须将try?
来电括在括号内:
if let expenses = (try? App.mainQueueContext.fetch(request)) as? [Expense]
这是因为as?
的优先级高于try?
(可能因为try?
可以应用于整个表达式)。
答案 1 :(得分:5)
@ Fantattitude的答案给出了你想要的东西。但是我需要一段时间才能查看为什么。要想成为评论,所以这里是参考:
根据Swift编程语言(Swift 3)Expressions章
当二元运算符左侧的表达式标记为try,try?或try!时,该运算符应用于整个二进制表达式。
首先,我认为as
可能不是二元运算符,但在Swift Standard Library Operators
as
,as?
和as!
是中缀运营商运营商
中缀运算符是一个二元运算符,它在两个操作数之间写入,例如表达式1 + 2中熟悉的加法运算符(+)。