Midnight by Basil Greber on 500px.com原创文章转载请注明出处
我之前学习过的编程语言(C、Objective-C、Java...)对于枚举值的介绍通常都是从枚举类型开始,比如枚举水果类型、东南西北、星期几等等。今天我们就来介绍一下我在使用LeanCloud存储类型的时候,自定义文件类型的枚举,顺带会提到一些模式匹配的使用。
enum和类型枚举
在使用LeanCloud开发App的时候,其内置的_File数据仅包含了字符串类型的mime_type,也有字符串类型的name,实际应用中我们要根据不同的文件类型调用不同的操作方法。现在我们要创建一个文件类型的枚举,来进行归类。
enum AVFileType: Int {
case Avatar = 0
case PostPicture
case PostVoice
case PostVideo
case Track
case Image
case Audio
case UnknownType
init(name: String) {
let name = name.lowercaseString
if name.hasPrefix("avatar_") {
self = Avatar
} else if name.hasPrefix("picture_") {
self = PostPicture
} else if name.hasPrefix("voice_") {
self = PostVoice
} else if name.hasPrefix("video_") {
self = PostVideo
} else if name.hasPrefix("track_") {
self = Track
} else if name.hasSuffix(".jpg") || name.hasSuffix(".png") {
self = Image
} else if name.hasSuffix(".amr") {
self = Audio
} else {
self = UnknownType
}
}
}
然后我们给AVFile扩展一些方法
extension AVFile {
// MARK: - Class function
// MARK: - Public
func getFileType() -> AVFileType {
return AVFileType(name: name)
}
// MARK: - Private
}
现在如果我们要给AVFile增加openFile的方法,就可以这样操作。
enum AVFileType: Int {
...
func openFile() {
switch self {
case .Avatar
//do someting
...
}
}
}
extension AVFile {
...
func openFile() {
getFileType().openFile()
}
}
是不是简洁明了?
模式匹配简单应用
在上面的代码中,枚举的初始化是通过if else的分支语句去进行判断,我们尝试一下利用模式匹配来比较。
本例只是演示模式匹配,实际使用的效果未必比if else的分支语句更好。
模式匹配1
enum AVFileType: Int {
...
init(name: String) {
let name = name.lowercaseString
switch true {
case name.hasPrefix("avatar_"):
self = Avatar
case name.hasPrefix("avatar_"):
self = Avatar
case name.hasPrefix("picture_"):
self = PostPicture
case name.hasPrefix("voice_"):
self = PostVoice
case name.hasPrefix("video_"):
self = PostVideo
case name.hasPrefix("track_"):
self = Track
case name.hasSuffix(".jpg") || name.hasSuffix(".png"):
self = Image
case name.hasSuffix(".amr"):
self = Audio
default:
self = UnknownType
}
}
}
模式匹配2
Swift 3已经移除了柯里化函数,但是柯里化的本质就是返回函数,所以替代方法还是有的。
func hasPrefix(prefix: String) -> (String) -> Bool {
return { (value: String) -> Bool in
return value.hasPrefix(prefix)
}
}
func hasSuffix(suffix: String) -> (String) -> Bool {
return { (value: String) -> Bool in
return value.hasSuffix(suffix)
}
}
enum AVFileType: Int {
...
init(name: String) {
let name = name.lowercaseString
switch name {
case let str where hasPrefix("avatar_")(str):
self = Avatar
case let str where hasPrefix("picture_")(str):
self = PostPicture
case let str where hasPrefix("voice_")(str):
self = PostVoice
case let str where hasPrefix("video_")(str):
self = PostVideo
case let str where hasPrefix("track_")(str):
self = Track
case let str where hasSuffix(".jpg")(str) || hasSuffix(".png")(str):
self = Image
case let str where hasSuffix(".amr")(str):
self = Audio
default:
self = UnknownType
}
}
}
我是咕咕鸡,一个还在不停学习的全栈工程师。
热爱生活,喜欢跑步,家庭是我不断向前进步的动力。
网友评论