1. 程式人生 > >Swift開發中遇到的注意點(二)

Swift開發中遇到的注意點(二)

這段時間開發專案的同時在看第三方庫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的後臺解碼

當圖片比較大時,圖片的解碼也會變成一個耗時操作,這時,我們可以在後臺佇列,先把UIImageJPEG/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
    }
}

這次就先寫這麼多了,後續有需要記錄的內容在繼續寫吧。