【Tips】Range & NSRange

前言

做个记录,比较下两者。

开始

NSRange OC中用来表示范围的,笔者第一次接触到是在截取字符串中:

 let nsStr: NSString = "com.longjianjiang"
 let nsNameRange = nsStr.range(of: "com")

上述结果为{0, 3}, 0为截取字符串的位置,3为截取字符串的长度,信息很直观;

但是笔者接触到Swift后,第一次使用的Swift中的Range要算是for循环中:

for i in 0..<5 {
     print(i)
 }

而且Swift中把很多之前OC中用NSRange来表示范围的都替换成了新的Range类型,比如同样的字符串截取:

 let str = "com😂.longjianjiang"
 let nameRange = str.range(of: "com😂")

上述结果为Index(offset: 0)..<Index(offset: 20), 是一个开区间,上述offset指的的是作为Unicode的字符偏移;

用NSRange来进行截取字符串时,如果字符串中含有emoji,此时就会少截,因为emoji比普通字符多占一个

        let myNSRange = NSRange(location: 3, length: 3)
        
        let myNSString: NSString = "longjianjiang"
        print(myNSString.substring(with: myNSRange)) // "gji"
        
        let myNSString2: NSString = "com😂.longjianjiang"
        print(myNSString2.substring(with: myNSRange)) // "😂."  少了 l 

Swift4中的String类的subString方法标记为过时,建议使用切片下标, 看来很推荐使用Range类型

但是在处理富文本的时候,方法中的范围参数依然是之前的NSRange(不知道未来会不会也替换为Range)所以这时就涉及了如何两个不同范围类型的转换,不过很简单,系统有提供方法;

  let nsRange = NSRange(nameRange!, in: str) // str 为nameRange所在的字符串
  let range = Range.init(nsRange)

对比两者,其实我们可以发现新的Range类型所表达的东西比NSRange更多,用途也更加广泛,不仅仅可以表示范围,而且也可以用在循环中,所以这就引出了Range的不同类型:

其实根据上述我们知道不同Range有两种类型,开闭区间的Range、是否可迭代的Range,组合一下就是四种。可迭代的Range的元素得遵守Strideable协议,该协议说明元素是连续的同时支持偏移计算,该协议继承自Comparable,而且默认的Range的元素就得遵守Comparable协议。

最后

有待补充

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift 介绍 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 ...
    大L君阅读 8,536评论 3 25
  • OC中的类分为可变和不可变。下表列出了Foundation框架中主要的可变类和不可变类: 种类 不可变类 可变类 ...
    陈_振阅读 3,561评论 0 0
  • 他很老实,他很勤快,他很热心肠…… 2017年那是一个寒冷的夜晚,凉风习习刚下完自修躺上床玩了一会手机,心头一热点...
    Summercharm阅读 3,287评论 1 2
  • 说起龙虾又想起以前,在多年以前去南京住过一小段时间,那儿的龙虾可真多,门前的渠道里有龙虾游来游去,朋友问我想不想吃...
    太阳笑眯眯阅读 4,472评论 18 35
  • 普天之下的爱情,大概都一个模样: “刚开始时是甜蜜的糖罐,一头深扎欲罢不能;结束时往往令人痛不欲生,眷恋不舍。” ...
    不辞而别的秋天阅读 6,684评论 3 6