为什么Xcode告诉我在我可以做的时候添加.map {$ 0.rawValue}?.rawValue?

时间:2017-03-06 17:03:46

标签: swift xcode enums optional

我有这段代码:

enum Enum: String {
    case A = "A"
}

let s: String? = Enum(rawValue: "A")

当然,它不会编译。通常,我这样解决:

let s: String? = Enum(rawValue: "A")?.rawValue

但是,Xcode说我应该添加.map { $0.rawValue }

enter image description here

这很奇怪,因为很明显,Xcode知道访问rawValue可以将Enum变成String。但为什么建议使用map来做呢?为什么不直接访问它?

我认为Xcode会这么想:

  

我左边有一个字符串常量和一个原始值为字符串的枚举。类型不兼容,但我知道rawValue可以将枚举转换为字符串。我建议用户添加?.rawValue

Xcode的“思考过程”背后是什么?

P.S。我的目的是检查"A"是否是枚举的有效原始值。如果是,请将其分配给s,否则分配nil。我知道这不太实用,但我只关心Xcode的行为。

2 个答案:

答案 0 :(得分:8)

JoãoMarceloSouza的第三个答案是完全正确的。 .map是可选的安全解包方法卓越Enum(rawValue: "A").map{$0.rawValue} Enum(rawValue: "A")?.rawValue

问题仅在于我们都习惯使用第二个(语法糖),我们忘记了第一个是Swift编译器实际上是如何思考的。

示例:

var i : [Int]? = [7]
i.map {$0.count} // 1
i?.count // 1

i = nil
i.map {$0.count} // nil
i?.count // nil

答案 1 :(得分:7)

它不是Enum特有的。实际上,所有Optional个实例都实现了map function

let possibleNumber: Int? = Int("4")
let possibleSquare = possibleNumber.map { $0 * $0 }
print(possibleSquare) // Prints "Optional(16)"

我不确定为什么Xcode建议而不只是.rawValue,但我可以想到几个可能的原因:

  1. 按字母顺序排列。
  2. 您可能希望对展开的值执行某些操作。
  3. 也许foo?.bar只是foo.map { $0.bar }
  4. 的语法糖