一尘不染

可选绑定尝试?并作为?仍然产生可选类型

swift

我有执行NSFetchRequest和将其结果转换为自定义数据模型类型数组的代码。抓取可能会抛出,但是我不想关心该错误,因此我使用try?,并且也在as?铸造中使用。在Swift
2中,这过去还不错,但是Swift 3产生了一个double可选:

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


阅读 192

收藏
2020-07-07

共1个答案

一尘不染

您必须try?像这样将呼叫包装在括号内:

if let expenses = (try? App.mainQueueContext.fetch(request)) as? [Expense]

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

2020-07-07