[解決済み] Swiftの多重型制約
2022-05-13 07:39:20
質問
例えば、以下のようなプロトコルがあるとします。
protocol SomeProtocol {
}
protocol SomeOtherProtocol {
}
さて、一般的な型を受け取る関数が欲しいが、その型は以下のものに従わなければならない場合。
SomeProtocol
とすることができました。
func someFunc<T: SomeProtocol>(arg: T) {
// do stuff
}
しかし、複数のプロトコルに対応した型制約を追加する方法はないのでしょうか?
func bothFunc<T: SomeProtocol | SomeOtherProtocol>(arg: T) {
}
似たようなものはカンマを使いますが、この場合、違う型の宣言を始めることになります。 以下は、私が試したものです。
<T: SomeProtocol | SomeOtherProtocol>
<T: SomeProtocol , SomeOtherProtocol>
<T: SomeProtocol : SomeOtherProtocol>
どのように解決するのですか?
あなたは 節 を使うことで、カンマで区切っていくつでも要件を指定することができます(すべて満たさなければなりません)。
Swift 2:
func someFunc<T where T:SomeProtocol, T:SomeOtherProtocol>(arg: T) {
// stuff
}
Swift 3 & 4:
func someFunc<T: SomeProtocol & SomeOtherProtocol>(arg: T) {
// stuff
}
または、より強力なwhere節を使用します。
func someFunc<T>(arg: T) where T:SomeProtocol, T:SomeOtherProtocol{
// stuff
}
もちろん、プロトコル合成(例.
protocol<SomeProtocol, SomeOtherProtocol>
) を使うこともできますが、少し柔軟性に欠けます。
を使って
where
を使うことで、複数の型が関係するケースに対応できます。
複数の場所で再利用するためにプロトコルを構成したい場合や、構成したプロトコルに意味のある名前を付けたい場合もあります。
Swift 5:
func someFunc(arg: SomeProtocol & SomeOtherProtocol) {
// stuff
}
これはプロトコルが引数の隣にあるため、より自然に感じられます。
関連
-
[解決済み] スウィフト 2: !, ?-" オプション型「...」の値がアンラップされていない"
-
[解決済み] これを解決するにはどうしたらいいのでしょうか。UILabel.textは、メインスレッドからのみ使用する必要があります。
-
[解決済み] Swift言語におけるエクスクラメーションマークの意味とは?
-
[解決済み] Swift 3でdispatch_onceはどうなる?
-
[解決済み] Swiftでコアデータを日付(時間だけでなく)でソートする
-
[解決済み] swiftの"? "の意味は何ですか?[重複している]。
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み】プロパティのゲッターとセッター
最新
-
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 における指数演算子
-
[解決済み] Swiftでbase64StringをStringに変換する方法とは?
-
[解決済み] Swift 3、Swift 4、それ以降で dispatch_sync, dispatch_async, dispatch_after などはどうすればいいですか?
-
[解決済み] なぜswiftではアンダースコアが必要なのですか?
-
[解決済み] Swiftの@selector()?
-
[解決済み] なぜクラスではなくストラクチャーを選ぶのか?
-
[解決済み] Swiftの精密文字列フォーマット指定子
-
[解決済み】swiftで変数のメモリアドレスを印刷する
-
[解決済み】swiftでDoubleを最も近いIntに丸めるには?
-
[解決済み] 非同期ネットワークリクエストのswift forループの実行が終了するまで待つ