【问题标题】:throwable anonymous closure in swift快速抛出匿名闭包
【发布时间】:2017-07-13 11:06:40
【问题描述】:

我有这段代码,但我想稍微改进一下,让它更“实用”

var person = Person.getOne(on: db, with: ["name": name])
if person == nil {
    let personId = try Person.insert(on: db, with: ["name": name])
    person = Person.getOne(on: db, withIdentifier: personId)
}

所以我做到了:

let harbor = Harbor.getOne(on: db, with: ["name": formattedName]) ?? {
    let harborId = try Harbor.insert(on: db, with: ["name": formattedName])
    return Harbor.getOne(on: db, withIdentifier: harborId)
}()

如果没有 trying 插入,它将完美地工作。所以我必须将我的匿名关闭标记为throwstry 才能执行它。

是否可以快速实现这一目标?

【问题讨论】:

  • 只有函数、方法或初始化器可以throw
  • 你可以说let harbor = try Harbor.getOne...
  • 哦@hamish,看来你是对的!我尝试将try 放在?? 之后,但它不起作用。将它放在getOne(不抛出)之前可以解决问题。
  • try! 代替try 怎么样,但如果值以某种方式导致nil 确实不推荐,这可能会导致崩溃
  • try! 是一个糟糕的选择,因为 1/ 它强制展开,2/ 它阻止处理错误

标签: swift throw throwable


【解决方案1】:

感谢@hamish,解决方案是在整个表达式之前添加try

let harbor = try Harbor.getOne(on: db, with: ["name": formattedName]) ?? {
    let harborId = try Harbor.insert(on: db, with: ["name": formattedName])
    return Harbor.getOne(on: db, withIdentifier: harborId)
}()

这似乎很奇怪,因为第一个getOne 没有throws 任何错误。

【讨论】:

    猜你喜欢
    • 2015-10-14
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2018-01-02
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多