# Swift开发-Swift项目中常用到扩展(Extension)-实用篇

前言:

Swift开发中经常会要自定义部分函数方便自己几种精力开发项目核心代码,减少重复的冗余的代码书写,这便是我常用到的扩展例如:字符串长度 加密等等,方便大家拿来即用!
因为我本身使用的扩展并不是很多也没有写很多这里离为大家提供一个第三方的扩展库EZSwiftExtensions
如果您觉得对您有用请帮我点个赞👍

1.自定义Log

public func DDLog<T>(_ messsage : T, file : String = #file, funcName : String = #function, lineNum : Int = #line) {
    
    #if DEBUG
        
        let fileName = (file as NSString).lastPathComponent
        
        print("\n\(fileName):(\(lineNum))-\(messsage)")
        
    #endif
}

2.String

// MARK:- length
    var length: Int {
        return self.lengthOfBytes(using: .utf8)
    }
    
    var count: Int {
        return self.characters.count
    }
    
    // MARK:- md5
    var md5: String {
        let str = self.cString(using: String.Encoding.utf8)
        let strLen = CUnsignedInt(self.lengthOfBytes(using: String.Encoding.utf8))
        let digestLen = Int(CC_MD5_DIGEST_LENGTH)
        let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
        CC_MD5(str!, strLen, result)
        let hash = NSMutableString()
        for i in 0 ..< digestLen {
            hash.appendFormat("%02x", result[i])
        }
        result.deinitialize()
        return String(format: hash as String)
    }
    
    // MARK:- json转字典
    var toDict: [String: Any?]? {
        
        var json = self
        
        if json.contains("\\") {
            json = json.components(separatedBy: "\\").joined()
        }
        
        if let data = json.data(using: .utf8) {
            do {
                let array = try JSONSerialization.jsonObject(with: data, options: [JSONSerialization.ReadingOptions.init(rawValue: 0)]) as? Array<[String: Any]>
                
                guard let dict = array?.first else {
                    return nil
                }
                return dict
            } catch let error {
                DDLog(error)
            }
        }
        return nil
    }
    
    // MARK:- json转数组
    var toArray: [[String: Any]]? {
        
        var json = self
        
        if json.contains("\\") {
            json = json.components(separatedBy: "\\").joined()
        }

        if let data = json.data(using: .utf8) {
            do {
                let array = try JSONSerialization.jsonObject(with: data, options: [JSONSerialization.ReadingOptions.init(rawValue: 0)]) as? [[String: Any]]
                
                return array
            } catch let error {
                DDLog(error)
            }
        }
        return nil
    }
    
    // MARK:- 获取字符串高度
    func getHeigh(font: CGFloat, width: CGFloat) -> CGFloat {
        
        let statusLabelText: String = self
        let size = CGSize(width: width, height: 900)
        let dic = NSDictionary(object: UIFont.systemFont(ofSize: font), forKey: NSFontAttributeName as NSCopying)
        let strSize = statusLabelText.boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: dic as? [String : AnyObject], context:nil).size
        
        return strSize.height
        
    }
    // MARK:- 获取字符串宽度
    func getWidth(font: CGFloat, height: CGFloat) -> CGFloat {
        
        let statusLabelText: String = self
        let size = CGSize(width: 900, height: height)
        let dic = NSDictionary(object: UIFont.systemFont(ofSize: font), forKey: NSFontAttributeName as NSCopying)
        let strSize = statusLabelText.boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: dic as? [String : AnyObject], context:nil).size
        
        return strSize.width
        
    }

3.Date

// MARK:- 获取当前时间
    static func currentDate(format: String) -> String {
        
        let currentdate = Date()
        let dateformatter = DateFormatter()
        dateformatter.dateFormat = format
        
        let customDate = dateformatter.string(from: currentdate)
        
        return customDate
    }
    
    static func date(dateStr: String) -> Date {
        
        let dateformatter = DateFormatter()
        dateformatter.dateFormat = "YYYY-MM-dd HH:mm:ss"
        
        guard let newDate = dateformatter.date(from: dateStr) else {
            return Date()
        }
        
        return newDate
    }
    
    static func date(num: Int, format: String) -> String {
        
        let timeInterval:TimeInterval = TimeInterval(num / 1000)
        let date = Date(timeIntervalSince1970: timeInterval)
        let dateformatter = DateFormatter()
        dateformatter.dateFormat = format
        
        return dateformatter.string(from: date)
    }

4.Color

// MARK:- 16进制颜色
    static func colorWithHex(hex: String) -> UIColor {
        
        var cString = hex.trimmingCharacters(in:CharacterSet.whitespacesAndNewlines).uppercased()
        
        if (cString.hasPrefix("#")) {
            let index = cString.index(cString.startIndex, offsetBy:1)
            cString = cString.substring(from: index)
        }
        
        if (cString.characters.count != 6) {
            return UIColor.red
        }
        
        let rIndex = cString.index(cString.startIndex, offsetBy: 2)
        let rString = cString.substring(to: rIndex)
        let otherString = cString.substring(from: rIndex)
        let gIndex = otherString.index(otherString.startIndex, offsetBy: 2)
        let gString = otherString.substring(to: gIndex)
        let bIndex = cString.index(cString.endIndex, offsetBy: -2)
        let bString = cString.substring(from: bIndex)
        
        var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0;
        Scanner(string: rString).scanHexInt32(&r)
        Scanner(string: gString).scanHexInt32(&g)
        Scanner(string: bString).scanHexInt32(&b)
        
        return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: CGFloat(1))
    }

