Swift枚举活学活用(3)

原创文章转载请注明出处

Swift枚举活学活用(3)_第1张图片
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
        }
    }
}

我是咕咕鸡,一个还在不停学习的全栈工程师。
热爱生活,喜欢跑步,家庭是我不断向前进步的动力。

你可能感兴趣的:(Swift枚举活学活用(3))