【Swift】Delegateメソッドでジェネリクスを使いたい時にassociatedtypeは使えない
はじめに
今回は、Protocolにジェネリクスを引数に受け取るメソッドを定義したとき、
そのProtocolに書いたメソッドをDelegateメソッドとして、使いたい場合の書き方を記事にしました。
前提条件
Swiftにおける下記の3点について知っていること
- Protocol
- Delegate
- ジェネリクス
このように書くとコンパイルエラーになる
ソースコード
protocol SampleDelegate: AnyObject {
associatedtype T
func getSampleData(_ data: T)
}
class Fuga: SampleDelegate {
typealias T = String
func getSampleData(_ data: T) {
print(data)
}
}
class Hoge {
weak var delegate: SampleDelegate? // コンパイルエラー
}
エラーの内容
Protocol 'SampleDelegate' can only be used as a generic constraint because it has Self or associated type requirements
自分が実装していたときは、このエラーが出ました。
もしかしたら、この記事を見ていただいている方の中で、このエラーが出ている方がいるかも知れません。
和訳すると、
「プロトコルは、Selfまたは関連する型の要件があるため、一般的な制約としてのみ使用することができる」
とのことですが、これだけではよくわかりませんでした。
associatedtype
をFuga
側でtypealias T = String
というように、Stringに型決めしたところで、
delegateを持つ側のHoge
は、実際に処理を行うクラスが持っている型を知らないのでコンパイルエラーになってしまうと自分は解釈しました。
こうすればコンパイルが通る
protocol SampleDelegate: AnyObject {
func getSampleData<T>(_ data: T)
}
class Fuga: SampleDelegate {
func getSampleData<T>(_ data: T) {
print(data)
}
}
class Hoge {
weak var delegate: SampleDelegate?
}
問題点を1つ上げるとすれば、コンパイルエラーのときは、Fuga
側で、型付けをすることができましたが、
今回は、associatedtype
が使えないため、残念ながら型を確定させてあげることができません。
なので、そのあたりは、func getSampleData<T>(_ data: T)
で考慮してあげる必要がありそうです。
以上!
Author And Source
この問題について(【Swift】Delegateメソッドでジェネリクスを使いたい時にassociatedtypeは使えない), 我々は、より多くの情報をここで見つけました https://qiita.com/kamomeKUN/items/ec477e82ee6d675893eb著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .