如果我有这个密码:

let a : Int? = 10;
let b : String? = "Apples";
let result = "We have \(a) of \(b)";
// result will be "We have Optional(10) of Optional(Apples)"

我可以通过添加默认值删除选项:
let result = "We have \(a ?? 0) of \(b ?? "")";
// result will be "We have 10 of Apples"

但是如果我想要,如果字符串中的任何选项都是nil,那么字符串的结果是nil呢?
let a : Int? = nil;
let b : String? = "Apples";
let result = "We have \(a) of \(b)";
// result will be nil

所以我可以这样写:
let a : Int? = nil;
let b : String? = "Apples";
if let result = "We have \(a) of \(b)" { self.process(result); }

编辑:
我真正想要达到的是:
func process (_ s: String?) {
    guard let s = s else { return; }
    print (s);
}

let a : Int? = nil;
let b : String? = "Apples";
let result = "We have \(a) of \(b)";
self.process (result);

谢谢。

最佳答案

您可以使用map/flatMap方法:

let a : Int? = nil
let b : String? = "Apples"

let result = a.flatMap { a in b.map { b in
    "We have \(a) of \(b)"
} }

结果是(常数)Optional。如果String?nil中的任何一个是a,则为b,否则为具有未包装值的字符串。

10-07 19:17
查看更多