能否将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
相关产品推荐
相关产品推荐

