范围功能和崩溃在Swift 3中



我的下面代码崩溃:

func getrange(_ from: Int, length: Int) -> Range<String.Index>? {
    guard let fromU16 = utf16.index(utf16.startIndex, offsetBy: from, limitedBy: utf16.endIndex), fromU16 != utf16.endIndex else {
      return nil   ----->crashes here
    }
    let toU16 = utf16.index(fromU16, offsetBy: length, limitedBy: utf16.endIndex) ?? utf16.endIndex
    guard let from = String.Index(fromU16, within: self),
      let to = String.Index(toU16, within: self) else { return nil }
    return from ..< to
  }

此代码随着Swift 3迁移而崩溃。

有人可以帮助调试问题。

Below is the sequence of events:
     //input for below function is: text “123456789”, string “0”, nsrange = location =9, length=0

1)功能1

static func numericText(_ text: String, replacedBy string: String, in nsrange: NSRange) -> String {
            guard let range = text.range(for: nsrange) else {
              //assertionFailure("Should never reach here")
              return text.numericString()
            }
            // Apply Replacement String to the textField text and extract only the numeric values
            return text.replacingCharacters(in: range, with: string)
              .numericString()
          }

2)功能2

        func range(for nsrange: NSRange) -> Range<String.Index>? {
            return range(nsrange.location, length: nsrange.length)
          }

3)功能3

        func range(_ from: Int, length: Int) -> Range<String.Index>? {
            guard let fromU16 = utf16.index(utf16.startIndex, offsetBy: from, limitedBy: utf16.endIndex), fromU16 != utf16.endIndex else {
              return nil
            }
            let toU16 = utf16.index(fromU16, offsetBy: length, limitedBy: utf16.endIndex) ?? utf16.endIndex
            guard let from = String.Index(fromU16, within: self),
              let to = String.Index(toU16, within: self) else { return nil }
            return from ..< to
          }

对不起,我没有在周末更新。我回顾了您的问题。

我可以实现您的功能1:

extension String {
    func getrange(_ from: Int, length: Int) -> Range<String.Index>? {
        guard let fromU16 = utf16.index(utf16.startIndex, offsetBy: from, limitedBy: utf16.endIndex), fromU16 != utf16.endIndex else {
            return nil
        }
        let toU16 = utf16.index(fromU16, offsetBy: length, limitedBy: utf16.endIndex) ?? utf16.endIndex
        guard let from = String.Index(fromU16, within: self),
            let to = String.Index(toU16, within: self) else { return nil }
        return from ..< to
    }
}

但是我无法实现您的功能2,是否转换为Swift3语法?

我的问题是,

Below is the sequence of events:
     //input for below function is: text “123456789”, string “0”, nsrange = location =9, length=0

您的输入,您的位置不应该是9。由于您的字符串长度为9,您可以替换的最大位置应为8?

只是用代码中的unicodescalars替换utf解决了问题。

最新更新