假设我们有一个带有相关值类型的枚举.在下面的示例中,两个值类型是包含图像的简单对象和要共享的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 ..我想要一个简单的地图.但快速的语法并没有帮助我.
有任何想法吗?
解决方法
你可以返回case.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数组,因为您可以直接在媒体数组上应用上述内容:
/* 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 {…}).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。