[解決済み] 通常のメソッドからプロトコルのデフォルト実装を呼び出す
2023-06-07 17:36:30
質問
このようなことが実現可能なのかどうか、気になります。
こんな感じのPlaygroundがあります。
protocol Foo {
func testPrint()
}
extension Foo {
func testPrint() {
print("Protocol extension call")
}
}
struct Bar: Foo {
func testPrint() {
// Calling self or super go call default implementation
self.testPrint()
print("Call from struct")
}
}
let sth = Bar()
sth.testPrint()
でデフォルトの実装を提供できる
extension
で提供できますが、もし
Bar
がデフォルトの実装にあるもの全てに加え、追加で必要なものがあればどうでしょうか?
それは、なんとなく
super.
メソッドを
class
を使うことで、すべてのプロパティを実装するという要件を満たすことができますが、同じことを
structs
.
どのように解決するのですか?
まだ答えを探しているのかどうかわかりませんが、方法としては、プロトコルの定義から関数を削除し、オブジェクトをキャストして
Foo
にキャストし、その上でメソッドを呼び出すことです。
protocol Foo {
// func testPrint() <- comment this out or remove it
}
extension Foo {
func testPrint() {
print("Protocol extension call")
}
}
struct Bar: Foo {
func testPrint() {
print("Call from struct")
(self as Foo).testPrint() // <- cast to Foo and you'll get the default
// function defined in the extension
}
}
Bar().testPrint()
// Output: "Call from struct"
// "Protocol extension call"
なぜか、プロトコルの一部として宣言された関数ではなく、プロトコルの拡張で定義された関数である場合にのみ動作します。よくわかります。しかし、それは動作します。
関連
-
[解決済み] Pythonで子クラスから親クラスのメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] URLからプロトコル、ドメイン、ポートを取得する
-
[解決済み】インターフェイスのメソッド実装は@Overrideすべきなのか?
-
[解決済み] SwiftUIのForEachでインデックスを取得する
-
[解決済み] カスタムイニシャライザを持つSwift enumはrawValueイニシャライザを失う
-
[解決済み] Objective-CフレームワークをSwiftプロジェクトにインポートする際、Bridging Headerで「ファイルが見つかりません」と表示される。
-
[解決済み] SwiftのAnyObjectとAny
-
[解決済み] swiftでデータを16進文字列に変換する方法
-
[解決済み] Codableクラスはプロトコルに準拠していない Decodable
-
[解決済み] NSUserdefaultsの配列の保存と読み込みはどのように行うのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] クラス 'ViewController' は swift で初期化されません。
-
[解決済み] swiftにおける "precondition "と "assert "の違いとは?
-
[解決済み] Swift で型に表示されるテキスト表現を変更するにはどうしたらいいですか?
-
[解決済み] コマンドラインアプリケーションでのキーボードからの入力
-
[解決済み] Swiftによる文字列中の部分文字列のインデックス
-
[解決済み] Swiftで値を増加させた配列を作成する方法は?重複
-
[解決済み] Swiftで汎用プロトコルを作成するには?
-
[解決済み] NSUserdefaultsの配列の保存と読み込みはどのように行うのですか?
-
[解決済み] Swift で Double と Float の最大値を求める方法
-
[解決済み] Swift 3.0 でコンパイルしたモジュールを Swift 3.0.1 でインポートできない。