2015-03-22 3 views
19

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

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

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

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

ответ

25

The documentation говорит:

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

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

13

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

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

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

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

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" 
    } 
} 
+1

Отличные подсказки. Всего несколько замечаний - я считаю, что ваше намерение было «публичным классом B: A' не' public class B'. Также вам нужно добавить 'override' keyword' переопределить класс var name: String'. Не полностью понять ваше намерение с помощью 'static var storedName: String = defineName()', потому что вы не можете использовать метод instance для инициализации свойств static/class. – Mikolaj

15

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

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" 
+0

Работа !. Но IDE не помогает, с cmd + space – marlonpya

Смежные вопросы