5.Dictionary

// MARK:- 字典转json
    var toJson: String {
        if (!JSONSerialization.isValidJSONObject(self)) {
            print("无法解析出JSONString")
            return ""
        }
        let data : NSData! = try? JSONSerialization.data(withJSONObject: self, options: []) as NSData!
        let JSONString = NSString(data:data as Data,encoding: String.Encoding.utf8.rawValue)
        return JSONString! as String
    }

6.Array

// MARK:- 数组转json
    var toJson: String {
        if (!JSONSerialization.isValidJSONObject(self)) {
            print("无法解析出JSONString")
            return ""
        }
        let data : NSData! = try? JSONSerialization.data(withJSONObject: self, options: []) as NSData!
        let JSONString = NSString(data:data as Data,encoding: String.Encoding.utf8.rawValue)
        return JSONString! as String
    }

7.AppInfo

    static let infoDictionary = Bundle.main.infoDictionary
    //App 名称
    static let appDisplayName: String = Bundle.main.infoDictionary!["CFBundleDisplayName"] as! String
    // Bundle Identifier
    static let bundleIdentifier:String = Bundle.main.bundleIdentifier!
    // App 版本号
    static let appVersion:String = Bundle.main.infoDictionary! ["CFBundleShortVersionString"] as! String
    //Bulid 版本号
    static let buildVersion : String = Bundle.main.infoDictionary! ["CFBundleVersion"] as! String
    //ios 版本
    static let iOSVersion: String = UIDevice.current.systemVersion
    //设备 udid
    static let identifierNumber = UIDevice.current.identifierForVendor!.uuidString
    //设备名称
    static let systemName = UIDevice.current.systemName
    // 设备型号
    static let model = UIDevice.current.model
    //设备区域化型号
    static let localizedModel = UIDevice.current.localizedModel

8.常用的正则

import Foundation

enum Validate {
    case email(_: String)       // 邮箱
    case phoneNum(_: String)    // 手机
    case carNum(_: String)      // 车牌号
    case username(_: String)    // 登录名
    case password(_: String)    // 密码
    case nickname(_: String)    // 昵称
    case URL(_: String)         // 网址
    case IP(_: String)          // ip
    case idCard(_: String)      // 身份证号
    case numbers(_: String)     // 只包含数字
    case lettersAndNumbers(_: String) // 只包含字母和数字
    case chinese(_: String)     // 中文
    
    var isRight: Bool {
        var predicateStr:String!
        var currObject:String!
        switch self {
        case let .email(str):
            predicateStr = "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$"
            currObject = str
        case let .phoneNum(str):
            predicateStr = "^1(3[4-9]|4[7]|5[0-27-9]|7[08]|8[2-478])\\d{8}$"            currObject = str
        case let .carNum(str):
            predicateStr = "^[A-Za-z]{1}[A-Za-z_0-9]{5}$"
            currObject = str
        case let .username(str):
            predicateStr = "^[A-Za-z0-9]{6,20}+$"
            currObject = str
        case let .password(str):
            predicateStr = "^[a-zA-Z0-9]{6,12}+$"
            currObject = str
        case let .nickname(str):
            predicateStr = "^[\\u4e00-\\u9fa5]{4,8}$"
            currObject = str
        case let .URL(str):
            predicateStr = "^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$"
            currObject = str
        case let .IP(str):
            predicateStr = "^(?:(?: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]?)$"
            currObject = str
        case let .idCard(str):
            predicateStr = "(^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}$)"
            currObject = str
        case let .numbers(str):
            predicateStr = "^[0-9]+$"
            currObject = str
        case let .lettersAndNumbers(str):
            predicateStr = "^[a-zA-Z0-9]{1,30}+$"
            currObject = str
        case let .chinese(str):
            predicateStr = "^[\\u4e00-\\u9fa5]{0,100}$"
            currObject = str
        }
        
        let predicate =  NSPredicate(format: "SELF MATCHES %@" ,predicateStr)
        return predicate.evaluate(with: currObject)
    }
}

9.其他常用

// block
typealias CommonBlock = (_ result: Any?) -> ()

// 屏幕宽高
let kWidth = UIScreen.main.bounds.width
let kHeight = UIScreen.main.bounds.height
// AppDelegate
let RootAppdelegate = (UIApplication.shared.delegate) as! AppDelegate

// 比例计算
func Scale(num: Int) -> CGFloat {
    return UIScreen.main.bounds.width / 375.0 * CGFloat(num)
}

// 设置字体(也可以在这里适配字体)
func font(size: CGFloat) -> UIFont {
    return UIFont.systemFont(ofSize: size)
}
// 设置16进制颜色
func color(hex: String) -> UIColor {
    return UIColor.colorWithHex(hex: hex)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容