我有执行NSFetchRequest和将其结果转换为自定义数据模型类型数组的代码。抓取可能会抛出,但是我不想关心该错误,因此我使用try?,并且也在as?铸造中使用。在Swift 2中,这过去还不错,但是Swift 3产生了一个double可选:
NSFetchRequest
try?
as?
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子句)中,数组仍然是可选的,这看起来很荒谬。
if let
[Expense]
where
您必须try?像这样将呼叫包装在括号内:
if let expenses = (try? App.mainQueueContext.fetch(request)) as? [Expense]
那是因为as?它的优先级高于try?(可能是因为try?可以应用于整个表达式)。