更新swift4所遇到的問題

我要在河邊釣一整天的魚發表於2017-12-19

前言

因為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推斷出他的型別而不是你告訴他這個泛型是什麼型別,這就很煩。


感謝觀賞

相關文章