Swift常用的String类扩展

前端之家收集整理的这篇文章主要介绍了Swift常用的String类扩展前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

常用的扩展

// 字符串类扩展
extension String {

    /// 获取字符串绘制的高度
    ///
    /// - parameter font : 要绘制的字体,将会影响行高等
    /// - parameter width : 绘制的宽度
    /// - returns : 字符串绘制的最大高度
    func getMaxHeight(font:UIFont,width:CGFloat) -> CGFloat {
        // 获取最大的
        let s = CGSize(width: width,height: CGFloat(MAXFLOAT))
        return getMaxHeight(font: font,rangeRect: s)
    }

    /// 获取字符串绘制的高度
    ///
    /// - parameter font : 要绘制的字体,将会影响行高等
    /// - parameter rangeRect : 绘制的最大范围,类似于最大的画布
    /// - returns : 字符串绘制的最大高度
    func getMaxHeight(font:UIFont,rangeRect rect:CGSize) -> CGFloat {
        // draw option
        let opt:NSStringDrawingOptions = [NSStringDrawingOptions.truncatesLastVisibleLine,NSStringDrawingOptions.usesFontLeading,NSStringDrawingOptions.usesLineFragmentOrigin]
        // str
        let str = NSString(string: self)
        // max size
        let maxSize = rect
        // font
        let attr:[String:Any] = [NSFontAttributeName:font]
        // 计算出来的范围
        let resultRect = str.boundingRect(with: maxSize,options: opt,attributes: attr,context: nil)
        // 返回高度
        return CGFloat(ceil(Double(resultRect.height)))
    }

    /** 获取字符串的单行宽度,有可能会超过屏幕限制 - parameter font : 要绘制的字体 */
    func getMaxWidth(font:UIFont) -> CGFloat {
        let opt:NSStringDrawingOptions = [NSStringDrawingOptions.truncatesLastVisibleLine,NSStringDrawingOptions.usesLineFragmentOrigin]
        // str
        let str = NSString(string: self)
        // max size
        let maxSize = CGSize(width: CGFloat(MAXFLOAT),height: CGFloat(MAXFLOAT))
        // font
        let attr:[String:Any] = [NSFontAttributeName:font]
        // 计算出来的范围
        let resultRect = str.boundingRect(with: maxSize,context: nil)
        // 返回高度
        return CGFloat(ceil(Double(resultRect.width)))
    }

    /** 去除左右的空格和换行符 */
    func trim() -> String {
        return self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
    }

    /** 将字符串通过特定的字符串拆分为字符串数组 - parameter str : 拆分数组使用的字符串 - returns : 字符串数组 */
    func split(string:String) -> [String] {
        return NSString(string: self).components(separatedBy: string)
    }

    /** 拆分字符串,并获取指定索引的字符串 - parameter splitStr : 拆分数组使用的字符串 - parameter index : 索引位置 - parameter defaultStr : 默认字符串 - returns : 拆分所得字符串 */
    func strSplitByIndex(splitStr str:String,index:Int,defaultStr:String = "") -> String {
        let a = self.split(string:str)
        if index > a.count - 1  {
            return defaultStr
        }
        return a[index]
    }

    /** 字符串替换 - parameter of : 被替换的字符串 - parameter with : 替换使用的字符串 - returns : 替换后的字符串 */
    func replace(of: String,with: String) -> String {
        return self.replacingOccurrences(of: of,with: with)
    }

    /** 判断是否包含,虽然系统提供了方法,这里也只是简单的封装。如果swift再次升级的话,就知道现在做的好处了 - parameter string : 是否包含的字符串 - returns : 是否包含 */
    func has(string:String) -> Bool {
        return self.contains(string)
    }

    /** 字符出现的位置 - parameter string : 字符串 - returns : 字符串出现的位置 */
    func indexOf(string str:String) -> Int {
        var i = -1
        if let r = range(of: str) {
            if !r.isEmpty {
                i = characters.distance(from: self.startIndex,to: r.lowerBound)
            }
        }
        return i
    }

    /** 这个太经典了,获取指定位置和大小的字符串 - parameter start : 起始位置 - parameter length : 长度 - returns : 字符串 */
    func subString(start:Int,length:Int = -1) -> String {
        var len = length
        if len == -1 {
            len = characters.count - start
        }
        let st = characters.index(self.startIndex,offsetBy:start)
        let en = characters.index(st,offsetBy:len)
        let range = st ..< en
        return self.substring(with:range)
    }

    /// 字符串的长度
    var length:Int {
        get {
            return self.characters.count
        }
    }

    /// 将16进制字符串转为Int
    var hexInt:Int {
        get {
            return Int(self,radix: 16) ?? 0
        }
    }

}

猜你在找的Swift相关文章