Swift開發中遇到的注意點(二)
阿新 • • 發佈:2018-12-30
這段時間開發專案的同時在看第三方庫Kingfisher
的實現,感覺有一些東西也需要記錄和總結一下。
6. public private(set)
,public fileprivate(set)
這和weak
一樣是變數的一種修飾,意思是該變數可以public
訪問,但是賦值是private
的,如此設定可以方便許多本來需要readonly
的變數的處理。
7. DispatchWorkItem
這個只是Dispatch
的一種用法,博主對於這種用法沒有了解過,也就記錄一下。通過變數,或者屬性記錄DispatchWorkItem
,然後再利用DispatchQueue
統一處理,對於一些耗時或延時操作會非常方便。
8. defer
的用法
沒有什麼可說的,就是在初始化記憶體(如UIGraphicsBeginImageContext
)之後,可以直接新增對應的釋放操作,避免後面的程式碼中忘記。
let context = UIGraphicsGetCurrentContext()
defer { UIGraphicsEndImageContext() }
9. UIImage
的後臺解碼
當圖片比較大時,圖片的解碼也會變成一個耗時操作,這時,我們可以在後臺佇列,先把UIImage
從JPEG/PNG
型別解碼成對應的Bitmap
,然後在主執行緒進行處理,從而優化主執行緒的效能。
當圖片較多時,如UITableView
解碼程式碼如下:
func decoded() -> UIImage {
guard let imageRef = self.cgImage else {
return self
}
// Draw CGImage in a plain context with scale of 1.0.
UIGraphicsBeginImageContextWithOptions(CGSize(width: imageRef.width, height: imageRef.height), false, 1.0 )
defer { UIGraphicsEndImageContext() }
guard let context = UIGraphicsGetCurrentContext() else {
return self
}
context.scaleBy(x: 1.0, y: -1.0)
context.translateBy(x: 0, y: -imageRef.height)
let rect = CGRect(x: 0, y: 0, width: CGFloat(imageRef.width), height: CGFloat(imageRef.height))
context.draw(imageRef, in: rect)
let decompressedImageRef = context.makeImage()
return UIImage(cgImage: decompressedImageRef, scale: 1.0, orientation: UIImageOrientation.up)
10. 泛型
Swift是支援泛型的,所以可以在宣告的地方加上泛型的宣告,這樣的話,類(結構體或方法)就可以作用於多種資料型別上面。
示例程式碼如下:
func equalTo<Base:Equatable>(lhs:Base, rhs:Base) -> Bool {
return lhs == rhs
}
class TemplateTest<Base> {
var base: Base
init(base: Base) {
self.base = base
}
}
這次就先寫這麼多了,後續有需要記錄的內容在繼續寫吧。