美文网首页
阅读 FengNiao 源码 的一些收获

阅读 FengNiao 源码 的一些收获

作者: jianshudxw | 来源:发表于2019-01-08 15:47 被阅读0次

前言

网上看到喵神的一个开源代码,目前,我们工程还未全部 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 的初始化器

谈谈整体代码结构

业务需求

  • 实现一个命令行工具
  • 给定资源的后缀,给定查询文件后缀, 给定相应目录
  • 输出查询文件中没有出现的 资源名字 的资源文件,展示,删除这些资源文件等

结构实现

  1. 输入参数的人性化处理
  2. 用一个库Kit 将通用代码封装起来
  3. 根据目录,资源后缀查找文件,业务简单直接处理
  4. 在查询文件中,搜索关键字:资源文件名称,这一业务比较复杂:
  • 主要通过面向协议方式编程
  • 代码封装思路:
    1. 不同文件类型,搜索的方式并不相同。主要有1.正则表达式不同。2处理的逻辑不同。但从整体看,都是在文件中搜索。所以有了 协议 FileSearchRule
    2. 大部分的逻辑相同 所以有了RegPatternSearchRule 并且它的扩展,实现了这个大部分通用的逻辑流程。然后,就有各自的具体struct 去遵循这个protocol了。
    3. 特殊的Plist 类型,因为只有一个类型,就简单的由 struct PlistAppIconSearchRule 遵循FileSearchRule,并实现了它特殊的逻辑流程。
      使用enum 和 协议 将个个类型的处理联系起来。

struct or class

这里的业务都是处理都是独立完成,不需要在不地方访问修改以前的类,用struct 更好。

测试,用了个测试框架,目前没细看

相关文章

  • 阅读 FengNiao 源码 的一些收获

    前言 网上看到喵神的一个开源代码,目前,我们工程还未全部 swift 化,就 git 下来看看源码,向大神学习写代...

  • 阅读Kingfisher源码的一些收获

    1. 命名空间的使用 Kingfisher命名空间有2种方式,一种是使用协议加上包装器,另一种是把类型定义在枚举里...

  • 领略Quartz源码架构之美——源码实弹之Trigger

    本章阅读收获:可了解Quartz框架中的Trigger部分源码 无缝衔接 Job源码看过之后,今天要分析的源码在架...

  • 源码阅读中的收获

    最近在做短视频相关的模块,于是在看 GPUImage 的源码。其实有一定了解的伙伴一定知道 GPUImage 是通...

  • AFURLRequestSerialization源码阅读收获

    属性监听 通常对属性进行监听时,我们都是直接写成字符串,AFURLRequestSerialization的写法是...

  • Dubbo源码阅读(1)搭建Dubbo源码阅读环境

    Dubbo源码阅读(1)搭建Dubbo源码阅读环境 一直想阅读一些开源框架的源码,但是由于上学期事情太多而一直没有...

  • JVM阅读心得0713

    JVM的源码阅读需要带着问题、顺着一些基本规律和主线去看,这样才能略有收获。 我总结了几个主线: kClass体系...

  • 架构师成长之路(内附推荐书籍)

    1. 阅读源码 说到阅读源码,可能很多同学都尝试过去阅读一些开源框架的源码,但是很难找到一个入口点;即便找到入口点...

  • 架构成长学习

    架构成长学习 1. 阅读源码 说到阅读源码,可能很多同学都尝试过去阅读一些开源框架的源码,但是很难找到一个入口点;...

  • iOS源码

    前言 如果要了解一些底层知识,需要阅读一些相关的源码。这里简单的列出相关的源码下载地址,以及一些对于源码解读比较好...

网友评论

      本文标题:阅读 FengNiao 源码 的一些收获

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