Swift 为什么Xcode告诉我添加.map{$0.rawValue}而我只能这样做?.rawValue?

Swift 为什么Xcode告诉我添加.map{$0.rawValue}而我只能这样做?.rawValue?,swift,xcode,enums,optional,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}: 这很奇怪,因为很明显,Xcode知道访问rawValue会将Enum变成字符串。但为什么建议使用map?为什么不直接访问它呢

我有以下代码:

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
变成
字符串。但为什么建议使用
map
?为什么不直接访问它呢

我以为Xcode会这样想:

let s: String? = Enum(rawValue: "A")?.rawValue
左边有一个字符串常量和一个枚举,它的原始值是字符串。这些类型不兼容,但我知道
rawValue
可以将枚举转换为字符串。我建议用户添加
?。rawValue

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


另外,我的目的是检查
“A”
是否是枚举的有效原始值。如果是,则将其分配给
s
,否则分配
nil
。我知道这不太实际,但我只关心Xcode的行为。

它不是针对
Enum
的。事实上,所有
可选
实例都实现了以下功能:

我不知道为什么Xcode建议不只是
.rawValue
,但我可以想到一些可能的原因:

  • 按字母顺序排列
  • 您可能需要对展开的值执行一些操作
  • 也许
    foo?.bar
    只是
    foo.map{$0.bar}

  • 若昂·马塞洛·苏扎的第三个答案完全正确<代码> .map 是可选的安全展开方法。code>Enum(rawValue:“A”).map{$0.rawValue}
    is
    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
    

    刚在操场上试过,你的初始修复在那里有效。奇怪的是XCode是如何“思考”使用
    map
    来解决问题的。真的,我只是惊讶于XCode足够聪明,甚至可以在一开始就提供一个解决方案。请不要用那些你——开发人员——在编译时应该知道的适得其反的东西来打扰XCode。枚举案例无法在运行时更改,因此潜在的崩溃清楚地揭示了开发人员的错误。您能解释一下字母顺序是什么意思吗?字母顺序:(m)ap在(r)awValue之前。但这太天真了。3是我最好的选择。我想指出,“map”是可选的一部分,而Enum init返回可选的。rawValue是枚举(RawRepresentable)的一部分,与可选值无关。映射与枚举无关。