私は概念的な問題に遭遇し、アドバイスを探しています。これらのウィジェットのアドバンス付きSwiftプロトコルの制限
class Widget {
var id: Int
var type: String
}
多くが容易にグループ化され、他の特性と機能を共有する:私は、共通のプロパティ指定されたオブジェクトタイプのすべてを定義する基本クラスを有します。性質/機能は、プロトコルにうまくフィット:
protocol WidgetryA {
func widgetAFunc()
}
protocol WidgetryB {
func widgetBFunc()
}
それは、これらのさまざまなプロトコルに準拠するようにウィジェットクラスを拡張するのは簡単です:ウィジェットは、複数のプロトコルに準拠することができることを
注意。これまでのところ問題ありません!私がやりたいこと、私が苦労していることは次の通りです...特定のWidget.type値を持つウィジェットは、指定されたウィジェットプロトコルに準拠することが基本的に禁止されています。だから、例えば:
// this obviously doesn't work with where -- is there an alternative?
extension Widget: WidgetryA where Self.type == "foo" {
func widgetAFunc() { }
}
今、私は、彼らがいけないの呼び出しを行うことから、間違ったWidget.typeのウィジェットを防ぐために、プロトコル機能でガード()INGのようなグロスと無粋な何かを行うことができます。私は関連タイプが私が望むものを達成するための実行可能な道を提供するかもしれないと感じていますが、私は働くコンストラクトを思いついています。どんな考えや助言もありがとう!
「ウィジェット」の 'type'プロパティは、ストアされたプロパティです(関連タイプなどではありません)。あなたの例が合法であるなら(何らかの形で)、これは_type_(エッセンスが型を定義する)に利用可能なメソッドが_runtime_(型のいくつかのプロパティの_value_に基づいて)中に決定されることを意味します。スウィフトの強タイピングシステムでは不可能です。一般的な使い方は、いくつかの型の型( 'associatedtype')が何らかの条件を満たす場合に型に拡張を制限することですが、そのようなすべての論理はコンパイル時に解決されます。 – dfri
ランタイムアトリビュートに基づいてプロトコルを制約することはできません。文字列型の違いを行う必要がある場合は、enumを使用することを強くお勧めします。 – PeejWeej