一个简洁优雅的 iOS 工程目录, 能够帮助团队提升开发效率, 同时也令自己进行心情愉悦的编码; 反之, 杂乱无章的目录则会使人心情烦躁, 降低团队开发效率.
不知你是否也有同感? 欢迎你在评论区写下的感受.
首先, 我想说:
本文说的工程架构适用于纯代码开发的团队, 也适用于使用 Storyboard 开发的团队;
本文适用于传统的 Tabbar+NavigationBar 搭建的 app, 也适用于其他非传统的 app;
本文特别适用于让团队的新进成员了解项目的整体构架, 并且进行快速开发
本文以公司的 FCS app 为例, 界面如下:
主界面
公司的项目属于 Objective-C 和 Swift 混编的项目, 对于纯 swift 的项目和纯 OC 的项目, 可能文件夹和类文需要自行修改, Xcode 项目工程目录如下:
工程框架搭建图
正如上图所示, 我将项目划分为 9 大部分, GitHub 地址 https://github.com/XcqRomance/FastProjectFramework :
Models: 模型数据类, 所有自定义的数据模型应该放在此处;
Views: 视图类, 以功能模块还需要再建一层文件夹, 所有自定义的功能模块的视图类都应该放在给自的文件夹下此处,, 手动拖入的第三方 UI 控件除外, 第三方的 UI 应该放入 Vendor 文件夹里;
Controllers: 控制器类, 所有控制器类放在此文件夹里面, 如果有 BaseViewController,BaseNavigationController 可以放在 Base 文件夹下(可以在此目录下新建的一个 Base 文件夹), 同时相应功能模块的 Storyboard 也放在此目录下, Storyboard 放在此处相比于放在 View 里面更加方便(我们项目最开始在 Views 目录下新建 Storyboards 文件夹来存放所有的 Storyboard, 这样的做法弊端是去相应的 Storyboard 和功能模块的 VC 太远, 操作不便);
Resouces: 资源文件夹, 存放项目需要用到的音频, 视频, 图片(webP 格式的图片或者内存比较大 png 只需要用到一份的背景图片), 字体, 动画等等资源文件都放在此处;
Util, 一些工具类的文件夹, 比如 Objective-C 的分类文件夹 Category,swift 扩展类的文件夹 Extension, 管理单例类文件夹 Manager 等等;
Vendor, 手动管理的第三方库, 上图的 BookRoom 是我们 FCS app 的 BookRoom 模块都是封装为 framework 的形式引入的, 所以就适合在此处添加, 还有一些比较轻的第三方库就可以手动拖入代码添加进来, 比如我们的项目中有一个获取适配型号的第三方库 DeviceUtil, 对于这类比较轻的库尽量使用手动拖入代码管理, 毕竟项目中的 framework 多了, 会影响 app 的启动时间, 这个在 WWDC 2016 Session 406 - Optimizing App Startup Time 的演讲中有讲原理;
Pods : 优秀的第三方库管理工具, 比如网络请求 AFNetworking, 图片加载 SDWebImage 等等比较重的第三方库就可以使用 Pods 自动管理, 当然你也可以使用 Carthage 来管理, 具体使用哪个见仁见智, 网络上也有很多关于这个的讨论. 我们公司使用的是 Pods, 所以就是以 Pods 为主了
Appdelegate 和首页: Appdelegate 和首页是各个功能模块的入口, 所以放在顶部最显眼的位置,(对于传统 Tabbar+NavigationBar App 的首页类文件可能会在对应的模块下);
Assets.xcassets,info.plist: 这部分相对 Appdelegate 在同一目录下, 但是放在最下面, 这部分的操作频率不是太多, Assets.xcassets 里面的图片, 可以使用功能模块放置添加(New Folder, 以模块命名).
看到这里, 有的人会想: 一个项目直接按照功能模块划分不也挺好的么, 每个功能模块里面再按照 MVC 的模式划分, 以下面这个 app 为例
艺学机构版
划分如下所示如下图所示:
以功能模块划分工程框架图
这两种搭建项目框架的模式没有孰优孰劣之分, 只有得放到具体情境下面讨论才有意义, 不过很明显, 第二种以功能模块划分的模式适用于以小团队开发(iOS 端 2-3 人以下), 这样每个人负责开发一个模块, 效率非常高. 如果团队人员比较多, 则更适合采用第一种模式, 这样开发效率更高, 比如有人专门负责, 网络层代码的编写, 有人专门负责 UI 界面的编写, 有人负责日志类的封装编写.
一些其他的小建议:
文件夹模块使用英文而不要使用中文命名, 并且使用正确的英文名不要使用拼音;
名称首字母大写;
文件夹层数不要太多, 最多三层;
快速定位某一个类文件的位置, 光标在定位在类文件里面, 按快捷键 command+shift+J 并可定位他的具体位置模块.
demo 的 GitHub 地址 https://github.com/XcqRomance/FastProjectFramework
来源: http://mobile.51cto.com/hot-580399.htm