Accéder aux variables statiques dans la classe dans Swift

ClassName.staticVaribale est- ClassName.staticVaribale le seul moyen d’accéder à la variable statique dans la classe? Je veux quelque chose comme self , mais pour la classe. Comme class.staticVariable .

Il existe deux manières d’accéder à une propriété / méthode statique à partir d’une propriété / méthode non statique:

  1. Comme indiqué dans votre question, vous pouvez préfixer le nom de la propriété / méthode avec celui du type:

     class MyClass { static let staticProperty = 0 func method() { print(MyClass.staticProperty) } } 
  2. Swift 2: Vous pouvez utiliser dynamicType :

     class MyClass { static let staticProperty = 0 func method() { print(self.dynamicType.staticProperty) } } 

    Swift 3: Vous pouvez utiliser le type(of:) (merci @ Sea Coast of Tibet):

     class MyClass { static let staticProperty = 0 func method() { print(type(of: self).staticProperty) } } 

Si vous êtes dans une propriété / méthode statique, vous n’avez pas besoin de préfixer la propriété / méthode statique avec quelque chose:

 class MyClass { static let staticProperty = 0 static func staticMethod() { print(staticProperty) } } 

Il y a un moyen dans Swift de faire en sorte que la réponse de Marcel satisfasse même les dieux les plus pointus

 class MyClass { private typealias `Self` = MyClass static let MyConst = 5 func printConst() { print(Self.MyConst) } } 

Cela rend Self disponible comme dans les protocoles lorsque vous voulez accéder à la déclaration de type associée. Je ne suis pas sûr de Swift 1 parce que je ne l’ai jamais essayé mais dans Swift 2, cela fonctionne parfaitement

Dans une future version de Swift 3 (à paraître), vous pouvez utiliser Self (oui, c’est un majuscule) pour faire référence à la classe contenant. Une proposition à cet effet a été acceptée, mais la fonctionnalité n’est pas encore implémentée.

Par exemple:

 struct CustomStruct { static func staticMethod() { ... } func instanceMethod() { Self.staticMethod() // in the body of the type } } 

Source: https://github.com/apple/swift-evolution/blob/master/proposals/0068-universal-self.md

Vous pouvez contourner ce problème en définissant une typealias de référence automatique.

 class MyClassWithALongName { typealias CLASS = MyClassWithALongName static let staticFoo = "foo" func someInstanceMethod() -> Ssortingng { return CLASS.staticFoo } } 

Bien que les dieux du guide de style puissent ne pas approuver.

Je n’aime pas la manière typealias dans ce cas. Ma solution de contournement est la suivante:

 class MyClass { static let myStaticConst: Int = 1 var myStaticConst:Int { return type(of: self).myStaticConst } func method() { let i:Int = myStaticConst } }