与 try 的可选绑定?并作为?仍然产生一个可选类型

Posted

技术标签:

【中文标题】与 try 的可选绑定?并作为?仍然产生一个可选类型【英文标题】:Optional binding with try? and as? still produces an optional type 【发布时间】:2016-10-05 10:18:55 【问题描述】:

我有代码用于执行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 子句)中,数组仍然是可选的,这看起来很荒谬。

【问题讨论】:

【参考方案1】:

您必须将您的 try? 调用用括号括起来,如下所示:

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

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

【讨论】:

确认这有效。多么乏味的语法。【参考方案2】:

@Fantattitude 的回答给出了你想要的。但是我花了一些时间来阅读文档以找出为什么。很想发表评论,所以这里是参考:


根据 Swift 编程语言(Swift 3)Expressions 章节

二元运算符 左侧的表达式标有 try、try? 或 try! 时,该运算符适用于 整个 二元表达式。

首先,我认为as可能不是是二元运算符,而是Swift Standard Library Operators

asas?as! 是中缀运算符运算符

在Operator Declaration章节中

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

【讨论】:

伟大的调查! 嗯。我对此的技术细节仍然有些困惑。如果它在尝试评估/应用尝试之前执行 App.mainQueueContext.fetch() 的代码并将结果转换为 [Expense]? -- 这不应该抛出一个关于运行没有任何错误处理的代码的错误吗? 没有时间浏览文档,但我猜as 有错误/抛出传播。

以上是关于与 try 的可选绑定?并作为?仍然产生一个可选类型的主要内容,如果未能解决你的问题,请参考以下文章

实例化的可选变量在 Xcode 调试器中显示为 nil

classmethod一个用处是创建可选类构造器

SwiftUI 中的可选绑定

可选字符串数组作为绑定参数 SwiftUI [重复]

如何处理失败的可选绑定

SwiftUI - 我们如何重新绑定绑定的可选参数?