真不是標(biāo)題黨勺像,除了正常的算數(shù)運(yùn)算,其他的千萬要繞著"+"運(yùn)算遠(yuǎn)一點(diǎn)啊错森。
這2天Xcode把我們團(tuán)隊(duì)坑瘸了吟宦,隨著代碼越來越多,這編譯速度就越來越慢涩维,越來越慢……今天我一個(gè)下午一邊敲一遍編譯殃姓,就編譯成功了一次,簡直是令人發(fā)指啊蜗侈!??
實(shí)在是不能忍了篷牌,滿世界找了找原因,在stackoverflow上找到這個(gè)編譯時(shí)間查看工具BuildTimeAnalyzer-for-Xcode踏幻,再回想起了一個(gè)零贊同的我以為是亂寫的回答(當(dāng)時(shí)覺得完全不可能才印象深刻)枷颊,逐漸開始找到了頭緒,項(xiàng)目編譯慢的主要原因居然真是因?yàn)樗f的"+"運(yùn)算導(dǎo)致的叫倍。我靠偷卧!
下面是BuildTimeAnalyzer運(yùn)行圖。每一行都是一個(gè)swift文件(或某個(gè)swift文件的一個(gè)closure)的編譯時(shí)間……項(xiàng)目里的這些文件大多有共同的特征:多個(gè)string
類型的變量以+
運(yùn)算相連吆倦。恩听诸,一個(gè)230行代碼的文件,也就編譯了4分鐘而已嘛蚕泽。
然后順藤摸瓜找到了這個(gè)討論http://stackoverflow.com/questions/29707622/bizarre-swift-compiler-error-expression-too-complex-on-a-string-concatenation晌梨,Honey的回答大致意思就是說swift3的 "+ " 運(yùn)算嚴(yán)重超載了,運(yùn)算時(shí)間會呈指數(shù)級的增長须妻?仔蝌??;睦簟A簿!
怎么不用+
號绰更,大家應(yīng)該都知道吧瞧挤,let combinedString = "\(hello) \(world)"
就好了。本文還沒結(jié)束儡湾,我發(fā)現(xiàn)stackoverflow上其他一些開發(fā)者的說法特恬,也一齊轉(zhuǎn)過來了。
比如說Stefan Nestorov說不能這樣使用??
,會編譯慢:
let name = "\(someString ?? "")"
bibscy說Dictionary不能這樣寫
func toAnyObject() -> AnyObject {
return
["BookingAmount":BookingAmount,
"BookingNumber":BookingNumber,
"PostCode":PostCode,
"SelectedBathRow":SelectedBathRow,
"SelectedBedRow":SelectedBedRow,
"DateAndTime":DateAndTime,
"TimeStampDateAndTime":TimeStampDateAndTime,
"TimeStampBookingSavedInDB": TimeStampBookingSavedInDB,
"FrequencyName":FrequencyName,
"FrequecyAmount":FrequecyAmount,
"insideCabinets": insideCabinets,
"insideFridge": insideFridge,
"insideOven": insideOven,
"laundryWash": laundryWash,
"interiorWindows": interiorWindows,
"FullName":FullName,
"SuppliesName":SuppliesName,
"SuppliesAmount":SuppliesAmount,
"FlatNumber":FlatNumber,
"StreetAddress":StreetAddress,
"PhoneNumber":PhoneNumber,
"EmailAddress":EmailAddress] as AnyObject
}
要這樣寫:
func toAnyObject() -> AnyObject {
var someDict = [String : AnyObject]()
someDict["BookingAmount"] = self.BookingAmount as AnyObject?
someDict["BookingNumber"] = self.BookingNumber as AnyObject?
someDict["PostCode"] = self.PostCode as AnyObject?
someDict["SelectedBathRow"] = self.SelectedBathRow as AnyObject?
someDict["SelectedBedRow"] = self.SelectedBedRow as AnyObject?
someDict["DateAndTime"] = self.DateAndTime as AnyObject?
someDict["TimeStampDateAndTime"] = self.TimeStampDateAndTime as AnyObject?
someDict["TimeStampBookingSavedInDB"] = self.TimeStampBookingSavedInDB as AnyObject?
someDict["FrequencyName"] = self.FrequencyName as AnyObject?
someDict["FrequecyAmount"] = self.FrequecyAmount as AnyObject?
someDict["insideCabinets"] = self.insideCabinets as AnyObject?
someDict["insideFridge"] = self.insideFridge as AnyObject?
someDict["insideOven"] = self.insideOven as AnyObject?
someDict["laundryWash"] = self.laundryWash as AnyObject?
someDict["interiorWindows"] = self.interiorWindows as AnyObject?
someDict["FullName"] = self.FullName as AnyObject?
someDict["SuppliesName"] = self.SuppliesName as AnyObject?
someDict["SuppliesAmount"] = self.SuppliesAmount as AnyObject?
someDict["FlatNumber"] = self.FlatNumber as AnyObject?
someDict["StreetAddress"] = self.StreetAddress as AnyObject?
someDict["PhoneNumber"] = self.PhoneNumber as AnyObject?
someDict["EmailAddress"] = self.EmailAddress as AnyObject?
return someDict as AnyObject
}
Ben Simon說Array不要這樣寫
let array = ["1", "2", "3", "4", "5", "6", "7", "8"]
而要寫成這樣:
let array: Array<String> = ["1", "2", "3", "4", "5", "6", "7", "8"]
let combinedArrays = array1 + array2
是不好的徐钠,要這樣
[array1, array2].joined()
還讓不讓人用swift開發(fā)了癌刽!
所以用Xcode8.3開發(fā)swift應(yīng)用的同學(xué)們,如果你發(fā)現(xiàn)你的編譯速度慢的令人發(fā)指尝丐,一定要記得你看過本文跋园荨!
Xcode8.3/Swift3簡直是謀財(cái)害命摊崭。10天一新版讼油,都發(fā)了3版了,還是這么爛澳佤ぁ矮台!