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:
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) } }
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 } }