私は次のような混乱を経験した。私が知る限り、静的そしてクラスメソッドを宣言するときにキーワードを指定すると、2 番目のキーワードがサブクラスでオーバーライドされる可能性があります。
問題
ただし、Swift 1.2 でプロトコルを次のように宣言すると、
protocol MyProtocol
{
class func dummyClassMethod()
}
コンパイラはエラーを返します:
クラスメソッドはクラス内でのみ許可されます。静的メソッドを宣言するには「static」を使用します。
このエラーは、MyProtocol がクラスではないことは明らかなので非常に説明的ですが、クラス関数をプロトコルの一部にしたいのです。
私が試したこと
プロトコルでインターフェースを宣言すると、静的コンパイラは満足し、このプロトコルを採用するすべてのクラスでこの静的メソッドを使用できるようになります。
protocol MyProtocol
{
static func dummyClassMethod()
}
質問
私の質問は基本的に、これは正しいのかということです。この宣言では、クラス メソッドは子でオーバーライドできないと規定されていますが、私の実装では次のように記述して使用できます。
class ClassA: MyProtocol
{
class func dummyClassMethod() {
}
}
class ClassB: ClassA
{
override class func dummyClassMethod() {
}
}
そして今、私の dummyClassMethod はもう静的ではありません...
コンパイラは正常で、すべてが動作しますが、なぜでしょうか?
インターフェース自体は静的であるが、その実装は静的ではないという事実に特有のものですか?
- プロトコルのクラス関数のより良い代替手段はありますか?
Objective-Cソリューション
ObjC ではこれは非常に簡単で、問題なくコンパイルおよび実行されます。
@protocol MyProtocol
+(void)dummyClassMethod;
@end
ベストアンサー1
レビューできますAppleのドキュメント(サブセクションメソッドの要件)。
そこにはこう書いてある。
型プロパティ要件と同様に、型メソッド要件には常に静的キーワードはプロトコルで定義されるときに使用されます。これは、型メソッドの要件がクラスまたは静的クラスによって実装される場合のキーワード
実際には、次のように実行できます。
まず、プロトコルを宣言します。
protocol SomeProtocol {
static func someMethod()
}
そして、あなたの中class
で2つのオプション:
初め:
class SomeClass : SomeProtocol {
class func someMethod()
}
2番目:
class SomeClass : SomeProtocol {
static func someMethod()
}
これであなたの疑問が解消されることを願っています。