有没有办法结合开关和包含?
Is there a way to combine switch and contains?
假设我有三组包含扩展:
let photos: Set = ["jpg", "png", "tiff"]
let videos: Set = ["mp4", "mov", "mkv"]
let audios: Set = ["mp3", "wav", "wma"]
和一个简单的枚举:
enum FileType {
case photo, video, audio, unknown
}
现在我想做的是实现一个函数,returns FileType
选项基于传递给它的字符串是什么以及包含它的集合:
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
}
它应该按预期工作,但我想知道是否有一种方法可以将 if
语句转换为一个 switch
情况(即使它会稍微改变逻辑),尤其是当使用枚举 switch
语句是避免错误的更好选择。
如果使用 switch
语句无法实现,我也会感谢任何优雅的替代方法。
这适合你的情况
let photos: Set = ["jpg", "png", "tiff"]
let videos: Set = ["mp4", "mov", "mkv"]
let audios: Set = ["mp3", "wav", "wma"]
enum FileType {
case photo, video, audio, unknown
}
func getType(of file: String) -> FileType {
switch true {
case photos.contains(file):
return .photo
case videos.contains(file):
return .video
case audios.contains(file):
return .audio
default:
return .unknown
}
}
print(getType(of: "mp4"))
video
您可以打开 true
,然后在您有多个条件时将每个案例用作条件。
我认为你的整个问题在于你试图为每种类型维护 3 个独立的集合,而不是将它们直接连接到给定的文件类型:
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 { [=10=].value.contains(file) }?.key ?? .unknown
}
您可以向模式匹配运算符添加重载 ~=
:
func ~= <T> (pattern: Set<T>, value: T) -> Bool {
return pattern.contains(value)
}
func getType(of file: String) -> FileType {
switch file {
case photos: return .photo
case videos: return .video
case audios: return .audio
default: return .unknown
}
}
假设我有三组包含扩展:
let photos: Set = ["jpg", "png", "tiff"]
let videos: Set = ["mp4", "mov", "mkv"]
let audios: Set = ["mp3", "wav", "wma"]
和一个简单的枚举:
enum FileType {
case photo, video, audio, unknown
}
现在我想做的是实现一个函数,returns FileType
选项基于传递给它的字符串是什么以及包含它的集合:
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
}
它应该按预期工作,但我想知道是否有一种方法可以将 if
语句转换为一个 switch
情况(即使它会稍微改变逻辑),尤其是当使用枚举 switch
语句是避免错误的更好选择。
如果使用 switch
语句无法实现,我也会感谢任何优雅的替代方法。
这适合你的情况
let photos: Set = ["jpg", "png", "tiff"]
let videos: Set = ["mp4", "mov", "mkv"]
let audios: Set = ["mp3", "wav", "wma"]
enum FileType {
case photo, video, audio, unknown
}
func getType(of file: String) -> FileType {
switch true {
case photos.contains(file):
return .photo
case videos.contains(file):
return .video
case audios.contains(file):
return .audio
default:
return .unknown
}
}
print(getType(of: "mp4"))
video
您可以打开 true
,然后在您有多个条件时将每个案例用作条件。
我认为你的整个问题在于你试图为每种类型维护 3 个独立的集合,而不是将它们直接连接到给定的文件类型:
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 { [=10=].value.contains(file) }?.key ?? .unknown
}
您可以向模式匹配运算符添加重载 ~=
:
func ~= <T> (pattern: Set<T>, value: T) -> Bool {
return pattern.contains(value)
}
func getType(of file: String) -> FileType {
switch file {
case photos: return .photo
case videos: return .video
case audios: return .audio
default: return .unknown
}
}