# Swift开发-Swift项目编译运行超级慢-解决方案
2017-07-31 本文已影响51人
190CM
前言
Swift作为一个新兴的语言,慢慢的走到了3.0,现在越来越多的工程师尝试在项目中使用Swift进行开发。在我们新的的项目中就使用纯Swift开发,Swift的有点不用赘述,说说他的缺点,过慢的编译时间真的是万马奔腾极大的影响了我们的开发效率,发现有点自己很羡慕前段啦。
言归正传,开始不会觉得编译慢,随着开发的进入你会逐渐发现,完整的编译一次可能需要15到20分钟,完全不能忍。
代码优化
有图有真相,让我们具体看看差距是有多大
修改之前一个函数跑了150000ms、70000ms,编译不慢才怪!
修改之后变成了几十ms,简直是500斤变成了50斤有木有!


但是这部分我到底做了什么呢?
1.指定类型
var array1 = [[[String: String]]]()
var tipList1 = ["", "默认值,可编辑,主要在门店配置支付中进行选择", "", ""]
var array2 = [[[String: String]]]()
var tipList2 = ["默认值,可编辑,该信息会显示在微信、支付宝等第三方,支付成功后的页面中,请确保名称统一",
"",
"请填写营业执照注册号或统一社会信用代码。不包含括号及括号内的内容",
""]
var array3 = [[[String: String]]]()
var array3_m = [[[String: String]]]()
var array3_s = [[[String: String]]]()
var tipList3 = [""]
var array4 = [[[String: String]]]()
这就是时间最长的那段,起初我并没有指定类类型或是创建他们,等到使用的时候再去创建和处理数据
所以处理数据时,尽量避免类型推断,能确定类型的一定要给出具体类型
2.nil类型问题
由于swift存在可选值,因此某些对象的值可能为空,这在代码处理时可能会导致编译很慢,所以尽量不要书写,结构过于复杂或过长的代码,编译起来都很耗时
// 这样是比较耗时的
string = str1 == nil ? "" : str1 + str2 ?? "" + str3 ?? ""
let string1 = str1 ?? ""
let string2 = str2 ?? ""
let string3 = str3 ?? ""
string = string1 + string2 + string3
3.少用+、+=运算符
//1400.0ms
func addArray() {
let arr1 = [1,2,3]
let arr2 = [3,4,5]
result += arr1 + arr2 + [10]
}
//8.0ms
func arrPlusOperatos() {
let arr1 = [1,2,3]
let arr2 = [3,4,5]
result.appendContentsOf(arr1)
result.appendContentsOf(arr2)
}
4.其他耗时操作
1.懒加载也会增加耗时
2.复杂的集合和操作
总结:
类型推断是耗时最大因素,建议大家使用是指定类型
最后给大家附上我使用的检测工具BuildTimeAnalyzer-for-Xcode
首先,在项目中添加下图内容

运行BuildTimeAnalyzer

最后
