优雅快速的搭建iOS工程框架搭建的探讨

一个简洁优雅的iOS工程目录,能够帮助团队提升开发效率,同时也令自己进行心情愉悦的编码;反之,杂乱无章的目录则会使人心情烦躁,降低团队开发效率。

不知你是否也有同感?欢迎你在评论区写下的感受。


首先,我想说:

  • 本文说的工程架构适用于纯代码开发的团队,也适用于使用Storyboard开发的团队;
  • 本文适用于传统的Tabbar+NavigationBar搭建的app,也适用于其他非传统的app;
  • 本文特别适用于让团队的新进成员了解项目的整体构架,并且进行快速开发

本文以公司的FCS app为例,界面如下:

主界面

公司的项目属于Objective-C和Swift混编的项目,对于纯swift的项目和纯OC的项目,可能文件夹和类文需要自行修改,Xcode项目工程目录如下:
工程框架搭建图

正如上图所示,我将项目划分为9大部分,GitHub地址

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界面的编写,有人负责日志类的封装编写。

一些其他的小建议:

  1. 文件夹模块使用英文而不要使用中文命名,并且使用正确的英文名不要使用拼音;
  2. 名称首字母大写;
  3. 文件夹层数不要太多,最多三层;
  4. 快速定位某一个类文件的位置,光标在定位在类文件里面,按快捷键command+shift+J并可定位他的具体位置模块。

demo的GitHub地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,613评论 4 59
  • 我是一道影子,我怕黑 我怕失去痕迹,失去颜色 我也会流泪,虽然没有声音 就像我笑起来,所有的人却以为我快乐 我咧着...
    Angel皖阅读 212评论 4 3
  • 许多人认为晋国的霸业成於晋文公重耳,实则不然。晋公子重耳在外流亡长达19年之久,回国即位时就已经62岁了,早已经垂...
    有知社阅读 491评论 3 3
  • 圆狗子火烧明园(1.不正经的大家) 神秘的陆家可以和狗对话一些小区里狗子们的日常没什么主线剧情——van家豆浆。 ...
    van家豆浆阅读 267评论 0 0