Ear*_*rey 7 arrays enums swift
假设我们有一个带有相关值类型的枚举.在下面的示例中,两个值类型是包含图像的简单对象和要共享的URL.
enum Content {
case Image(ShareableImage)
case Video(ShareableVideo)
}
Run Code Online (Sandbox Code Playgroud)
现在让我们来看一系列视频和图像案例.
let media: [Content] = [*a lot of enum cases inside here*]
Run Code Online (Sandbox Code Playgroud)
到目前为止,上面的所有代码都无法在代码库中以任何方式进行更改,我需要使用它.
这开始我的问题:
让我们用媒体过滤数组,只对图像情况进行过滤
let imageOnlyCases: [Content] = media.filter { item -> Bool in
switch item {
case .Image: return true
default: return false
}
}
Run Code Online (Sandbox Code Playgroud)
下一步,我想从枚举数组获取其关联值的数组
[Content] -> [ShareableImage] by using map.
Run Code Online (Sandbox Code Playgroud)
所以我这样做
let shareablemages = imageOnlyCases.map { imageCase -> ShareableImage in
switch imageCase {
case .Image(let image): return image
default: return WHAT TO DO HERE?
}
}
Run Code Online (Sandbox Code Playgroud)
你看,我有一个返回类型的问题..我知道枚举案例都是.Image ..我想要一个简单的地图.但快速的语法并没有帮助我.
有任何想法吗?
dfr*_*fri 12
您可以返回image案例.Image,nil否则,在一个.flatMap操作中("过滤" 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]
Run Code Online (Sandbox Code Playgroud)
应用于您的用例:请注意,您无需执行过滤来创建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 }}
Run Code Online (Sandbox Code Playgroud)
免责声明:我无法在实践中验证您的具体用例,因为我无法访问ShareableImage类/结构.
(感谢@MartinR提供的建议.map{ ... }.flatMap{ ... }可以简化为.flatMap{ ... }).