本帖最后由 Caesar 于 2016-10-14 10:46 编辑


就像从零搭建OC项目Service支撑一样,要在一定量知识储备的情况下才可以让框架质量得到保证。 Service:项目支撑服务。每个公司的项目都会依赖一定量的组件,每一个组件作为项目的独立模块提供本身的功能供使用。一般来讲,大公司的项目均为组件化项目,一方面为了方便安排开发,另一方面方面集成管理与扩展。小公司的项目则是依赖某一个私有库作为项目的支撑。建议每一个项目都按照组件化项目的思想来从零构造,便于以后核心服务代码抽出进行组件化拆分。




1、Swift知识储备与框架需求

知识储备即熟悉Swift编码思想,基础知识,进阶知识与细节知识,这里不做赘述。编码能力不能做衡量,即便知识储备不够,也可以慢慢的学习。给出的建议是:多阅读源码,不是大型开源项目的源码,而是小而精的功能性项目源码。

框架需求:按照开发步骤

  • [ ] 环境管理 ModeSwitch


控制当前环境,开发,预发,正式

  • [ ] 日志模块-基础日志 Console


完成基础日志模块,日志打印即可

  • [ ] 功能扩展 Foundation


Foundation常用的扩展

  • [ ] 界面扩展 UIKit


UIKit常用的扩展

  • [ ] 权限服务 Permission


获得应用程序权限

  • [ ] 组件处理/链接模块 Plug-in


组件化方案,组件加载,组件衔接(Router)

  • [ ] 数据模块 DataBase


数据持久层,暂定使用数据库

  • [ ] 网络模块 Network


网络层,网络请求,缓存控制,图片缓存等

  • [ ] 日志模块-日志上报 Console


完成日志上报功能(一般为奔溃上报)

  • [ ] 推送服务 Push


远程推送与本地推送服务

  • [ ] 位置服务 Location


位置获取服务

  • [ ] 数据收集服务 Monitor


数据打点与用户信息上报等




2、规范、知识 (仅了解基础的开发者阅读<知识回顾>)

别急着入手写代码,先制定一系列的规范,了解一些知识。



2.1、规范

Swift版本:3.0

Xcode版本:8.0+

支撑版本:iOS 8.0+

缩进: 2

如何构造Swift框架(1)知识储备 1

如何构造Swift框架(1)知识储备 - 敏捷大拇指 - 如何构造Swift框架(1)知识储备 1


单例写法与命名规范:

如何构造Swift框架(1)知识储备 2

如何构造Swift框架(1)知识储备 - 敏捷大拇指 - 如何构造Swift框架(1)知识储备 2


闭包预定义:

如何构造Swift框架(1)知识储备 3

如何构造Swift框架(1)知识储备 - 敏捷大拇指 - 如何构造Swift框架(1)知识储备 3


函数参数与规范:

使用 _来忽略参数描述,使用@discardableResult来标记该函数可以忽略返回值,尽量不要使用关键字。尽量避免函数复杂程度(不要写内部函数等)。命名明确,可选参数要写默认值。

注释规范:

[Swift] 纯文本查看 复制代码
// MARK: Initializing


[Swift] 纯文本查看 复制代码
/// Returns a matched view controller from a specified URL.
///
/// - parameter url: The URL to find view controllers.
/// - returns: A match view controller or `nil` if not matched.


MARK、TODO等使用//开头,默认注释使用///开头。

好的规范可以提高代码的可读性与统一性


上边只是一些简单的规范。还有很多好的建议,我们慢慢聊。



2.2、知识


2.2.1、空值合并

a ?? b 中的 ?? 就是是空值合并运算符,会对 a 进行判断,如果不为 nil 则解包,否则就返回 b 。使用的时候有以下两点要求:

  • a 必须是 optional 的
  • b 必须和 a 类型一致


当然如果你觉得这样可读性不高,我们可以自定义运算符来实现:

[Swift] 纯文本查看 复制代码
infix operator |->| {
}
func |->|<T> (left: T?, right: T) ->T {
  if let l = left {
    return l
  }
  return right
}
var a: String?
var b = "Hello world!"
var c = a |->| b



2.2.2、关于字符串

String传递的时候会进行拷贝,NSString通常为引用,使用countElements计算String数量与同样NSString.length计算的结果可能不同,因为 length 利用的是 UTF-16 类型的值,而不是 Unicode 字符。比如 emoji 表情加进去之后,UTF-16 算的结果是2,而 Unicode 的计算结果是1。


2.2.3、数组

除了普通的初始化方法,我们可以通过 init(count: Int, repeatedValue: T) 来初始化一个数组并填充上重复的值:

[Swift] 纯文本查看 复制代码
// [0.0, 0.0, 0.0]
var threeDoubles = [Double](repeating:0.0, count:3)


按某种规则获得新数组,使用map方法:

[Swift] 纯文本查看 复制代码
var oldArray = [10, 20, 30, 40]
var newArray = oldArray.map { (money: Int) in
  "¥\(money)"
}
print(newArray)


当然也可以简写:

[Swift] 纯文本查看 复制代码
var newArray = oldArray.map({ "¥\($0)" })


数组过滤:

[Swift] 纯文本查看 复制代码
var oldArray = [10, 20, 45, 32]
var filteredArray : Array<Int> = []
for money in oldArray {
  if (money > 30) {
    filteredArray += [money]
  }
}
print(filteredArray)


不过这个方法看起来很笨重,我们使用新方法:

[Swift] 纯文本查看 复制代码
var filtered = oldArray.filter {
  return $0 > 30
}