我想解开这6个可选变量,如果它们为null,我想给它们一个空白的String值。这样我就可以将这些变量打包到一个发送到API的参数数组中。
我仍然是Swift的初学者,这是我理解如何实现这一点的唯一最简单的方法,但我内心的编码器说这看起来多余而且糟糕,因为****。
有人可以帮我压缩这个或使其更简单吗?
if let fbEmail = self.fbEmail {
}else{
self.fbEmail = ""
}
if let fbDob = self.fbDob {
}else{
self.fbDob = ""
}
if let fbGender = self.fbGender {
}else{
self.fbGender = ""
}
if let fbUserIp = self.fbUserIp {
}else{
self.fbUserIp = ""
}
if let fbFacebookId = self.fbFacebookId {
}else{
self.fbFacebookId = ""
}
if let fbFacebookAccessToken = self.fbFacebookAccessToken {
}else{
self.fbFacebookAccessToken = ""
}
答案 0 :(得分:8)
你可以用6行代码完成:
self.fbEmail = self.fbEmail ?? ""
self.fbDob = self.fbDob ?? ""
self.fbGender = self.fbGender ?? ""
self.fbUserIp = self.fbUserIp ?? ""
self.fbFacebookId = self.fbFacebookId ?? ""
self.fbFacebookAccessToken = self.fbFacebookAccessToken ?? ""
编辑:使用??
语法提供的内容:它是一个快捷方式"如果nil分配另一个值":
let c = a ?? b
如果c = a
,将分配a != nil
,否则c = b
。
答案 1 :(得分:4)
您可以一次打开多个包装。但是,如果你这样做,你将无法知道哪一个是零。你只会知道有些是零或没有。
除此之外,它们都需要是可选的吗?你不能用你给他们的默认值初始化它们吗?
<强>片断:强>
完全避免这个问题。
// just init with a default value without them being an optional
var fbEmail : String = ""
var fbDob : String = ""
将nil
替换为.isEmpty
var string : String = ""
string.isEmpty // returns true
string = "SomeString"
string.isEmpty // returns false
具有起始值的选项。
// init wit default values while still optional
var fbEmail : String? = ""
var fbDob : String? = ""
一次打开多个。
if let unwrfbEmail = fbEmail, let unwrfbDob = fbDob {
// stuff available here
} else {
// handle the error
}
guard let unwrfbEmail = fbEmail, let unwrfbDob = fbDob else {
// put return/break here and handle the error
}
// stuff available here
所有值的容器。它们是可选项,但当设置为nil时,它们将重置为默认值。您也可以将它们声明为强制解包的选项!
。或者使用上面找到的方法一次解开它们。
显然,复制粘贴并将didSet
更改为所有变量。
// container stuct that uses didSet to avoid nil and reset to default values
struct container {
var fbEmail : String? = "" {
didSet {
if fbEmail == nil {
fbEmail = ""
}
}
}
var fbDob : String? = ""
var fbGender : String? = ""
var fbUserIp : String? = ""
var fbFacebookId : String? = ""
var fbFacebookAccessToken : String? = ""
}