質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.41%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

179閲覧

Regex.Matchを渡すとき、受け取る側は何の型を指定したらいいのかわからない

Programming

総合スコア5

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2023/11/23 05:42

実現したいこと

こっちで用意した構造体にMatchオブジェクトを渡したいけど、Regex.Matchの型が分からないです。

前提

swift 5.7で追加されたRegexをextensionで拡張してこっちで用意した構造体にMatchオブジェクトを渡したいです。将来的にはPythonのような関数などをこっちで用意した構造体に実現するつもりです。誰かが作ってないかなど、調べてみましたがRegexではなく、NSRegularExpressionしかなかったので、自分で作ろうと思いました。

発生している問題・エラーメッセージ

Cannot access associated type 'RegexOutput' from 'RegexComponent'; use a concrete type or generic parameter base instead

該当のソースコード

swift

1public struct re { 2 public struct Match { 3 private let _result: Regex<Any>.Match 4 public let string: String 5 6 public init(_ result: Regex<Any>.Match, _ string: String) { 7 self._result = result 8 self.string = string 9 } 10 } 11} 12 13extension Regex { 14 func search(_ string: String, pos: Int = 0, endpos: Int? = nil) -> re.Match? { 15 let start = string.index(string.startIndex, offsetBy: pos > 0 ? pos : 0) 16 let end = string.index(string.startIndex, offsetBy: endpos ?? string.utf16.count) 17 if let match = try? self.firstMatch(in: string[start..<end]) { 18 return re.Match(match, string) 19 } 20 return nil 21 } 22}

試したこと

Regex<AnyRegexOutput>.MatchやRegex<Any>.Matchなどを試しましたが、エラーが出てしまいました。

補足情報(FW/ツールのバージョンなど)

バージョンは5.8です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コンパイルを通すだけであれば、こうすれば通ります。

swift

1public struct re { 2 public struct Match<T> { 3 private let _result: Regex<T>.Match 4 public let string: String 5 6 public init(_ result: Regex<T>.Match, _ string: String) { 7 self._result = result 8 self.string = string 9 } 10 } 11} 12 13extension Regex { 14 func search(_ string: String, pos: Int = 0, endpos: Int? = nil) -> re.Match<Output>? { 15 let start = string.index(string.startIndex, offsetBy: pos > 0 ? pos : 0) 16 let end = string.index(string.startIndex, offsetBy: endpos ?? string.utf16.count) 17 if let match = try? self.firstMatch(in: string[start..<end]) { 18 return re.Match(match, string) 19 } 20 return nil 21 } 22}

投稿2023/11/27 06:31

MasakiHori

総合スコア3391

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Programming

2023/11/27 14:43

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.41%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問