我有这段代码:
enum Enum: String {
case A = "A"
}
let s: String? = Enum(rawValue: "A")
当然,它不会编译。通常,我这样解决:
let s: String? = Enum(rawValue: "A")?.rawValue
但是,Xcode说我应该添加.map { $0.rawValue }
:
这很奇怪,因为很明显,Xcode知道访问rawValue
可以将Enum
变成String
。但为什么建议使用map
来做呢?为什么不直接访问它?
我认为Xcode会这么想:
我左边有一个字符串常量和一个原始值为字符串的枚举。类型不兼容,但我知道
rawValue
可以将枚举转换为字符串。我建议用户添加?.rawValue
!
Xcode的“思考过程”背后是什么?
P.S。我的目的是检查"A"
是否是枚举的有效原始值。如果是,请将其分配给s
,否则分配nil
。我知道这不太实用,但我只关心Xcode的行为。
答案 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
,但我可以想到几个可能的原因:
foo?.bar
只是foo.map { $0.bar }