2017-03-06 52 views
6

我有這樣的代碼:

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的行爲。

+1

剛在遊樂場,你最初的固定在那裏工作。好奇XCode是如何使用map來「思考」的,可以解決這個問題。 – antonio081014

+4

真的,我很驚訝Xcode足夠聰明,甚至可以提供一個修補程序 - 它首先。 – Hamish

+1

請不要打擾Xcode與那些適得其反的東西,你 - 開發人員 - 應該在編譯時知道。枚舉案例不能在運行時更改,因此潛在的崩潰清楚地顯示了開發人員錯誤。 – vadian

回答

4

若昂·馬塞洛·索薩的第三個答案語法糖是完全正確的。 .map擇安全-展開法出類拔萃Enum(rawValue: "A").map{$0.rawValue}Enum(rawValue: "A")?.rawValue

的問題僅僅是,我們都習慣了使用我們忘記,第一個是斯威夫特編譯器實際上是怎麼想的,在引擎蓋下的第二個(語法糖)。

例子:

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

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

這不是具體到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 }
+0

3完全正確。 – matt

+0

你能解釋一下按字母順序是什麼意思嗎? – Sweeper

+0

按字母順序排列:(m)ap在(r)awValue之前。但那太天真了。 3是我最好的選擇。 –

相關問題