Swift 開發的工具類,主要是提供正規表示式及其它類的擴充套件(新增加)

語歌發表於2017-03-17

Swift 開發的工具類,主要是提供正規表示式及其它類的擴充套件

直接看GitHub原始碼

Swift 開發的工具類,主要是提供正規表示式及其它類的擴充套件(新增加)

新增加一些方法的擴充套件。如:UIView的擴充套件,富文字的擴充套件,UIColor的擴充套件,執行緒安全使用的擴充套件

3.UIView的一些擴充套件

主要是方便直接對檢視控制元件x,y等等一系列的操作

這個比較簡單,不做介紹,主要是 set,get,整合後直接用就行

extension UIView {

    var x: CGFloat {
        get {
            return frame.origin.x
        }
        set {
            frame = CGRect(x: newValue, y: frame.origin.y, width: frame.width, height: frame.height)
        }
    }
    ........................複製程式碼

4.執行緒安全操作

在Oc中為了防止多執行緒中對某些資源的安全訪問 引用了

@synchronized的操作,更多的關於多執行緒的知識 點我,這裡大量篇幅的描述,會使你得到更多的收穫。這裡不做陳述

在Swift中已經移除了synchronized 的使用,相應的 我們可以直接使用:

objc_sync_enter
///資源的操作
objc_sync_exit

結合閉包的使用可以直接這樣使用

public func synchronized(_ lock: AnyObject, closure: () -> ()) {
    objc_sync_enter(lock)
    closure()
    objc_sync_exit(lock)
}複製程式碼

相應的執行的時候你可以這樣:

var test = 0
synchronized(test as AnyObject) {
    test = 1     // test 在該作用域不會被其他執行緒改變
    print(test)
}
/// 或者這樣
synchronized(test as AnyObject, closure: {
    print(test)  // test 在該作用域不會被其他執行緒改變
})複製程式碼

這樣你就可以愉快的使用了

5.對UIColor的擴充套件

都知道Xcode在8.0以後可以直接在程式碼中使用顏色編輯器,圖片預覽。這樣大大的節省了我們的開發效率

而在於有時候的習慣的使用上來說,可能或多或少還有用程式碼來操作的,這裡帶給大家在使用程式碼的時候的一些方便

有時候在開發的過程中UI給的標註是 0xCE0755 這樣的顏色標註,那麼我們有時候就需要轉換,當然在顏色編輯器裡面是可以直接使用的。

轉換如下:

public extension UIColor {

    /// Init color without divide 255.0
    ///
    /// - Parameters:
    ///   - r: (0 ~ 255) red
    ///   - g: (0 ~ 255) green
    ///   - b: (0 ~ 255) blue
    ///   - a: (0 ~ 1) alpha
    convenience init(r: Int, g: Int, b: Int, a: CGFloat) {
        self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: a)
    }

    /// Init color without divide 255.0
    ///
    /// - Parameters:
    ///   - r: (0 ~ 255) red
    ///   - g: (0 ~ 255) green
    ///   - b: (0 ~ 1) alpha
    convenience init(r: Int, g: Int, b: Int) {
        self.init(r: r, g: g, b: b, a: 1)
    }

    /// Init color with hex code
    ///
    /// - Parameter hex: hex code (eg. 0x00eeee)
    convenience init(hex: Int) {
        self.init(r: (hex & 0xff0000) >> 16, g: (hex & 0xff00) >> 8, b: (hex & 0xff), a: 1)
    }

}複製程式碼

這裡要說的是主要原理就是: 先通過&運算,取得相應的顏色位,然後通過左移相應的位數來進行換算。這裡就不多說了。傳送門

6.富文字的一些操作,工程中非常清楚的介紹了使用,這裡不做陳述了。

科學計數法轉換
人民幣的金額轉換

7.對String的擴充套件,進行擷取,插入操作

extension String {
    /// 擷取第一個到第任意位置
    ///
    /// - Parameter end: 結束的位值
    /// - Returns: 擷取後的字串
    func stringCut(end: Int) ->String{
        printLogDebug(self.characters.count)
        if !(end < characters.count) { return "擷取超出範圍" }
        let sInde = index(startIndex, offsetBy: end)
        return substring(to: sInde)
    }

    /// 擷取人任意位置到結束
    ///
    /// - Parameter end:
    /// - Returns: 擷取後的字串
    func stringCutToEnd(star: Int) -> String {
        if !(star < characters.count) { return "擷取超出範圍" }
        let sRang = index(startIndex, offsetBy: star)..<endIndex
        return substring(with: sRang)
    }

    /// 字串任意位置插入
    ///
    /// - Parameters:
    ///   - content: 插入內容
    ///   - locat: 插入的位置
    /// - Returns: 新增後的字串
    func stringInsert(content: String,locat: Int) -> String {
        if !(locat < characters.count) { return "擷取超出範圍" }
        let str1 = stringCut(end: locat)
        let str2 = stringCutToEnd(star: locat)
        return str1 + content + str2
    }
}複製程式碼

8.延時使用,非同步延時,主執行緒執行

使用:

    let sleep = delay(0.7) {
        /// 執行程式碼
    }複製程式碼

使用過程中不想執行了

    cancel(sleep)複製程式碼
原始碼如下:
//MARK:            延時使用        ____________________________________________________________________________________________________

typealias Task = (_ cancel : Bool) -> Void

func delay(_ time: TimeInterval, task: @escaping ()->()) ->  Task? {

    func dispatch_later(block: @escaping ()->()) {
        let t = DispatchTime.now() + time
        DispatchQueue.main.asyncAfter(deadline: t, execute: block)
    }

    var closure: (()->Void)? = task
    var result: Task?

    let delayedClosure: Task = {
        cancel in
        if let internalClosure = closure {
            if (cancel == false) {
                DispatchQueue.main.async(execute: internalClosure)
            }
        }
        closure = nil
        result = nil
    }

    result = delayedClosure

    dispatch_later {
        if let delayedClosure = result {
            delayedClosure(false)
        }
    }
    return result
}

func cancel(_ task: Task?) {
    task?(true)
}複製程式碼

更新繼續,如果您覺得對你有幫助 來個星星贊助下?

相關文章