Swift 開發的工具類,主要是提供正規表示式及其它,Github會長期維護?並增加

語歌發表於2016-11-13

直接訪問 GitHub 看程式碼

YYGRegular

我是: 語歌複製程式碼

It is a regular expression used on iOS, which implement by Swift

這是一個基於swift快捷開發的擴充套件類,目前的涵蓋內容包括詳細列印,正規表示式,會經常維護

介於是增加更新,直接翻到後面。或者直接看 GitHub

直接把 Category 資料夾拖轉到工程裡面就行

1.列印的方法,及簡單介紹

符號 型別 描述
#file String 包含這個符號的檔案路徑
#line Int 符號出現的行號
#column Int 符號出現的類
#function String 包含這個符號的方法名字
public func printLogDebug<T>(_ message: T,
                   file: String = #file,
                   method: String = #function,
                   line: Int = #line
    )
{
    #if DEBUG
        print("------------------\(line) lineBegin-------------------------\n類名稱: \((file as NSString).lastPathComponent)\n方法名: \(method)\n資訊: \(message)\n------------------\(line) line  End-------------------------")
    #endif
}複製程式碼
呼叫
直接呼叫列印:
printLogDebug("內容")複製程式碼

在 Release 版本中會自動關閉掉向控制檯的輸出。

列印效果如下:

------------------(*行號*) lineBegin-------------------------
類名稱: ***.swift
方法名: ***
資訊: ***列印的內容***
------------------(*行號*) line  End-------------------------複製程式碼

關於public的使用看下錶

名稱 控制級(1-5,5最高) 解釋
private 1 只能在當前作用域中使用
fileprivate 2 只能在當前資料夾中使用
internal 3預設的 target中的其他程式碼訪問
public 4 為其他開發者開發庫使用
open 5 為其他開發者開發庫使用被open標記 的才能在其他庫中重寫

2.正規表示式用法

示例:
>

因為Swift支援過載操作符, 這個用 =~ 來判斷是否符合,關於=~ 功能及符號的定義,自己去程式碼裡面找吧!!!

>

        if "13146492969@sina.cn" =~ mail {
            printLogDebug("^_^")
        } else {
            printLogDebug("~~~~(>_<)~~~~")
        }
        /// 自定義的匹配格式判斷是否是手機號
        let isIphoneNum: String = "1\\d{10}"
        if "13146492969" =~ isIphoneNum {
            printLogDebug("^_^")
        } else {
            printLogDebug("~~~~(>_<)~~~~")
        }複製程式碼

定義了操作符的優先順序:

precedencegroup

定義了相同操作符出現的結合順序

associativity

表示前後都是輸入

infix

相關正則匹配的寫法,有想知道更詳細的寫法 請移步: 正規表示式學習

以下給出基本的寫法。

不足之處,煩請指出

1./// 郵箱匹配
let mail: String = "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$"

2./// 匹配使用者名稱 字面或者數字組合 4到16位
let Username: String = "^[a-z0-9_-]{4,16}$"

3./// 匹配密碼 字面加下劃線,6到18位
let Password: String = "^[a-z0-9_-]{6,18}$"

4./// 匹配16進位制
let HexValue: String = "^#?([a-f0-9]{6}|[a-f0-9]{3})$"

5.///內容帶分割符號 “Anne-Blair”
let Slug: String = "^[a-z0-9-]+$"

6./// 匹配URL
let isURL: String = "^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$"

7./// 匹配IP地址
let IPAddress: String = "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"

8./// 是HTML <center>內容<\center>  符合
let HTMLTag: String = "^<([a-z]+)([^<]+)*(?:>(.*)<\\/\\1>|\\s+\\/>)$"

9./// 日期(年-月-日)
let isDate1: String = "(\\d{4}|\\d{2})-((1[0-2])|(0?[1-9]))-(([12][0-9])|(3[01])|(0?[1-9]))"

10./// 日期(月/日/年)
let isDate2: String = "((1[0-2])|(0?[1-9]))/(([12][0-9])|(3[01])|(0?[1-9]))/(\\d{4}|\\d{2})"

11./// 時間(小時:分鐘, 24小時制)
let TimeFormat: String = "((1|0?)[0-9]|2[0-3]):([0-5][0-9])"

12./// 是漢字
let isChinese: String = "[\\u4e00-\\u9fa5]"

13./// 中文及全形標點符號(字元)
let ChineseParagraph: String = "[\\u3000-\\u301e\\ufe10-\\ufe19\\ufe30-\\ufe44\\ufe50-\\ufe6b\\uff01-\\uffee]"

14./// 中國大陸固定電話號碼
let fixedLineTelephone: String = "(\\d{4}-|\\d{3}-)?(\\d{8}|\\d{7})"

15./// 中國大陸身份證號(15位或18位)
let IdNum: String = "\\d{15}(\\d\\d[0-9xX])?"

16./// 手機號
let isIphoneNum: String = "1\\d{10}"

17./// 郵政編碼
let zipCode: String = "[1-9]\\d{5}"複製程式碼

##新增加一些方法的擴充套件。如: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.富文字的一些操作,工程中非常清楚的介紹了使用,這裡不做陳述了。

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

更新繼續,如果您覺得對你有幫助希望你給個 星星

直接訪問 GitHub 看程式碼的

相關文章