arrays - 使用关联值映射 swift 枚举

标签 arrays swift enums

假设我们有一个具有关联值类型的枚举。在下面的示例中,两个值类型是简单的对象,其中包含要共享的图像和 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/

相关文章:

c++ - 如何在函数中使用带有字符串的 Enum?

Java 枚举处理

c - 用 C 读取 .dat 文件并保存到矩阵

java - java中如何读取整数并将其存储在数组中

javascript - 获取嵌套数组项以附加到 HTML 表中的新列

c++ - 为什么 std::array 的推导指南不允许不同的类型?

ios - didUpdateLocations 未被调用

ios - 如何查询我的数据并将它们按类别存储在数组中,以便按类别在 TableView 中显示它们?

ios - 无法在 UI 表格 View 自定义单元格中插入分隔符

c++ - 在Visual Studio中使用枚举的编译错误