如何避免 Swift 中的多个 if let 语句 2

How to avoid multiple if let statements in Swift 2

我从 swift 开始,我试图让我的代码简洁。

我有一个自定义的init方法

var title, initMainText, initBtnTitle: String?

...

init(title: String?, mainText: String?, buttonTitle: String?) {
   if let t = title {
      self.title = t
   }
   if let t = mainText {
      self.initMainText = t
   }
   if let t = buttonTitle {
      self.initBtnTitle = t
   }
   ...
}

...

是否有更简洁的方法来展开所有这些条件?

有几种解决方法:

  • guard
  • 多个let/var在同一个if
  • 具有默认值的参数
  • 三元条件运算符
  • 无合并运算符
  • 不接受 init 中的可选参数(如 nhgrif 所建议)

看你的例子似乎

  • self.title
  • self.initMainText
  • self.initBtnTitle

是可选的,所以你可以简单地写:

init(title: String?, mainText: String?, buttonTitle: String?) {
   self.title = title
   self.initMainText = mainText
   self.initBtnTitle = buttonTitle
   ...
}

您可以写在单个语句中,用逗号分隔 ifguard。但在这种情况下,如果 titlemainText 应该是非零。 这是不同的逻辑,但这是在单行中定义多个条件的一种方法。如果你想要其他方式,你应该参考@vacawama answer

var title: String? = "title"
var mainText: String? = "maintest"

if let title = title, mainText = mainText {
    self.initMainText = title
    self.initBtnTitle = mainText
}

这与您的逻辑略有不同。如果您想在将 nil 发送到初始化程序时为属性分配默认值,那么这将是 nil 合并运算符 的好地方:

init(title: String?, mainText: String?, buttonTitle: String?) {
   self.title = title ?? ""
   self.initMainText = mainText ?? ""
   self.initBtnTitle = buttonTitle ?? ""
   ...
}

现在很明显您的属性是可选的,下面的逻辑与您的相同:如果新值不是 nil,它将更改 属性 的值:

class Foo {
    var title: String? = "possible default value"
    var initMainText: String? = "possible default value"
    var initBtnTitle: String? = "possible default value"

    init(title: String?, mainText: String?, buttonTitle: String?) {
        self.title = title ?? self.title
        self.initMainText = mainText ?? self.initMainText
        self.initBtnTitle = buttonTitle ?? self.initBtnTitle
    }
}