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

Переопределение статических варов в подклассах swift 1.2

в отличие от class var, где они могут быть переопределены в подклассах, я считаю, что это относится и к static, но, к сожалению, нет. Вот пример

public class A {
    private static let NAME: String = "A"
}

public class B: A {
    private static let NAME: String = "B" //error
}

по-моему, static означает связь с этим конкретным классом, поэтому в приведенном выше примере B должно получить собственное пространство для переопределения этой переменной, поскольку оно связано только с B, я возвращаюсь к stored properties, если только кто-то имеет лучшее решение.

4b9b3361

Ответ 1

В документации говорится:

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

Так что это final, что означает, что вы не можете его переопределить.

Ответ 2

Вы можете использовать вычисленные свойства:

class A {
   class var Name: String {
       return "A"
   }
}

class B: A {
   override class var Name: String {
       return "B"
   }
}

Использование:

print(A.Name) // "A"
print(B.Name) // "B"

Ответ 3

Как и было предложено, вы не можете переопределять статические переменные, но можете использовать функцию класса (static) для переопределения.

class A {
   class func StaticValue() -> AnyObject {
      return "I am a String"
   }
}

class B: A {
    override class func StaticValue() -> AnyObject {
        return 2
    }
}

Ответ 4

У вас могут быть свойства вычисляемые:

public class A {
   class var NAME: String {
       return "A"
   }
}

public class B {
   class var NAME: String {
       return "B"
   }
}

Если нужно, вы можете даже "разветкить" сохраненное свойство в подклассе:

public class A {
       // Needs to be overriden in subclass
       class var NAME: String {
           return "A"
       }
    }

public class B {
   class var NAME: String {
       return B.storedName
   }

   static var storedName: String = defineName()

   func defineName() -> String {
       // You could do something more complex here
       return "B"
   }
}