话不多说,直接上代码
方式1:
var optional1: String?
var optianal2: String?
if let optional1 = optional1, optianal2 = optianal2 {
}
看起来很美~问题来了:如果我希望处理optional1有值,optional2没值的情况怎么办?聪明的你立马想到了:
if let optional1 = optional1 {
guard let _ = optianal2 else{
print(optional1)
return
}
}
那optional1无值,optional2有值的情况,optional1与optional2都没值的情况呐...别打我:)
可见,方法一在遇到需要对多个可选值分开判断有无值的时候,似乎变得十分无力。可见的一个实际应用场景是登录界面:假设我们有loginNameTextField
与passwordTextField
两个输入框,当用户点击登录按钮时,我们需要对两个输入框进行是否有值的判断,进而给用户抛出对应的错误。
那有没有其他的方式来解包多个可选值?我们来看看第二种方式看是否可以优雅地解决这个问题。
方式2:
//Swift2
var username: String?
var password: String?
switch (username, password) {
case let (username?, password?):
print("Success!")
case let (username?, nil):
print("Password is needed!")
case let (nil, password?):
print("Username is needed!")
case (nil, nil):
print("Password and username are needed!")
}
看起来好多了~等等,case let (username?, nil):
中的?
是什么鬼,无需惊恐,这里的?
跟可选值的?
没有一点关系。username?
表示的是username
有值, nil
即表示无值。事实上,这个?
是Swift2新增的语法,我们来看看Swift2以前是怎样的:
//Before Swift2
var username: String?
var password: String?
switch (username, password) {
case let (.Some(username), .Some(password)):
print("Success!")
case let (.Some(username), .None):
print("Password is needed!")
case let (.None, .Some(password)):
print("Username is needed!")
case (.None, .None):
print("Password and username are needed!")
}
相比较而言,新的语法看起来精简了许多。