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}
isEnum(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)的一部分,与可选值无关。映射与枚举无关。