如何在Swift 2中避免使用多个if if语句

时间:2015-10-10 13:15:49

标签: swift optional

我开始时很快就试图保持我的代码简洁。

我有自定义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
   }
   ...
}

...

有没有更简洁的方法解开所有这些条件?

3 个答案:

答案 0 :(得分:3)

有几种解决方案:

  • guard
  • 同一let
  • 内的多个var / if
  • 具有默认值的参数
  • 三元条件运算符
  • Nil Coalescing Operator
  • 不接受init中的可选参数(由 nhgrif 建议)

看看你的例子,似乎

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

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

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

答案 1 :(得分:1)

这与你的逻辑略有不同。如果您希望在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
    }
}

答案 2 :(得分:0)

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

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

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