可选绑定试试?并作为?仍然生成一个可选类型

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子句)中看起来很荒谬,数组仍然是可选的.

Fan*_*ude 7

你必须try?在括号内包裹你的电话,如下所示:

if let expenses = (try? App.mainQueueContext.fetch(request)) as? [Expense]
Run Code Online (Sandbox Code Playgroud)

那是因为as?有一个更高的优先级try?(可能因为try?可以应用于整个表达式).


zcu*_*i93 5

@ Fantattitude的答案给出了你想要的东西.但是我需要一段时间才能查看原因以找出原因.要想成为一个评论,所以这里是参考:


根据Swift编程语言(Swift 3)表达式章节

二元运算符左侧的表达式用try,try?或try!标记时,该运算符应用于整个二进制表达式.

首先,我认为as可能不是二元运算符,而是Swift标准库运算符

as,, as?as!是Infix运营商

操作员声明章节中

缀运算符是在其两个操作数之间写入的二元运算符,例如表达式1 + 2中熟悉的加法运算符(+).