NSRange到范围<String.Index>

NSRange到范围<String.Index>

我如何转换NSRangeRange<String.Index>在斯威夫特?

我想使用以下方法UITextFieldDelegate方法:

    func textField(textField: UITextField!,
        shouldChangeCharactersInRange range: NSRange,
        replacementString string: String!) -> Bool {textField.text.stringByReplacingCharactersInRange(???, withString: string)


茅侃侃
浏览 1047回答 3
3回答

四季花海

截至SWIFT 4(Xcode 9),SWIFT标准库提供了在SWIFT字符串范围之间进行转换的方法(Range<String.Index>)和NSString范围(NSRange)。例子:let&nbsp;str&nbsp;=&nbsp;"a?b??c"let&nbsp;r1&nbsp;=&nbsp;str.range(of:&nbsp;"??")!//&nbsp;String&nbsp;range&nbsp;to&nbsp;NSRange:let&nbsp;n1&nbsp;=&nbsp;NSRange(r1,&nbsp;in:&nbsp;str)print((str&nbsp;as&nbsp;NSString). substring(with:&nbsp;n1))&nbsp;//&nbsp;??//&nbsp;NSRange&nbsp;back&nbsp;to&nbsp;String&nbsp;range:let&nbsp;r2&nbsp;=&nbsp;Range(n1,&nbsp;in:&nbsp;str)!print(str[r2])&nbsp;//&nbsp;??因此,文本字段委托方法中的文本替换现在可以作为func&nbsp;textField(_&nbsp;textField:&nbsp;UITextField, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shouldChangeCharactersIn&nbsp;range:&nbsp;NSRange, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replacementString&nbsp;string:&nbsp;String)&nbsp;->&nbsp;Bool&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;oldString&nbsp;=&nbsp;textField.text&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;newString&nbsp;=&nbsp;oldString.replacingCharacters(in:&nbsp;Range(range,&nbsp;in:&nbsp;oldString)!, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with:&nbsp;string) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...}(SWIFT 3及更早版本的旧答案:)斯威夫特1.2,String.Index有一个初始化器init?(_&nbsp;utf16Index:&nbsp;UTF16Index,&nbsp;within&nbsp;characters:&nbsp;String)可以用来转换NSRange到Range<String.Index>正确(包括所有表情符号、区域指示符或其他扩展的图形素集群),而不中间转换为NSString:extension&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;rangeFromNSRange(nsRange&nbsp;:&nbsp;NSRange)&nbsp;->&nbsp;Range<String.Index>?&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;from16&nbsp;=&nbsp;advance(utf16.startIndex,&nbsp;nsRange.location,&nbsp;utf16.endIndex) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;to16&nbsp;=&nbsp;advance(from16,&nbsp;nsRange.length,&nbsp;utf16.endIndex) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;from&nbsp;=&nbsp;String.Index(from16,&nbsp;within:&nbsp;self), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;to&nbsp;=&nbsp;String.Index(to16,&nbsp;within:&nbsp;self)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;from&nbsp;..<&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nil &nbsp;&nbsp;&nbsp;&nbsp;}}此方法返回任选字符串范围,因为不是所有NSRangeS对给定的SWIFT字符串有效。这个UITextFieldDelegate然后,可以将委托方法编写为func&nbsp;textField(textField:&nbsp;UITextField,&nbsp;shouldChangeCharactersInRange&nbsp;range:&nbsp;NSRange,&nbsp;replacementString&nbsp;string:&nbsp;String)&nbsp;->&nbsp;Bool&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;swRange&nbsp;=&nbsp;textField.text.rangeFromNSRange(range)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;newString&nbsp;=&nbsp;textField.text.stringByReplacingCharactersInRange(swRange,&nbsp;withString:&nbsp;string) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true}逆变换是extension&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;NSRangeFromRange(range&nbsp;:&nbsp;Range<String.Index>)&nbsp;->&nbsp;NSRange&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;utf16view&nbsp;=&nbsp;self.utf16 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;from&nbsp;=&nbsp;String.UTF16View.Index(range.startIndex,&nbsp;within:&nbsp;utf16view)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;to&nbsp;=&nbsp;String.UTF16View.Index(range.endIndex,&nbsp;within:&nbsp;utf16view) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NSMakeRange(from&nbsp;-&nbsp;utf16view.startIndex,&nbsp;to&nbsp;-&nbsp;from) &nbsp;&nbsp;&nbsp;&nbsp;}}一个简单的测试:let&nbsp;str&nbsp;=&nbsp;"a?b??c"let&nbsp;r1&nbsp;=&nbsp;str.rangeOfString("??")!//&nbsp;String&nbsp;range&nbsp;to&nbsp;NSRange:let&nbsp;n1&nbsp;=&nbsp;str.NSRangeFromRange(r1)println((str&nbsp;as&nbsp;NSString) .substringWithRange(n1))&nbsp;//&nbsp;??//&nbsp;NSRange&nbsp;back&nbsp;to&nbsp;String&nbsp;range:let&nbsp;r2&nbsp;=&nbsp;str.rangeFromNSRange(n1)!println(str.substringWithRange(r2))&nbsp;//&nbsp;??SWIFT 2更新:SWIFT 2版rangeFromNSRange()已经由Serhii Yakovenko在这个答案,我把它包括在这里是为了完整:extension&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;rangeFromNSRange(nsRange&nbsp;:&nbsp;NSRange)&nbsp;->&nbsp;Range<String.Index>?&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;from16&nbsp;=&nbsp;utf16.startIndex.advancedBy(nsRange.location,&nbsp;limit:&nbsp;utf16.endIndex) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;to16&nbsp;=&nbsp;from16.advancedBy(nsRange.length,&nbsp;limit:&nbsp;utf16.endIndex) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;from&nbsp;=&nbsp;String.Index(from16,&nbsp;within:&nbsp;self), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;to&nbsp;=&nbsp;String.Index(to16,&nbsp;within:&nbsp;self)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;from&nbsp;..<&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nil &nbsp;&nbsp;&nbsp;&nbsp;}}SWIFT 2版NSRangeFromRange()是extension&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;NSRangeFromRange(range&nbsp;:&nbsp;Range<String.Index>)&nbsp;->&nbsp;NSRange&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;utf16view&nbsp;=&nbsp;self.utf16 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;from&nbsp;=&nbsp;String.UTF16View.Index(range.startIndex,&nbsp;within:&nbsp;utf16view) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;to&nbsp;=&nbsp;String.UTF16View.Index(range.endIndex,&nbsp;within:&nbsp;utf16view) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NSMakeRange(utf16view.startIndex.distanceTo(from),&nbsp;from.distanceTo(to)) &nbsp;&nbsp;&nbsp;&nbsp;}}SWIFT 3更新(Xcode 8):extension&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;nsRange(from&nbsp;range:&nbsp;Range<String.Index>)&nbsp;->&nbsp;NSRange&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;from&nbsp;=&nbsp;range.lowerBound.samePosition(in:&nbsp;utf16) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;to&nbsp;=&nbsp;range.upperBound.samePosition(in:&nbsp;utf16) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NSRange(location:&nbsp;utf16.distance(from:&nbsp;utf16.startIndex,&nbsp;to:&nbsp;from), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length:&nbsp;utf16.distance(from:&nbsp;from,&nbsp;to:&nbsp;to)) &nbsp;&nbsp;&nbsp;&nbsp;}}extension&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;range(from&nbsp;nsRange:&nbsp;NSRange)&nbsp;->&nbsp;Range<String.Index>?&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;guard &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;from16&nbsp;=&nbsp;utf16.index(utf16.startIndex,&nbsp;offsetBy:&nbsp;nsRange.location,&nbsp;limitedBy:&nbsp;utf16.endIndex), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;to16&nbsp;=&nbsp;utf16.index(utf16.startIndex,&nbsp;offsetBy:&nbsp;nsRange.location&nbsp;+&nbsp;nsRange.length,&nbsp;limitedBy:&nbsp;utf16.endIndex), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;from&nbsp;=&nbsp;from16.samePosition(in:&nbsp;self), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;to&nbsp;=&nbsp;to16.samePosition(in:&nbsp;self) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{&nbsp;return&nbsp;nil&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;from&nbsp;..<&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;}}例子:let&nbsp;str&nbsp;=&nbsp;"a?b??c"let&nbsp;r1&nbsp;=&nbsp;str.range(of:&nbsp;"??")!//&nbsp;String&nbsp;range&nbsp;to&nbsp;NSRange:let&nbsp;n1&nbsp;=&nbsp;str.nsRange(from:&nbsp;r1)print((str&nbsp;as&nbsp;NSString) .substring(with:&nbsp;n1))&nbsp;//&nbsp;??//&nbsp;NSRange&nbsp;back&nbsp;to&nbsp;String&nbsp;range:let&nbsp;r2&nbsp;=&nbsp;str.range(from:&nbsp;n1)!print(str.substring(with:&nbsp;r2))&nbsp;//&nbsp;??
打开App,查看更多内容
随时随地看视频慕课网APP