Is there a way to combine switch and contains?

  • A+

Let's assume that I have three sets containing extensions:

let photos: Set = ["jpg", "png", "tiff"] let videos: Set = ["mp4", "mov", "mkv"] let audios: Set = ["mp3", "wav", "wma"] 

and a simple enum as:

enum FileType {     case photo, video, audio, unknown } 

Now what I want to do is to implement a function that returns FileType option based on what is the passed string to it and which set contains it:

func getType(of file: String) -> FileType {     if photos.contains(file) { return .photo }     if videos.contains(file) { return .video }     if audios.contains(file) { return .audio }      return .unknown } 

It should work as expected, but I wonder if there is an approach to transform the if statement to one switch case (even if it would change to logic a bit), especially when working with enums the switch statement(s) are better choice to avoid errors.

If it is unachievable by using switch statement, I would also appreciate any elegant alternative(s).

I think your whole problem is the fact that you are trying to maintain 3 independent sets for every type instead of connecting them directly to a given file type:

enum FileType: String {     case photo, video, audio, unknown }  let extensions: [FileType: Set<String>] = [     .photo: ["jpg", "png", "tiff"],     .video: ["mp4", "mov", "mkv"],     .audio: ["mp3", "wav", "wma"] ]  func getType(of file: String) -> FileType {     return extensions.first { $0.value.contains(file) }?.key ?? .unknown } 


:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: