Range是无法通过 as? 强制转换到NSRange的。

强制转换会crash Thread 1: EXC_BREAKPOINT (code=1, subcode=0x1000b4488)

var mutableAttrStr = NSMutableAttributedString.init()

// range 不能用as? 强制转换

let substringRange = mutableAttrStr.string.range(of: friendModel.userName!)

friendModel.range = mutableAttrStr.string.nsRange(from: substringRange!)

//range转换为NSRange

//扩展的是String类,不可改为NSRange或者Range的扩展,因为samePosition,utf16是String里的

extension String {

func nsRange(from range: Range<String.Index>) -> NSRange {

let from = range.lowerBound.samePosition(in: utf16)

let to = range.upperBound.samePosition(in: utf16)

return NSRange(location: utf16.distance(from: utf16.startIndex, to: from),

length: utf16.distance(from: from, to: to))

}

}

//NSRange转化为range

//扩展的是String类,不可改为NSRange或者Range的扩展,因为utf16是String里的

extension String {

func range(from nsRange: NSRange) -> Range<String.Index>? {

guard

let from16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location, limitedBy: utf16.endIndex),

let to16 = utf16.index(from16, offsetBy: nsRange.length, limitedBy: utf16.endIndex),

let from = String.Index(from16, within: self),

let to = String.Index(to16, within: self)

else { return nil }

return from ..< to

}

}

[绍棠_Swift] swift4.0 NSMutableAttributeString的Range和NSRange问题相关推荐

  1. [绍棠_Swift] Swift3.0中guard语句的使用和理解

    和if一样,guard是基于一个表达式的布尔值去判断某些代码是否该被执行,和if不一样的地方是,guard只有在条件不满足(布尔值==false时)才会执行,类似反if.通过伪代码来直观的感受一下 首 ...

  2. [绍棠_Swift] SwiftyJSON的使用详解(附样例,用于JSON数据处理)

    1,SwiftyJSON介绍与配置 SwiftyJSON是个使用Swift语言编写的开源库,可以让我们很方便地处理JSON数据(解析数据.生成数据). GitHub地址:https://github. ...

  3. [绍棠_Swift] Swift中类和结构体的区别

    类和结构体有许多相同之处,也有许多不同之处. 二者区别如下: 1,类可以继承,结构体不可以 2,可以让一个类的实例来反初始化,释放存储空间,结构体做不到 3,类的对象是引用类型,而结构体是值类型.所以 ...

  4. 关于Swift4.0 Method Swizzling(iOS的hook机制)使用

    2019独角兽企业重金招聘Python工程师标准>>> 关于Method Swizzling 原理什么的有很多帖子讲述的已经很清楚这里不再赘述, 这里仅仅处理Method Swizz ...

  5. Swift4.0复习特性、编译标志和检查API的可用性

    1.Swift中的特性: @引出,后面紧跟特性名,圆括号带参数即可. @attribute(args) avaiable: 指明对象,函数,类型的可用性. @available(iOS 10.0, m ...

  6. swift4.0语法杂记(精简版)

    小视频 001--swift简史小视频 002--Playground体验 003--常量&变量 一.swift简史 1.介绍 swift是苹果公司于2014年推出用于撰写OS和iOS应用程序 ...

  7. swift4.0语法杂记

    原文地址:https://www.jianshu.com/p/06b9ddf748f7 (如有侵权,请联系我删除.) 小视频 001--swift简史小视频 002--Playground体验 003 ...

  8. Swift4.0判断本函数是否在其它类有相同的方法

    组件化开发模式化,为了减少AppDelegate.m做很多事情会做几个组件来分担它的功能,因此他们的函数名相同. Object C判断本函数是否在其它类有相同的方法很简单,通过_cmd就能很快判断出来 ...

  9. ios swift5 Range转NSRange

    extension String {/// range转换为NSRangefunc nsRange(from range: Range<String.Index>) -> NSRan ...

最新文章

  1. hive sql 报错后继续执行_Hive迁移Presto的技术实践
  2. 透彻理解Spring事务设计思想之手写实现
  3. 机器学习(二)Logistic回归(Logistic regression)算法
  4. NodeJS通过ffi调用DLL
  5. UNIX(进程间通信):03---僵尸进程
  6. Python中的三目运算符
  7. 190505每日一句
  8. Redis开发与运维教程
  9. 音频编辑软件有哪些?推荐几款简单的音频编辑软件
  10. python算术平方根_Python 平方根
  11. 记录阿里云增加二级域名步骤[同三级]
  12. Windwos cwRsync 服务端及客户端安装配置全攻略
  13. 电子邮件邮箱怎么设置签名?手机邮箱签名设置攻略
  14. 未来测试软件推荐,未来函数检测工具优化版(支持所有股软未来检测)
  15. Android--DES加密解密
  16. 电脑版适合什么插件HTML,推荐一些好用的Chrome插件
  17. js+css如何制作(音频)图标【切换播放动画】效果?
  18. Java中哈希集(HashSet)概念,实现以及操作
  19. ZipFile解压文件
  20. c oracle帮助文档下载,Oracle 19c 官方文档——Concepts

热门文章

  1. python word2vector训练wiki中文文本语料
  2. 人脸识别:1.DeepFace
  3. 随机密码生成(由26个字母大小写和9个数字组成的列表中随机生成10个8位密码)
  4. 大学计算机基础算什么水平,大学计算机基础(含实验)
  5. 为什么越来越多年轻人,想去或者留在成都?
  6. SV验证-3Scoreboard
  7. Mac 如何远程连接公司内网
  8. IT行业找工作容易吗?
  9. 毕业设计-基于微信小程序的医疗设备在线培训系统
  10. python提取peer地震波并进行归一化