Open5

SwiftUI URL部分がリンク化するテキスト (ネタバレOK,名人様歓迎,指摘求む)

SUWA ShigekiSUWA Shigeki

iOS 15 から利用可能な AttributedStringSwiftUI.Text に与える。

let attributedString = AttributedString(/* ... */)
attributedString[range].link = URL(/* ... */)

range 部分が SwiftUI.Button のように表示され、タップするとSafariでページが開かれる。

SUWA ShigekiSUWA Shigeki
let inputText: String
let urlPattern: String = "https?://[A-Za-z0-9-._~:/?#\\[\\]@!$&'()*+,;%=]+"
let urls: [URL?] = inputText.matchAll(urlPattern).map { URL(string: String(inputText[$0])) } 
var attributedText = AttributedString(inputText)
let ranges: [Range<AttributedString.Index>] = attributedText.matchAll(urlPattern)
for case (let range, let url?) in zip(ranges, urls) {
    attributedText[range].link = url
}

こんな感じに作った AttributedString

SwiftUI.Text(attributedText)

でOK

SUWA ShigekiSUWA Shigeki

StringとAttributedStringそれぞれに1回ずつ同じRegExpを投げてるの気持ち悪いので
AttributedSubStringからStringに変換したいけどわからん

SUWA ShigekiSUWA Shigeki

一方で、自前で正規表現マッチせずに NSDataDetector にURL抽出を移譲する方法がありましたが、こちらは Range<AttributedString.Index> を作れないかもです