从正则表达式捕获中将字符串添加到属性字符串时崩溃

时间:2019-03-09 20:15:09

标签: ios swift cocoa-touch nsattributedstring

我正在尝试使用以下属性在字符串中创建链接:

    matches = regex.matches(in: strings, options: [], range: NSRange(strings.startIndex..., in: strings))

        for match in matches {

            rangeBetweenQuotes = match.range(at: 1)

            let swiftRange = Range(rangeBetweenQuotes, in: strings)!

            let link:String = String(strings[swiftRange])

              attributedString.addAttribute(.link, value: link, range: rangeBetweenQuotes)

        }

如果仅添加字体属性而不是链接,我就会知道上述方法有效。所以我的正则表达式工作。但是,当添加链接属性时,我遇到了问题。当我按照上述编写代码并运行应用程序时,我点击链接并收到错误消息:线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0。它出现在应用程序委托类中。

据我所知,最后两行代码引发了错误。

     let link:String = String(strings[swiftRange])

          attributedString.addAttribute(.link, value: link, range:  rangeBetweenQuotes)

要调试,我在上面的最后两行代码之间放置了一个断点。我可以看到变量link包含正确的字符串。该字符串也可以在value的{​​{1}}参数中找到。

点击链接时在运行时抛出错误。我知道是这种情况,因为我可以用字符串文字即addAttribute替换或分配link,并且链接可以正常工作,并且我可以使用

"test"

将“测试”字符串文字分配给插座。

使用调试器,我在func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool { 的{​​{1}}参数的link变量的下钻菜单中找到了以下内容

(BridgeObject)_object =从值提取数据失败

这表明变量有问题。没有?

我尝试使用value将类型addAttribute.的{​​{1}}变量转换为URL(string:""),但也不起作用。

2 个答案:

答案 0 :(得分:0)

一个原因可能是将NSRange转换为Range<String.Index>,反之亦然。强烈建议您不要使用string.countNSString绕道。

有便捷的API可以安全地转换类型

matches = regex.matches(in: string, range: NSRange(string.startIndex..., in: string))

let swiftRange = Range(rangeBetweenQuotes, in: string)!
let link = String(string[swiftRange])

答案 1 :(得分:0)

我相信答案涉及以下函数中的URL类型是否与传递给它的任何类型兼容。

 func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool  

下面的代码可以正常工作而不会引发错误。看看 URL(fileURLWithPath:)

     ... let swiftRange = Range(rangeBetweenQuotes, in: strings)!

        let link:String = String(strings[swiftRange])

          let link2 = URL(fileURLWithPath: link)

             attributedString.addAttribute(.link, value: link2, range: rangeBetweenQuotes)

我一直遇到的崩溃并非源于执行函数 addAttribute 参数 value 的错误,该函数采用 Any 对象类型。在调试错误时,我发现 addAttribute 中的参数 value 包含了我传递给它的字符串值。如上所述,问题出在以下函数中:

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool 

,其中包含一个URL。当我尝试使用

将字符串类型 link 转换为URL时
URL(string:"")

转换无效。我一直得到一个空值,这当然会在点击链接时引发错误。但是,当字符串类型变量时,我可以安全地将变量传递给参数 shouldInteractWith URL:URL 使用以下方式转换为 URL

 URL(fileURLWithPath: link)

我仍然不明白为什么 shouldInteractWith URL:URL 接受字符串文字,而String(string [swiftRange]), supra 不起作用。有什么想法吗?

编辑...进一步的解释

我知道为什么 URL 类型接受一个字符串文字而不接受另一个字符串文字的答案。有效的 URL 类型不能在字符串中包含空格。 URL(fileURLWithPath:)之所以有效,是因为它用%20填充了空白。

我希望这对以后的人有所帮助。