Swift 使用NSRange 查找字符多次出现的位置处理
发布日期:2021-06-28 22:55:06
浏览次数:2
分类:技术文章
本文共 3452 字,大约阅读时间需要 11 分钟。
NSRange是个使用频率比较高的对象,尤其是在设置富文本(AttributedString)的地方。自带的 rangeOfString 就可以查找某字符所在字符串中的位置。但如果要获取多次出现的位置信息就需要另辟蹊径了。如下代码实现了,获取多次出现的位置信息的方法,参考如下:
/// 获取字符出现的位置信息(支持多次位置获取) /// - Parameter string: 原始文本 /// - Parameter inString: 需要查找的字符 private func rangeOfString(string:NSString, andInString inString:String) -> [NSRange] { var arrRange = [NSRange]() var _fullText = string var rang:NSRange = _fullText.range(of: inString) while rang.location != NSNotFound { var location:Int = 0 if arrRange.count > 0 { if arrRange.last!.location + arrRange.last!.length < string.length { location = arrRange.last!.location + arrRange.last!.length } } _fullText = NSString.init(string: _fullText.substring(from: rang.location + rang.length)) if arrRange.count > 0 { rang.location += location } arrRange.append(rang) rang = _fullText.range(of: inString) } return arrRange }
Swift 中本身有 Range 对象,由于对其使用方法和特性不甚了解,故使用NSRange 对象。
引申一下,批量设置AttributedString,就需要使用到如上代码,具体参考代码如下:
/// 批量设置富文本 /// - Parameter textFont: 默认文本 /// - Parameter textColor: 默认文本颜色 /// - Parameter changeTexts: 需要改变的文本 /// - Parameter changFonts: 需要改变的字体 /// - Parameter changeColors: 需要改变的颜色 /// - Parameter isLineThrough: 是否下划线 func setAttributeStringTexts(FullTextFont textFont:UIFont, andFullTextColor textColor:UIColor, withChangeTexts changeTexts:[String], withChangeFonts changFonts:[UIFont], withChangeColors changeColors:[UIColor], isLineThrough:Bool = false) -> NSAttributedString{ let strFullText:String = self var range:NSRange? var dicAttr:[NSAttributedString.Key:Any]? let attributeString = NSMutableAttributedString.init(string: strFullText) //不需要改变的文本 range = NSString.init(string: strFullText).range(of: String.init(strFullText)) dicAttr = [ NSAttributedString.Key.font:textFont, NSAttributedString.Key.foregroundColor:textColor, ] attributeString.addAttributes(dicAttr!, range: range!) //需要改变的文本 var index:Int = 0 for item in changeTexts { //range = NSString.init(string: strFullText).range(of: item) let ranges = self.rangeOfString(string: NSString.init(string: strFullText), andInString: item) for range in ranges { dicAttr = [ NSAttributedString.Key.font:changFonts.count > index ? changFonts[index] : changFonts.first as Any, NSAttributedString.Key.foregroundColor:changeColors.count > index ? changeColors[index] : changeColors.first as Any, ] if isLineThrough { dicAttr?[NSAttributedString.Key.strikethroughStyle] = NSNumber.init(value: 1) } if range.location + range.length <= fullString.length { attributeString.addAttributes(dicAttr!, range: range) } } index += 1 } return attributeString }
以上代码使用效果详见如下图片:
转载地址:https://blog.csdn.net/yimiyuangguang/article/details/102498828 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月24日 05时49分08秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
微信小程序--拿到时间戳 转换 并绑定
2019-04-29
关于转换十位时间戳出现1970的问题
2019-04-29
【vue系列】在Vue项目中使用Sass-----(scss)安装详解,新手跟着做即可
2019-04-29
前端-给大家一个超级好用简单方便的图片压缩工具(网页在线)~
2019-04-29
前端html实现删除线的两种方法(下划线)css样式总结
2019-04-29
js根据ID获取输入框的值
2019-04-29
初学wx小程序在vscode上装什么插件
2019-04-29
(split盲点)javascript如何判断字符串中某个特定字符的个数
2019-04-29
axios请求头踩坑日记之-application/json
2019-04-29
vue-封装axios的GET请求
2019-04-29
javascript获取当前时间时间戳的几种方法
2019-04-29
微信小程序App()的作用与getApp()方法
2019-04-29
快速新建新建Vue项目(详细)
2019-04-29
vue项目启动自动开启浏览器
2019-04-29
Vue中 @表示的路径
2019-04-29
Vue实现简单路由跳转
2019-04-29
Vue(定时器)中mounted不能获取到data中的数据解决方法
2019-04-29
vue在mounted中创建定时器与清除定时器
2019-04-29
在Vue中引入全局css(Global CSS in Vue)
2019-04-29
Vue中的data为什么要用return(Vue获取不到数据?)
2019-04-29