2016-04-11 4 views
2

Он уничтожил мое представление о статических переменных и константах после использования swift.Swift: Почему нестатические методы не могут вызывать статические переменные и константы (static let) без dynamicType?

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

, например:

class Aa { 
    static let name = "Aario" 
    func echo() { 
     print(name)  // Error! 
    } 
} 

Г-н людоеды сказал мне использовать dynamicType.

class Aa { 
    static var name = "Aario" 
    func echo() { 
     print(self.dynamicType.name) 
    } 
} 

let a = Aa() 
a.dynamicType.name = "Aario Ai" 
a.echo()       // it works!!! 

Это работает! Итак, почему я должен использовать dynamicType для вызова статических переменных?

Наконец, ответ:

class Aa { 
    static var name = "Static Variable" 
    var name = "Member Variable" 
    func echo() { 
     print(self.dynamicType.name) // Static Variable 
     print(Aa.name)     // Static Variable 
     print(name)      // Member Variable 
    } 
} 

let a = Aa() 
a.dynamicType.name = "Aario Ai" 
Aa.name = "Static: Aario" 
a.name = "Member: Aario" 
a.echo()       // it works!!! 

Это действительно отличается от других языков.

+1

use self.dynamictype.name – ogres

+0

Вы правы. Можете ли вы рассказать мне, почему это совсем другое с другими языками? – AarioAi

+0

Вы можете иметь как свойство экземпляра, так и свойство type (class/static) с тем же именем. –

ответ

3

Статические переменные должны быть адресованы с их типом, даже если вы пишете код в этом типе. См The Swift Programming Language (Swift 2.2) - Properties (в «запрашивая и тип настройки Свойства»):

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

В вашем коде просто напишите Aa.name вместо name, и со мной все будет в порядке.

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

  • Нет связанных вопросов^_^