2016-11-03 6 views
2

私はこれらの2つのSWIFTのクラスがあります。これはちょうど、クラスの「getメソッドのための「宣言をオーバーライドすると、 『オーバーライド』キーワードが必要です」エラーを発生させるコンパイルしようとスウィフトオーバーライド静的メソッドのコンパイルエラー

class A {  
    static func list(completion: (_ result:[A]?) -> Void) { 
     completion (nil) 
    }   
    static func get(completion: (_ result:A?) -> Void) { 
     completion (nil) 
    } 
} 


class B: A {  
    static func list(completion: (_ result:[B]?) -> Void) { 
     completion (nil) 
    }  
    static func get(completion: (_ result:B?) -> Void) { 
     completion (nil) 
    }   
} 

をB. 'list'メソッドはうまくコンパイルされます。 [B]の違いは何ですか? B?この場合のコンパイラのために?

編集: '上書き'を追加することはできません。 「静的メソッドをオーバーライドできません」というエラーが表示されます。

答えて

6

クラスBでは、方法listは、のクラスAとは別の方法です。彼らはちょうど同じ名前を共有します、それだけです。 2つのlist方法の

パラメータは、実際に異なる:B.list(_ result: [B]?) -> Voidをとりながら

// A.list 
static func list(completion: (_ result:[A]?) -> Void) { 
// B.list 
static func list(completion: (_ result:[B]?) -> Void) { 

A.list(_ result: [A]?) -> Voidの引数を取ります。クロージャータイプのパラメーターリストの配列タイプは異なります。

何も上書きしていないので、オーバーロードしているだけです。

注:

staticメソッドをオーバーライドすることはできません!メソッドをオーバーライドする場合は、staticの代わりにclassを使用します。

class A { 
    class func get(completion: (_ result:A?) -> Void) { 
     completion (nil) 
    } 
} 


class B: A { 
    override class func get(completion: (_ result:B?) -> Void) { 
     completion (nil) 
    } 
} 
+1

ありがとう@Sweeper。なぜ、getメソッドで同じ理由ではないのですか? B.getはB型の彫像を取る?タイプAのA.get? – dce

+1

ああ、私はそれを説明するのを忘れてしまった!基本的には、「このメソッドが別のメソッドをオーバーライドするかどうか」アルゴリズムが実装されている方法です。アルゴリズムでは、配列は互換性のない型であると考えていますが、サブクラスとスーパークラスは互換性のある型@dce – Sweeper

関連する問題