如何在Swift中压缩解包多个选项?

时间:2015-10-02 01:20:52

标签: swift if-statement

我想解开这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 = ""
    }

2 个答案:

答案 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? = ""

}