概述

Objective-CSwift 这两种编程言语中,字符串处理是十分常见的任务。而在字符串处理中,常常需求涉及到字符串的截取、查找等操作,这就需求用到 NSRange 和 Range 两个类

NSRange 是Objective-C中用来表明字符串规模的结构体,被界说在 Foundation 结构中。而在 Swift 中,Range 取代了 NSRange,且 Range 是一个泛型结构体,允许在不同类型的调集中表明规模。下面我们来详细介绍 NSRange 和 Range 的概念、运用方法以及它们之间的转化方法

NSRange

NSRange是Foundation结构中的一个结构体, 因此在 Objective-C 中运用时需求导入 Foundation 结构。它主要用来表明字符串的规模,由一个 location 特点表明开始方位,一个 length 特点表明长度。在 Objective-C 中,通常能够用 NSRange 来指定需求截取的字符串的规模

NSString *str = @"hello world";
NSRange range = NSMakeRange(2, 5); // location = 2, length = 5
NSString *subStr = [str substringWithRange:range];
NSLog(@"%@", subStr); // 输出 "llo w"

Range

Range 是一个泛型结构体,用于表明调集中的规模,包括数组、字符串和字典等。在 Swift 中,我们能够经过 Range 来指定需求截取的字符串的规模

let str = "hello, world"
let range = str.index(str.startIndex, offsetBy: 2)..<str.index(str.startIndex, offsetBy: 7)
let result = str[range]
print(result) // 输出 "llo, "

在 Swift 中,运用 Range 时需求指定规模的开始方位和完毕方位,能够运用调集的 startIndex 和 endIndex 特点来指定。此外,Range 还可所以半开区间方法的,即指定规模的左面是闭合的,右边是开放的

NSRange 和 Range 的区别

NSRange 和 Range 都是用来表明字符串或调集中的规模的类型,可是它们之间有以下几个区别:

  • NSRange 是一个结构体,而 Range 是一个泛型结构体
  • NSRange 的 location 和 length 特点都是整数类型的,而 Range 的开始方位和完毕方位可所以任何类型
  • NSRange 是包括完毕方位的(即 length 表明字符个数),而 Range 是不包括完毕方位的(即 endIndex 表明最终一个字符的下一个方位)
  • Swift 中的 Range 支持半开区间和双闭区间方法,而 NSRange 只支持双闭区间

NSRange 和 Range 转化

由于 NSRange 是 Objective-C 中的类型,而 Range 是 Swift 中的类型,因此在进行数据交换时需求进行类型转化。在 Objective-C 中,能够运用NSString的rangeOfString: 和 substringWithRange: 办法来获取字符串的 NSRange,而在 Swift 中能够运用 range(of:) 办法获取 Range,然后经过 NSRange(location:length:) 初始化器进行转化

// Swift --> Objective-C
let str = "hello, world"
if let range = str.range(of: "llo") {
    let nsRange = NSRange(range, in: str)
}
// Objective-C --> Swift
NSString *str = @"hello world";
NSRange range = [str rangeOfString:@"o w"];
let swiftRange = Range(range, in: str)

需求留意的是,在转化时需求考虑到字符串的编码方法,由于 C 言语中运用的是 UTF-8 编码,而在 Objective-C 中运用的是 UTF-16 编码

总结

综上所述,NSRange 和 Range 都是十分有用的类型,用来表明字符串中的规模,但它们之间存在一些区别。在进行类型转化时需求留意对字符串的编码方法进行转化,以确保转化的准确性。