Swift - 常用的 Function 擴就對了

「我寫了一個Function幫我畫底線,有用到的View只要複製過去用就行了,利害吧!!」約翰這麼說

「這麼常用的話,何不加到View底下當成Extension就好了...」對面傳來冷冰冰的聲音

好吧,早晚要面對extension這個煩人又迷人的設計

原本只是想在 UIView 加個底線,所以寫了這樣的程式:

let border = CALayer() 
border.backgroundColor = UIColor.black 
border.frame = CGRect(x: 0, y: myView.frame.height, width: myView.frame.width, height: 1)
myView.layer.addSublayer(border) 

很好很強大,簡單幾行搞定

然後接著下來有幾個畫面都是類似的長像

好吧~勉強複製貼上,放到updateUI也不會很麻煩

然後是下一個專案要用…

可惡…開始覺得麻煩了

只好再找找有沒有方法能省事

果然這種小問題已經有各種大神給出程式碼了,

所以新增一個檔案叫「UIView+Border.swift」 內容如下:

import Foundation 
import UIKit 
@objc public extension UIView { 
  @objc enum ViewSide : Int { 
      case Left, Right, Top, Bottom 
  } 

  @objc public func addBorder(toSide side: ViewSide, withColor color: CGColor, andThickness thickness: CGFloat) { 
      let border = CALayer() 
      border.backgroundColor = color 
      switch side { 
          case .Left: border.frame = CGRect(x: frame.minX, y: frame.minY, width: thickness, height: frame.height); break 
          case .Right: border.frame = CGRect(x: frame.maxX, y: frame.minY, width: thickness, height: frame.height); break 
          case .Top: border.frame = CGRect(x: frame.minX, y: frame.minY, width: frame.width, height: thickness); break 
          case .Bottom: border.frame = CGRect(x: frame.minX, y: frame.maxY, width: frame.width, height: thickness); break 
      } 
      layer.addSublayer(border) 
  } 
}

有幾個我不太了解但有查到的說明如下:

開頭加上 @objc :因為專案是Objective-C和Swift混用,所以為了讓Objective-C的程式碼也能使用而加的

enum ViewSide >>: Int<< :原本找到的範例是沒有後面的INT,但有神人提到是Swift 3 以後需要加的所以就加上去了

public:為了要讓Internal層級可以呼叫

使用起來如下,三個參數依序是:哪一邊、顏色、粗細

self.myView.addBorder(toSide: .Bottom, withColor: UIColor.init(hex: "ff0000").cgColor, andThickness: 1)

打完收工,小菜一碟