2017-04-17 31 views
1

當前我使用枚舉來定義API。我的一個API是張貼一張紙條,是否有圖像。在枚舉中自動解包可選屬性

enum StoreAPI { 
    ... 
    case newNote(String, Data?) /* note_description, note_image */ 
} 

據我所知來處理這種情況,有兩種方式:

// Option 1 
switch api { 
... 
case let newNote(description, imageData): 
    if let imageData = imageData { 
     // Post with image 
    } 
    else { 
     // Post without image 
    } 
... 
} 

// Option 2 
switch api { 
    ... 
    case let newNote(description, nil): 
     // Post without image 
    case let newNote(description, imageData): 
     let imageData = imageData! 
    ... 
} 

我不知道是否有任何其他的方式來自動解開可選值,或者更好地處理它,或更多清晰。

+3

比較[Swift模式匹配與枚舉和可選元組關聯值](http://stackoverflow.com/q/32859646/2976878) - 您可以使用可選模式。 – Hamish

+0

哦,我在Swift 3.1中找不到關於.Some(foo)的任何信息。這是一個新的自定義枚舉?這可能是更好的方法來自動打開可選值 – nahung89

+1

'.some(Wrapped)'(以前'.Some(Wrapped)')是['Optional']的一種情況(https://developer.apple.com/reference/swift/optional) - 它是一個'enum'本身:)但正如Martin在他的回答中所表明的那樣,它有一個語法糖形式,只需在綁定值標識符的末尾添加一個'?' case,'let let .newNote(description,imageData?):'。 – Hamish

回答

1

雨燕3.1

感謝@Hamish的意見。我想在這裏向其他可能有此問題的人發佈答案。

switch api { 
... 
case let .newNote(description, .none): 
    // image data is nil, post without it. 
case let .newNote(description, .some(imageData)): 
    // imageData is available and unwrapped automatically to use. 
... 
} 
+0

的想法嗯,不知道爲什麼我有投票。這段代碼經過測試,效果很好 – nahung89

4

使用可選的枚舉的.some結合:

enum StoreAPI { 
    case newNote(String, Data?) 
} 

// sample data 
let api = StoreAPI.newNote("title", "data".data(using: .utf8)) 

switch api { 

case let .newNote(title, .some(data)): 
    print("title: \(title), data: \(data)") 

default: 
    break 

} 
+0

當然,謝謝!我只是從@Hamish – nahung89

1

在迅速的慣用方法是使用可選的?運營商,而不是Optional.some其中其他建議。 (然而,這僅僅是語法糖 - 它們是同一個東西)的例子可以看到下面:

switch api { 

case let .newNote(title, data?): 
    break // Do stuff with title & data 

default: 
    break 

} 
+0

是啊!當我在這裏檢查時,它可能是另一個選項來自動解開可選項。 'case let .newNote(title,nil):/ *做只有標題的東西*/break;例如let .newNote(title,data?):/ *做標題和數據的東西*/...' – nahung89

+0

@ nahung89:+1:是的你說得對,'nil'只是'Optional.none的語法糖' –

0

如果你想要的代碼對你的意圖很明確,你可以使用where子句:

switch api 
{ 
    case let .newNote(description, imageData) where imageData == nil: 

     // Post without image 

    case let .newNote(description, imageData?): 

     // Post with image 
    default : break 
} 
+0

這與我在上面發佈的選項2相同。從我的角度來說,我們必須打開'imageData'我們自己,它可以用'.some(foo)'或'.none'處理得更好(你可以在下面看到我的答案):) – nahung89

+1

對不起,我以爲你只是試圖找到一個更明確的方式來表達它,(並且我忘記了第二個案例,我的錯誤)。 –