前言
因為xcode9同時支援Swift4和Swift3.2所以在升級Swift4的時候心沒有那麼的痛,在轉換成Swift4時錯誤集中在新增@objc
上,如果專案是OC和Swift共存的專案,那麼新增@objc
會讓你加到懷疑人生。
@objc
1、在Swift4中,OC和Swift共存的專案不再無腦將Swift的Public屬性和方法提供給OC,除非Swift中的方法和屬性用@objc
標記,這樣就減少了一些程式碼的生成從而減少了包的大小。build之後我們是純swift專案所以大部分是在選擇器呼叫的方法前面也要新增@objc
。
2、我們的專案是Swift的專案所以build儲存很快就修改完成,Run起來後如期的Crash了。這個是因為我們的JSON轉Model是使用的OC版的Mantle和SwiftJSON進行的解析,那麼就要在所有的Model屬性前面新增@objc
,不然Mantle在獲取類屬性型別的時候是空的。看到這個時候內心是崩潰和拒絕升級Swift4的,所以我們選擇捨棄Mantle使用Codable。
Codable( 官方文件)
1、在OC中JSON轉Model只能轉化為物件型別,在Codable支援JSON轉為常規型別。而遇到的更多的是將資料模型中的NSNumber改為Int或者Double,這是因為NSNumber是OC的型別不遵守Codable的。
2、有時候我們會在Model中新增一些JSON串沒有的欄位進行邏輯處理,類似
struct A: Codable{
var a: Int?
var isSelect: Bool = false
}
複製程式碼
因為"isSelect"是為了邏輯處理在JSON串中並不能找到相應的欄位,這個時候就會報出資料丟失的錯誤,而我們只需要將“isSelect”改成可選就可以了。
stuct A: Codable {
var a: Int?
var isSelect: Bool?
}
複製程式碼
在這次升級中主要是在改這OC呼叫Swift新增@objc
的問題和將資料解析改成Codable。還有一些錯誤是因為使用Mantle轉JSON串出現的問題只要使用JSONEncode
,還有會多出字串長度判斷使用characters
的警告刪除它就OK了。
平常使用泛型一個很煩的操作
我定義一個帶有泛型的方法
private func getData<T>(a: T) {
}
複製程式碼
直接呼叫
self.getData<A>(a)
複製程式碼
因為不知道泛型的型別而出現
Cannot explicitly specialize a generic function
複製程式碼
的錯誤, 如果不指定型別
self.getData(a)
複製程式碼
會出現下面的額錯誤
Generic parameter 'Element' could not be inferred
複製程式碼
只能在使用時進行一次強轉
self.getData(a as A)
複製程式碼
就是讓Xcode推斷出他的型別而不是你告訴他這個泛型是什麼型別,這就很煩。
感謝觀賞