在枚举中自动解包可选属性

时间:2017-04-17 08:45:14

标签: swift enums

目前我使用enum来定义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!
    ...
}

我想知道是否有其他方法可以自动解包可选值,或者更好地处理它,或者更清楚地处理它。

4 个答案:

答案 0 :(得分:5)

使用可选的枚举.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

}

答案 1 :(得分:1)

Swift 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.
...
}

答案 2 :(得分:1)

swift中的惯用方法是使用可选的?运算符,而不是其他人建议的Optional.some运算符。 (但是,这只是语法糖 - 它们是相同的东西)一个例子可以在下面看到:

switch api {

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

default:
    break

}

答案 3 :(得分: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
}