Swift 有条件地绑定到现有属性

Swift 有条件地绑定到现有属性,swift,swift3,guard-statement,conditional-binding,Swift,Swift3,Guard Statement,Conditional Binding,我正在寻找一种改进这种代码模式的方法: struct Struct { let i: Int init?(i: Int?) { guard let unwrappedI = i else { return nil } self.i = unwrappedI } } 最好删除unwrappedI临时变量。有什么建议吗?我肯定想得太多了。。。我需要睡觉 struct Struct { let i: Int init?(i:

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

struct Struct {
    let i: Int

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

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

我肯定想得太多了。。。我需要睡觉

struct Struct {
    let i: Int

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

我肯定是想得太多了。。。我需要睡觉

struct Struct {
    let i: Int

    init?(i: Int?) {
        if let i = i { self.i = i }
        else { return nil }
    }
}
我会说:

struct Struct {
    let i: Int

    init?(i: Int?) {
        if i == nil {return nil}
        self.i = i!
    }
}
我认为这抓住了您提前退出的最初愿望,避免了您试图避免的
if/else
,没有中间变量。要打开
i
,只需打开它!不需要
如果let
保护let
或任何花哨的东西

(另一方面,我必须问:如果将
nil
传递给初始值设定人被认为是失败的,那么为什么首先提出接受可选值?

我会说:

struct Struct {
    let i: Int

    init?(i: Int?) {
        if i == nil {return nil}
        self.i = i!
    }
}
我认为这抓住了您提前退出的最初愿望,避免了您试图避免的
if/else
,没有中间变量。要打开
i
,只需打开它!不需要
如果let
保护let
或任何花哨的东西


(另一方面,我不得不问:如果将
nil
传递给初始值设定项被认为是失败的,那么为什么首先要接受可选值?

现实世界的应用程序比这更复杂,实际上,这是一个可选的局部var,最终需要展开,以便将可选性单独隔离到初始值设定项。我认为可能是这样的。:)事实上,当我在这里的时候,我不妨检查一下,以确保我的设计不是完全垃圾。我正试图解析[RIFF文件]()(其他格式如
wav
ani
使用的容器格式)中的一组“块”数据。一个有效的文件需要存在一组特定的块,但它们可以以任何顺序出现。因此,这些变量在生成过程中是可选的,但最终应该进行检查,并分配给新初始化结构的非可选属性。我所能做的最好的方法是将IVAR复制为局部变量(作为可选变量),在解析循环后将其展开,然后分配给IVAR(否则返回nil)。这听起来合理吗?你会怎么做?是的,我想我明白了。因此,在最后,您只需运行所有这些,如果其中任何一个为零,则会失败。这将是很好的减少,以循环通过一个列表,但我不知道如何做到这一点。不要让对优雅的渴望妨碍我们的工作!现实世界的应用程序比这更复杂,它实际上是一个可选的局部var,最终需要展开,以便仅将可选性与初始值设定项隔离。我认为可能是这样的。:)事实上,当我在这里的时候,我不妨检查一下,以确保我的设计不是完全垃圾。我正试图解析[RIFF文件]()(其他格式如
wav
ani
使用的容器格式)中的一组“块”数据。一个有效的文件需要存在一组特定的块,但它们可以以任何顺序出现。因此,这些变量在生成过程中是可选的,但最终应该进行检查,并分配给新初始化结构的非可选属性。我所能做的最好的方法是将IVAR复制为局部变量(作为可选变量),在解析循环后将其展开,然后分配给IVAR(否则返回nil)。这听起来合理吗?你会怎么做?是的,我想我明白了。因此,在最后,您只需运行所有这些,如果其中任何一个为零,则会失败。这将是很好的减少,以循环通过一个列表,但我不知道如何做到这一点。不要让对优雅的渴望妨碍我们的工作!