1. 程式人生 > >Swift String通過下標獲取子串、計算字串的寬高、16進位制轉10進位制、String轉換為AttributedString、使用正則驗證合法性

Swift String通過下標獲取子串、計算字串的寬高、16進位制轉10進位制、String轉換為AttributedString、使用正則驗證合法性

String通過下標獲取子串

extension String {
    func index(_ offset: Int) -> Index {
        return self.index(startIndex, offsetBy: offset)
    }
    func substring(from: Int) -> String {
        let fromIndex = index(from)
        return String(self[fromIndex...])
    }
    func substring(to: Int) -> String {
        let toIndex = index(to)
        return String(self[..<toIndex])
    }
    func substring(start: Int, end: Int) -> String {
        let startIndex = index(start)
        let endIndex = index(end)
        return String(self[startIndex..<endIndex])
    }
}

計算字串的寬高
16進位制轉10進位制
String轉換為AttributedString

import Foundation

extension String {
    
    public func calcuateLabSizeWidth(font: UIFont, maxHeight: CGFloat) -> CGFloat {
        let attributes = [kCTFontAttributeName: font]
        let norStr = NSString(string: self)
        let size = norStr.boundingRect(with: CGSize(width: CGFloat(MAXFLOAT), height: maxHeight), options: .usesLineFragmentOrigin, attributes: attributes as [NSAttributedStringKey : Any], context: nil)
        return size.width
    }
    
    public func calcuateLabSizeHeight(font: UIFont, maxWidth: CGFloat) -> CGFloat {
        let attributes = [kCTFontAttributeName: font]
        let norStr = NSString(string: self)
        let size = norStr.boundingRect(with: CGSize(width: maxWidth, height: CGFloat(MAXFLOAT)), options: .usesLineFragmentOrigin, attributes: attributes as [NSAttributedStringKey : Any], context: nil)
        return size.height
    }

    public func transform16To10() -> Int {
        var num = self
        if num.hasPrefix("0x") || num.hasPrefix("0X") {
            num.remove(at: num.index(from: 1))
        }
        let str = num.uppercased()
        var sum = 0
        for i in str.utf8 {
            sum = sum * 16 + Int(i) - 48
            if i >= 65 {
                sum -= 7
            }
        }
        return sum
    }
    
    public func toAttributedString(color: UIColor = .white) -> NSMutableAttributedString {
        let str = NSMutableAttributedString(string: self)
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 5
        let dic: Dictionary<NSAttributedStringKey, Any> = [NSAttributedStringKey.foregroundColor: color,
                                 NSAttributedStringKey.paragraphStyle: paragraphStyle];
        str.setAttributes(dic, range: NSMakeRange(0, self.count))
        return str
    }

}

使用正則驗證字串的合法性(也可以定義成屬性的形式)

extension String {
    func isLegalNickName() -> Bool {
        let pattern = "^[A-Za-z][A-Za-z0-9]*$"
        return NSPredicate(format: "SELF MATCHES %@", pattern).evaluate(with: self)
    }
    func isPasswordString() -> Bool {
        let pattern = "^[0-9]*$"
        return NSPredicate(format: "SELF MATCHES %@", pattern).evaluate(with: self)
    }
    func isNumberString() -> Bool {
        let pattern = "^[0-9.]*$"
        return NSPredicate(format: "SELF MATCHES %@", pattern).evaluate(with: self)
    }
}

URL引數解析

extension String {
    func containsParam(key: String) -> Bool {
        return getUrlStringParam(paramKey: key) == "" ? false : true
    }
    private func getUrlStringParam(paramKey: String) -> String {
        guard let params = self.components(separatedBy: "?").last else {
            return ""
        }
        var paramValue = ""
        params.components(separatedBy: "&").forEach { (para) in
            if let key = para.components(separatedBy: "=").first,
                let value = para.components(separatedBy: "=").last,
                key == paramKey {
                paramValue = value
            }
        }
        return paramValue
    }
}