当前位置: 首页 > 面试题库 >

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

谢弘阔
2023-03-14
问题内容

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


问题答案:

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

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

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



 类似资料:
  • 问题内容: 最初使我不愿在代码中加入太多可选绑定的一件事是添加了更多的变量名。例如,我通常会写: 因为替代方案似乎有些混乱: 那是很多香蕉。我见过人们使用诸如新变量名之类的东西(在较大的代码块中可能很难看懂),但是我想知道是否存在一种普遍认可的变量名样式标准可以与可选绑定?谢谢阅读。 问题答案: 只需使用相同的名称: 不要使用匈牙利符号-如果您使用的是未包装的可选内容,则编译器会抱怨。

  • 问题内容: 快速使用以下语法进行流控制 在这种情况下 ,真值上下文的语义是什么 ? 是否允许 表达式链接 (如下所示)? 如果是这样,布尔表达式是否会短路? 问题答案: 首先检查它是否为零或是否有数据。如果为零,则不会执行if语句。如果有数据,则将数据解包并分配给if语句的范围。然后执行括号内的代码。 无法在一个if语句中链接此功能。不直接评估为布尔值。最好将“ if let”视为一个特殊关键字。

  • 这是我的可选装订 所以现在当我尝试调用这个构造函数时: 我得到了这个错误: 绑定

  • 如何拥有绑定类型的可选参数

  • 我想在一个方法上使用注释创建一个CDI工厂,以便在外部服务中查找一个命名的东西,并返回(生成)一个外部服务中这个东西的代理,以便注入到其他bean中。从用例的角度来看,通常需要所有这些依赖关系;然而,有时请求的内容在远程服务中不存在,应用程序可以对这一事实做出反应。 基本上结构是这样的: 这适用于需要使用Something的一侧的注入的情况:成功的查找注入已查找的实例,而不成功的查找破坏bean引

  • 问题内容: 最近,我与队友讨论了 在方法中使用可选参数的问题。 假设方法是 接受一个和 可选参数 ,它返回该目录中列出的书籍,如果还传递了类别,则仅返回该类别中的书籍。 冲突点是,验证是否为空检查。我认为不应对此进行空检查,因为它是可选参数。函数的调用者可以通过或,并且函数应在实现中处理两种情况。 我的意见是,对于可选参数,只会使方法的约定更加明确。只需查看方法签名即可知道此参数是可选的,不需要读