前言
网上看到喵神的一个开源代码,目前,我们工程还未全部 swift 化,就 git 下来看看源码,向大神学习写代码。简单分析哦,不求全面,想到啥就写啥,能力有限,如有错误,烦请指导指导。
第一个引起我注意的是 enum 使用
相对 oc 的enum swift 更强大,官方文档 看完是头大哈哈,或者说是看完了无感。
enum 拥有了像 类 一样的 很多功能,能够封装属性和提供方法了。
enum FileType {
case swift
case objc
case xib
case plist
case pbxproj
init?(ext: String) {
switch ext {
case "swift": self = .swift
case "h", "m", "mm": self = .objc
case "xib", "storyboard": self = .xib
case "plist": self = .plist
case "pbxproj": self = .pbxproj
default: return nil
}
}
func searchRules(extensions: [String]) -> [FileSearchRule] {
switch self {
case .swift: return [SwiftImageSearchRule(extensions: extensions)]
case .objc: return [ObjCImageSearchRule(extensions: extensions)]
case .xib: return [XibImageSearchRule()]
case .plist: return [PlistImageSearchRule(extensions: extensions), PlistAppIconSearchRule(extensions: extensions)]
case .pbxproj: return [PbxprojImageSearchRule(extensions: extensions)]
}
}
}
如果在OC 的时候,我是怎么样实现这样的功能的呢?
- 一般我会再创建一个类,将关于这enum的相关功能封装起来,就像上面的enum 我会提供两个封装
- 根据 string 返回 FileType
- 提供 searchRules。
- 但是在 swift 中,就可以直接封装到 enum 中。好处不言而喻。
协议也可以扩展,并能添加实现方法
struct 编译器会自动生成 memberwise 的初始化器
谈谈整体代码结构
业务需求
- 实现一个命令行工具
- 给定资源的后缀,给定查询文件后缀, 给定相应目录
- 输出查询文件中没有出现的 资源名字 的资源文件,展示,删除这些资源文件等
结构实现
- 输入参数的人性化处理
- 用一个库Kit 将通用代码封装起来
- 根据目录,资源后缀查找文件,业务简单直接处理
- 在查询文件中,搜索关键字:资源文件名称,这一业务比较复杂:
- 主要通过面向协议方式编程
- 代码封装思路:
- 不同文件类型,搜索的方式并不相同。主要有1.正则表达式不同。2处理的逻辑不同。但从整体看,都是在文件中搜索。所以有了 协议
FileSearchRule
- 大部分的逻辑相同 所以有了
RegPatternSearchRule
并且它的扩展,实现了这个大部分通用的逻辑流程。然后,就有各自的具体struct 去遵循这个protocol了。 - 特殊的Plist 类型,因为只有一个类型,就简单的由 struct
PlistAppIconSearchRule
遵循FileSearchRule
,并实现了它特殊的逻辑流程。
使用enum 和 协议 将个个类型的处理联系起来。
- 不同文件类型,搜索的方式并不相同。主要有1.正则表达式不同。2处理的逻辑不同。但从整体看,都是在文件中搜索。所以有了 协议
struct or class
这里的业务都是处理都是独立完成,不需要在不地方访问修改以前的类,用struct 更好。
网友评论