【问题标题】:Conditionally binding to an existing property有条件地绑定到现有属性
【发布时间】:2017-01-03 02:50:16
【问题描述】:

我正在寻找改进这种代码模式的方法:

struct Struct {
    let i: Int

    init?(i: Int?) {
        guard let unwrappedI = i else { return nil }
        self.i = unwrappedI
    }
}

最好删除unwrappedI 临时变量。有什么建议吗?

【问题讨论】:

    标签: swift swift3 guard-statement conditional-binding


    【解决方案1】:

    我会说:

    struct Struct {
        let i: Int
    
        init?(i: Int?) {
            if i == nil {return nil}
            self.i = i!
        }
    }
    

    我认为这抓住了您最初希望提前退出的愿望,并避免了您试图避免的if/else,没有中间变量。要打开 i,只需打开它!不需要if letguard let 或任何花哨的东西。

    (另一方面,我不得不问:如果将nil 传递给初始化程序被认为是失败的,那么为什么首先要接受 Optional 呢?)

    【讨论】:

    • 现实世界的应用程序比这更复杂,它实际上是一个可选的本地变量,最终需要解包,以便可选性仅与初始化程序隔离
    • 我认为可能是这样。 :)
    • 其实,我在这里的时候,不妨检查一下,确保我的设计不完全是垃圾。我正在尝试从 [RIFF 文件](johnloomis.org/cpe102/asgn/asgn1/riff.html) (wavani 等其他格式使用的容器格式)中解析一组“块”数据。一个有效的文件需要存在一组特定的块,但它们可以以任何顺序出现。因此,这些变量在制作过程中是可选的,但最终应该被检查,并分配给新初始化的结构的非可选属性
    • 我能做的最好的是将 ivars 复制为本地变量(作为可选),在解析循环后解包,然后分配给 ivars(否则返回 nil)。这听起来合理吗?你会怎么做?
    • 是的,我想我明白了。因此,最后您只需遍历所有这些,如果其中任何一个为零,则失败。将其减少为通过列表循环会很好,但我想不出该怎么做。让我们不要让对优雅的渴望妨碍工作!
    【解决方案2】:

    嗯,我肯定想多了……我需要睡觉。

    struct Struct {
        let i: Int
    
        init?(i: Int?) {
            if let i = i { self.i = i }
            else { return nil }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2013-04-13
      • 1970-01-01
      • 2019-10-28
      相关资源
      最近更新 更多