我开始时很快就试图保持我的代码简洁。
我有自定义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
}
...
}
...
有没有更简洁的方法解开所有这些条件?
答案 0 :(得分:3)
有几种解决方案:
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
...
}
答案 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)
您可以使用逗号分隔的if
或guard
编写单个语句。但在这种情况下,title
和mainText
应该是非零的。 这是不同的逻辑,但这是在单行中定义多个条件的一种方法。如果你想要其他明智的话,请参考@vacawama回答
var title: String? = "title"
var mainText: String? = "maintest"
if let title = title, mainText = mainText {
self.initMainText = title
self.initBtnTitle = mainText
}