Подтвердить что ты не робот

Почему нет хранимых свойств типа для классов в swift?

Работая на языке Swift Programming, я был удивлен, увидев, что в отличие от структур и перечислений классы не поддерживают свойства хранимого типа.

Это общая особенность других языков OO, поэтому я предполагаю, что была хорошая причина, по которой они решили не допускать этого. Но я не могу догадаться, что это за причина, тем более что у них есть структуры (и перечисления).

Это просто, что это было раннее время для Swift, и оно еще не реализовано? Или существует более глубокая причина решения языкового дизайна?

BTW, свойство хранимого типа - это терминология 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"

Edit:

Теперь я понимаю, что это ограничение тривиально для работы, например, используя вложенную структуру со хранимыми свойствами:

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"

Это, по-видимому, не позволяет им быть глубоко непостижимым языком для объяснения этого ограничения.

Учитывая это и формулировку сообщения компилятора, о котором упоминает Мартин Гордон, я должен сделать вывод, что это просто что-то (второстепенное).

4b9b3361

Ответ 1

Ошибка компилятора: "Переменные класса еще не поддерживаются", поэтому кажется, что они еще не реализовали его.

Ответ 2

Расширяя трюк сложенной структуры OP для моделирования хранимых свойств типа, вы можете пойти дальше и сделать его похожим на свойство чистого хранимого типа вне класса.

Используйте вычисленную пару getter и setter, например:

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"

Ответ 3

"Для типов значений (т.е. структур и перечислений) вы можете определить хранимые и вычисленные свойства типа. Для классов вы можете определять только свойства вычисленного типа.

Отрывок из: Apple Inc." Быстрый язык программирования ". интерактивные книги. https://itun.es/cn/jEUH0.l

Я думаю, что Apple Engineers просто добавляет хранимые свойства типа к классам, но пока мы не знаем, может быть, никогда, на мой взгляд. И для этого есть метки (static и класс), чтобы отличить их.

Самая важная причина может заключаться в следующем:

Чтобы избежать разных объектов, есть общая переменная переменной

мы знаем:

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

можно заменить на

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

но

static var storedTypeProperty = "StringSample"  

сложнее заменить фразу класса в классе.

//Я новичок в Swift Programming Language, и это мой первый ответ в Stack OverFlow. Рад обсудить с вами. ^^