Swift常用的String类扩展

43 篇文章 0 订阅

常用的扩展

// 字符串类扩展
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.usesFontLeading, 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, options: opt, attributes: attr, 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
        }
    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值