目前我使用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!
...
}
我想知道是否有其他方法可以自动解包可选值,或者更好地处理它,或者更清楚地处理它。
答案 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)
感谢@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
}