NSRange到范围<String.Index>我如何转换NSRange到Range<String.Index>在斯威夫特?我想使用以下方法UITextFieldDelegate方法: func textField(textField: UITextField!,
shouldChangeCharactersInRange range: NSRange,
replacementString string: String!) -> Bool {textField.text.stringByReplacingCharactersInRange(???, withString: string)
3 回答
四季花海
TA贡献1811条经验 获得超5个赞
Range<String.Index>
NSString
NSRange
let str = "a?b??c"let r1 = str.range(of: "??")!// String range to NSRange:let n1 = NSRange(r1, in: str)print((str as NSString). substring(with: n1)) // ??// NSRange back to String range:let r2 = Range(n1, in: str)!print(str[r2]) // ??
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if let oldString = textField.text { let newString = oldString.replacingCharacters(in: Range(range, in: oldString)!, with: string) // ... } // ...}
(SWIFT 3及更早版本的旧答案:)
String.Index
init?(_ utf16Index: UTF16Index, within characters: String)
NSRange
Range<String.Index>
NSString
:
extension String { func rangeFromNSRange(nsRange : NSRange) -> Range<String.Index>? { let from16 = advance(utf16.startIndex, nsRange.location, utf16.endIndex) let to16 = advance(from16, nsRange.length, utf16.endIndex) if let from = String.Index(from16, within: self), let to = String.Index(to16, within: self) { return from ..< to } return nil }}
NSRange
UITextFieldDelegate
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { if let swRange = textField.text.rangeFromNSRange(range) { let newString = textField.text.stringByReplacingCharactersInRange(swRange, withString: string) // ... } return true}
extension String { func NSRangeFromRange(range : Range<String.Index>) -> NSRange { let utf16view = self.utf16 let from = String.UTF16View.Index(range.startIndex, within: utf16view) let to = String.UTF16View.Index(range.endIndex, within: utf16view) return NSMakeRange(from - utf16view.startIndex, to - from) }}
let str = "a?b??c"let r1 = str.rangeOfString("??")!// String range to NSRange:let n1 = str.NSRangeFromRange(r1)println((str as NSString) .substringWithRange(n1)) // ??// NSRange back to String range:let r2 = str.rangeFromNSRange(n1)!println(str.substringWithRange(r2)) // ??
SWIFT 2更新:
rangeFromNSRange()
extension String { func rangeFromNSRange(nsRange : NSRange) -> Range<String.Index>? { let from16 = utf16.startIndex.advancedBy(nsRange.location, limit: utf16.endIndex) let to16 = from16.advancedBy(nsRange.length, limit: utf16.endIndex) if let from = String.Index(from16, within: self), let to = String.Index(to16, within: self) { return from ..< to } return nil }}
NSRangeFromRange()
extension String { func NSRangeFromRange(range : Range<String.Index>) -> NSRange { let utf16view = self.utf16 let from = String.UTF16View.Index(range.startIndex, within: utf16view) let to = String.UTF16View.Index(range.endIndex, within: utf16view) return NSMakeRange(utf16view.startIndex.distanceTo(from), from.distanceTo(to)) }}
SWIFT 3更新(Xcode 8):
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)) }}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(utf16.startIndex, offsetBy: nsRange.location + nsRange.length, limitedBy: utf16.endIndex), let from = from16.samePosition(in: self), let to = to16.samePosition(in: self) else { return nil } return from ..< to }}
let str = "a?b??c"let r1 = str.range(of: "??")!// String range to NSRange:let n1 = str.nsRange(from: r1)print((str as NSString) .substring(with: n1)) // ??// NSRange back to String range:let r2 = str.range(from: n1)!print(str.substring(with: r2)) // ??
- 3 回答
- 0 关注
- 1091 浏览
添加回答
举报
0/150
提交
取消