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

问题描述 投票:1回答:2

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

    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。它出现在app delegate类中。

据我所知,最后两行代码抛出错误。

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

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

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

在点击链接时运行期间会引发错误。我知道这是因为我可以用字符串文字替换或分配link,即"test",并且链接工作正常,我能够使用

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

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

使用调试器,我发现了以下内容,我在linkvalue参数的addAttribute.变量中的深入菜单中找到了以下内容

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

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

我尝试使用URL(string:"")link类型的String变量转换为URL,这也不起作用。

ios swift cocoa-touch nsattributedstring
2个回答
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])

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参数值的错误,该参数值采用Any对象类型。在调试错误时,我发现addAttribute中的参数值包含传递给它的字符串值。如上所述,问题起源于该功能:

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

需要一个URL。我尝试使用时将字符串类型链接转换为URL

URL(string:"")

转换不起作用。我一直得到一个空值,当点击链接时当然会出错。但是,当使用以下方法将字符串类型变量转换为URL时,我可以安全地将变量传递给参数shouldInteractWith URL:URL

 URL(fileURLWithPath: link)

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

编辑......进一步解释

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

我希望这可以帮助有人在路上。

© www.soinside.com 2019 - 2024. All rights reserved.