web-dev-qa-db-ja.com

なぜクラスの保存型プロパティが迅速にないのですか?

Swiftプログラミング言語を使用して、構造体や列挙型とは異なり、クラスがストアドタイププロパティをサポートしていないことを知って驚いた。

これは他のOO言語の共通機能です。そのため、彼らがそれを許可しないことに決めた正当な理由があったと思います。しかし、特に構造(および列挙型)があります。

Swiftの初期の段階であり、まだ実装されていないだけですか?それとも、言語設計の決定の背後に、より深い理由がありますか?

ところで、「保存された型のプロパティ」はSwift用語です。他の言語では、これらはクラス変数と呼ばれることがあります。コード例:

struct FooStruct {
    static var storedTypeProp = "struct stored property is OK"
}

FooStruct.storedTypeProp // evaluates to "struct stored property is OK"

class FooClass {
    class var computedClassProp: String { return "computed class property is OK" }

    // class var storedClassProp = "class property not OK" // this won't compile
}

FooClass.computedClassProp // evaluates to "computed class property is OK"

編集:

この制限は、たとえば、格納されたプロパティを持つネストされた構造を使用することで回避するのが簡単であることを理解しました。

class Foo {
    struct Stored {
        static var prop1 = "a stored prop"
    }
}

Foo.Stored.prop1 // evaluates to "a stored prop"
Foo.Stored.prop1 = "new value"
Foo.Stored.prop1 // evaluates to "new value"

それは彼らがこの制限のための深い不可解な言語設計の理由であることを排除しているようです。

それと、マーティン・ゴードンが言及しているコンパイラーメッセージの表現を考えると、これは単に(マイナーな)除外されたものであると結論付けなければなりません。

37
John Mullaney

コンパイラエラーは「クラス変数はまだサポートされていません」であるため、まだ実装されていないようです。

27
Martin Gordon

OPの拡張入れ子構造のトリックをシミュレートするためにストアドタイププロパティを使用すると、さらに進んで、外部から純粋なストアドタイププロパティのように見せることができます。クラス。

次のように計算されたgettersetterのペアを使用します。

class ClassWithTypeProperty
{
    struct StoredTypeProperties
    {
        static var aTypeProperty: String = "hello world"
    }

    class var aTypeProperty: String
    {
        get { return self.StoredTypeProperties.aTypeProperty }
        set { self.StoredTypeProperties.aTypeProperty = newValue }
    }
}

次に、次のことができます。

println(ClassWithTypeProperty.aTypeProperty)
// Prints "hello world"

ClassWithTypeProperty.aTypeProperty = "goodbye cruel world"

println(ClassWithTypeProperty.aTypeProperty)
// Prints "goodbye cruel world"
15

「値の型(つまり、構造体と列挙型)の場合、格納および計算された型のプロパティを定義できます。クラスの場合、計算タイププロパティのみを定義できます。」

抜粋:Apple Inc.「The Swift Programming Language。」iBooks。 https://itun.es/cn/jEUH0.l

Appleのエンジニアがクラスに保存された型のプロパティを追加するのは簡単だと思いますが、まだわかりません。おそらく私の意見ではないと思います。そしてそれがそれらを区別するためのラベル(staticclass)がある理由です。

最も重要な理由はそれかもしれません:

異なるオブジェクトが変更可能な変数を共有することを避けるために

私たちは知っています:

static let storedTypeProperty = "StringSample"  // in struct or enum ...

で置き換えることができます

class var storedTypeProperty:String {return "StringSample" }  // in class

だが

static var storedTypeProperty = "StringSample"  

クラス内のclass句に置き換えるのは困難です。

//私はSwiftプログラミング言語を実際に使用したことがなく、Stack OverFlowでの最初の回答です。あなたと話し合ってよかったです。^^

5
Allen