Mat*_*ros 5 core-data ios swift swift3
我有代码执行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
}
Run Code Online (Sandbox Code Playgroud)
如何重新定义可选绑定的右侧if let,使其类型只是一个数组[Expense]?我认为在下面的布尔条件(曾经是一个where子句)中看起来很荒谬,数组仍然是可选的.
你必须try?在括号内包裹你的电话,如下所示:
if let expenses = (try? App.mainQueueContext.fetch(request)) as? [Expense]
Run Code Online (Sandbox Code Playgroud)
那是因为as?有一个更高的优先级try?(可能因为try?可以应用于整个表达式).
@ Fantattitude的答案给出了你想要的东西.但是我需要一段时间才能查看原因以找出原因.要想成为一个评论,所以这里是参考:
根据Swift编程语言(Swift 3)表达式章节
当二元运算符左侧的表达式用try,try?或try!标记时,该运算符应用于整个二进制表达式.
首先,我认为as可能不是二元运算符,而是Swift标准库运算符
as,,as?和as!是Infix运营商
在操作员声明章节中
中缀运算符是在其两个操作数之间写入的二元运算符,例如表达式1 + 2中熟悉的加法运算符(+).