1. ホーム
  2. class

[解決済み] Swiftのstatic funcとclass funcの違いは何ですか?

2022-02-19 10:52:48

質問

Swiftのライブラリでこれらの定義を見ることができます。

extension Bool : BooleanLiteralConvertible {
    static func convertFromBooleanLiteral(value: Bool) -> Bool
}

protocol BooleanLiteralConvertible {
    typealias BooleanLiteralType
    class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self
}

と定義されたメンバ関数と何が違うのでしょうか? static func で定義されたものと class func ? 単純に static は構造体や列挙型の静的関数用で class は、クラスやプロトコルのために?他に知っておくべき違いはありますか?構文自体にこのような違いがある根拠は何ですか?

どのように解決するのですか?

<ブロッククオート

単純に、staticは構造体や列挙型の静的関数、classはクラスやプロトコルの静的関数ということでしょうか?

それが主な違いです。その他にも、クラス関数は動的にディスパッチされること、サブクラスでオーバーライドできることなどの違いがあります。

プロトコルはclassキーワードを使いますが、構造体がプロトコルを実装することを排除しているわけではなく、代わりにstaticを使うだけです。プロトコルにclassが選ばれたのは、staticやclassを表す3つ目のキーワードが不要になるためです。

このトピックに関するChris Lattnerからのコメントです。

<ブロッククオート

構文を統一する(例えばキーワードとして"type"を使う)ことも考えましたが、実はそれは物事を単純化するものではありません。 キーワード "class" と "static" は親しみやすく、(+メソッドがどのように機能するかを理解すれば)かなり説明的で、クラスに本当に静的メソッドを追加する可能性を開くのに良いものです。 このモデルの主な奇妙さは、プロトコルがキーワードを選択しなければならないことですが(私たちは "class" を選びました)、バランス的には正しいトレードオフと言えます。

そして、クラス関数のオーバーライド動作の一部を示すスニペットを示します。

class MyClass {
    class func myFunc() {
        println("myClass")
    }
}

class MyOtherClass: MyClass {
    override class func myFunc() {
        println("myOtherClass")
    }
}

var x: MyClass = MyOtherClass()
x.dynamicType.myFunc() //myOtherClass
x = MyClass()
x.dynamicType.myFunc() //myClass