美文网首页
Swift枚举活学活用(3)

Swift枚举活学活用(3)

作者: 咕咕鷄 | 来源:发表于2016-11-17 16:26 被阅读0次

    原创文章转载请注明出处

    Midnight by Basil Greber on 500px.comMidnight 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)

          本文链接:https://www.haomeiwen.com/subject/cbgdpttx.html