[解決済み] Swiftの関数パラメータとしてのプロトコルに準拠したクラス
2023-01-28 15:58:51
質問
Objective-Cでは、あるプロトコルに準拠したクラスをメソッドの引数として指定することが可能です。例えば、あるメソッドにのみ
UIViewController
に準拠した
UITableViewDataSource
:
- (void)foo:(UIViewController<UITableViewDataSource> *)vc;
Swiftでこれを実現する方法は見当たりません(もしかしたらまだ実現できていないのかもしれません)。複数のプロトコルを指定するには
func foo(obj: protocol<P1, P2>)
を使って複数のプロトコルを指定できますが、オブジェクトが特定のクラスであることを同様に要求するにはどうすればよいでしょうか?
どのように解決するのですか?
以下のように
foo
を一般関数として定義し、型制約を使用してクラスとプロトコルの両方を要求することができます。
Swift 4
func foo<T: UIViewController & UITableViewDataSource>(vc: T) {
.....
}
スウィフト3 (Swift 4 でも動作します)
func foo<T: UIViewController>(vc:T) where T:UITableViewDataSource {
....
}
スウィフト2
func foo<T: UIViewController where T: UITableViewDataSource>(vc: T) {
// access UIViewController property
let view = vc.view
// call UITableViewDataSource method
let sections = vc.numberOfSectionsInTableView?(tableView)
}
関連
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] swiftにおけるプロトコルの配列型および関数パラメータとしての使用法
-
[解決済み] Swiftで警告を消すには?
-
[解決済み] プロパティの型が内部型を使用しているため、publicを宣言することができない
-
[解決済み] Swift - サブクラスでオーバーライドする必要があるクラスメソッド
-
[解決済み] ボタンを無効化する
-
[解決済み] Swift: switch ケースでオプションの値に対するテストを行う
-
[解決済み] swift で文字列から数字以外の文字を削除する
-
[解決済み] Swift で、1 つ以上のプロトコルに準拠した特定の型の変数を宣言するにはどうしたらいいですか?
-
[解決済み] Swiftの網羅的なSwitchステートメントのためのNoop
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] swiftで改行なしの印刷をする
-
[解決済み] クラス 'ViewController' は swift で初期化されません。
-
[解決済み] Swift 1.2では、宣言は「final」と「dynamic」の両方にはなり得ないというエラーがある
-
[解決済み] swiftにおける "precondition "と "assert "の違いとは?
-
[解決済み] 固定サイズのオブジェクトの配列を作成する方法
-
[解決済み] 小数点以下2桁に切り上げ
-
[解決済み] swift で文字列から数字以外の文字を削除する
-
[解決済み] Swiftでクラスメソッド/プロパティを作成するには?
-
[解決済み] SwiftUI のテキストのフォントサイズをカスタマイズする
-
[解決済み] SwiftUIでビューを動的に隠す