2017-04-17 84 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

对不起,我以为你只是试图找到一个更明确的方式来表达它,(并且我忘记了第二个案例,我的错误)。 –