假设我们有一个具有关联值类型的枚举。在下面的示例中,两个值类型是简单的对象,其中包含要共享的图像和 url。
enum Content {
case Image(ShareableImage)
case Video(ShareableVideo)
}
现在让我们有一系列的视频和图像案例。
let media: [Content] = [*a lot of enum cases inside here*]
到目前为止,上面的所有代码都不能在代码库中以任何方式更改,我需要使用它。
我的问题从这里开始:
让我们用媒体过滤数组以仅显示图像案例
let imageOnlyCases: [Content] = media.filter { item -> Bool in
switch item {
case .Image: return true
default: return false
}
}
下一步,我想从枚举数组到它们的关联值数组
[Content] -> [ShareableImage] by using map.
所以我这样做
let shareablemages = imageOnlyCases.map { imageCase -> ShareableImage in
switch imageCase {
case .Image(let image): return image
default: return WHAT TO DO HERE?
}
}
你看,我的返回类型有问题。我知道枚举案例都是 .Image 。我想要一个简单的 map 。但是 swift 语法对我没有帮助。
有什么想法吗?
最佳答案
对于 .Image
的情况,您可以返回 image
,否则在 .flatMap
操作中返回 nil
( “过滤”出 nil
条目):
/* Example */
enum Foo {
case Bar(Int)
case Baz(Int)
}
let foo: [Foo] = [.Bar(1), .Bar(9),. Baz(3), .Bar(39), .Baz(5)]
/* 1. using 'switch' */
let barOnlyValues: [Int] = foo.flatMap {
switch $0 {
case .Bar(let val): return val
case _: return nil
}}
/* 2. alternatively, as pointed out in MartinR:s answer;
as you're only looking for a single case, the alternative
'if case let' clause could be preferred over 'switch': */
let barOnlyValuesAlt: [Int] = foo.flatMap {
if case let .Bar(val) = $0 { return val }
else { return nil }}
print(barOnlyValues) // [1, 9, 39]
应用于您的用例:请注意,您不需要执行过滤来创建 imageOnlyCases
数组,因为您可以直接在 media
数组上应用上述内容:
/* 1. using switch */
let shareableImages : [ShareableImage] = media.flatMap {
switch $0 {
case .Image(let image): return image
case _: return nil
}}
/* 2. 'if case let' alternative, as per MartinR:s suggestion */
let shareableImagesAlt : [ShareableImage] = media.flatMap {
if case let .Image(image) = $0 { return image }
else { return nil }}
免责声明:我无法在实践中验证您的具体用例,因为我无权访问 ShareableImage
类/结构。
(感谢@MartinR 的建议,.map{ ... }.flatMap{ ... }
可以简化为 .flatMap{ ... }
).
关于arrays - 使用关联值映射 swift 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35651038/