Swift 4中range返回类型选Range还是NSRange?代码报错求解
Swift 4中Range与NSRange的转换问题解答
嘿,我来帮你搞定这个问题~
首先明确一点:你不能直接把Swift原生的Range<String.Index>类型传入需要NSRange的参数里,这俩是完全不同的类型,必须显式转换才行。
为什么必须转换?
Swift的Range<String.Index>是基于字符串的Unicode字符/标量索引设计的,它跟踪的是字符串中每个字符的实际位置(比如处理emoji或者多字节字符时,索引不会乱);而NSRange是Objective-C时代的产物,它基于UTF-16编码的字节偏移量来表示范围。两者的底层逻辑完全不一样,所以不能直接混用。
你的代码问题分析
你写的转换逻辑其实是对的——用NSRange(range, in: self)来把Swift的Range转成NSRange,但报错可能是因为以下原因:
- 你的方法没有定义在
String的扩展里,导致self不是String类型,NSRange(_:in:)初始化器要求第二个参数必须是String; - 可能存在拼写错误或者类型不匹配的小问题。
修正后的代码
把方法放在String扩展里,确保上下文正确:
extension String { func caseInsensitiveSearch(searchString: String) -> NSRange? { guard let swiftRange = self.range(of: searchString, options: .caseInsensitive) else { return nil } return NSRange(swiftRange, in: self) } }
这样就能正常把Swift的Range转换成NSRange并返回了。
内容的提问来源于stack exchange,提问作者Priyanka Wadher Mistry
相关产品推荐
相关产品推荐

