You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将switch与contains结合?Swift文件类型判断优化方案问询

把if判断转换为Switch语句的优雅方案

嘿,这个需求太合理了!用switch处理枚举相关逻辑不仅可读性更强,还能借助Swift的编译检查帮我们避免遗漏分支的问题。我给你几个实用的方案:

方案1:Switch + Where子句直接适配现有集合

我们可以直接用switch匹配传入的file字符串,结合where子句来判断是否属于对应集合,完美复用你现有的三个集合:

func getType(of file: String) -> FileType {
    switch file {
    case _ where photos.contains(file):
        return .photo
    case _ where videos.contains(file):
        return .video
    case _ where audios.contains(file):
        return .audio
    default:
        return .unknown
    }
}

这个方案的逻辑和你原来的if判断完全一致,但换成switch后结构更规整,也贴合你想用switch的初衷。

方案2:用字典关联枚举与扩展名集合(更易维护)

如果后续需要新增文件类型或修改扩展名列表,这个方案会更灵活。我们先创建一个FileType到对应扩展名集合的映射字典,再通过查找字典返回结果:

// 把映射关系抽出来,放在函数外或作为类/结构体静态属性都可以
private let fileTypeMap: [FileType: Set<String>] = [
    .photo: ["jpg", "png", "tiff"],
    .video: ["mp4", "mov", "mkv"],
    .audio: ["mp3", "wav", "wma"]
]

func getType(of file: String) -> FileType {
    for (type, extensions) in fileTypeMap {
        if extensions.contains(file) {
            return type
        }
    }
    return .unknown
}

这个方案把数据和逻辑分离,后续维护只需要修改字典即可,不需要改动判断逻辑,扩展性拉满。

方案3:给枚举扩展静态方法(封装性更好)

我们可以把判断逻辑直接封装到FileType枚举内部,让代码更内聚,外部调用也更直观:

enum FileType {
    case photo, video, audio, unknown
    
    // 把扩展名集合作为枚举的私有静态属性
    private static let photos: Set<String> = ["jpg", "png", "tiff"]
    private static let videos: Set<String> = ["mp4", "mov", "mkv"]
    private static let audios: Set<String> = ["mp3", "wav", "wma"]
    
    // 静态方法直接返回对应类型
    static func forFileExtension(_ ext: String) -> FileType {
        switch ext {
        case _ where photos.contains(ext):
            return .photo
        case _ where videos.contains(ext):
            return .video
        case _ where audios.contains(ext):
            return .audio
        default:
            return .unknown
        }
    }
}

// 调用方式更简洁直观
let type = FileType.forFileExtension("jpg")

这种方式把所有相关逻辑都收拢在枚举内部,符合面向对象的封装思想,代码结构更干净。

内容的提问来源于stack exchange,提问作者Ahmad F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:04:18