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

时间:2016-10-05 10:18:55

标签: ios swift core-data 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
}

如何在if let中重新定义可选绑定的右侧,以便其类型只是一个数组[Expense]?我认为在下面的布尔条件(曾经是where子句)中看起来很荒谬,数组仍然是可选的。

2 个答案:

答案 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

  

asas?as!是中缀运营商运营商

Operator Declaration

  

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