2017-02-23 1 views
0
class Foo { 
    let fooValue = 1 
} 

print(Foo.fooValue) // not work 


class Bar { 
    static let barValue = 1 
} 

print(Bar.barValue) // work; print "1" 

Pourquoi? Je m'attendais à ce que l'exemple Foo fonctionne, car la valeur de fooValue est la constante, la valeur et l'adresse mémoire connues au moment de la compilation. Mais j'ai besoin d'utiliser le mot-clé static pour travailler.Quelle est la différence entre "let" et "static let"?

+2

Être un 'let' signifie simplement que c'est une constante - cela n'a rien à voir avec le fait que la propriété soit accessible depuis l'instance ou la portée statique. Voir aussi [Quelle est l'utilisation du mot clé "static" si "let" mot-clé utilisé pour définir des constantes/immutables dans swift?] (Http://stackoverflow.com/q/34574876/2976878) – Hamish

Répondre

9

fooValue est une propriété d'instance . Il y a un fooValue séparé pour chaque instance (objet) de la classe Foo.

barValue est une propriété statique . Il y en a un partagé barValue qui appartient à la classe.

Voici un exemple plus concret. Supposons que j'ai eu cette classe:

class Human { 
    static let numberOfLimbs = 4 
    let name: String 
} 

Qu'attendriez-vous si je vous demandais quel est le nom d'un humain? C'est à dire. Human.name. Eh bien, vous ne seriez pas capable de me répondre, parce qu'il n'y a pas un seul nom de tous les humains. Chaque humain aurait un nom distinct. Vous pouvez cependant me dire le nombre de membres humains (Human.numberOfLimbs), qui est (presque) toujours 4.

+0

Merci pour la clarification. Mais, dans mon cas, 'let fooValue = 1' a le même comportement que' static let barValue = 1', car les deux sont des valeurs constantes, mais, 'Bar' a dépensé moins de mémoire que' Foo'. Dans quelle situation est préférable d'utiliser un code comme 'Foo'? – Macabeus

+1

@ Macabeus Ils ne sont pas du tout le même comportement. L'un alloue une seule pièce de mémoire pour une seule valeur liée à la classe, l'autre dit d'allouer de la mémoire pour une nouvelle valeur pour chaque nouvelle instance créée à partir de la classe. Leurs cas d'utilisation sont complètement différents, mais difficiles à expliquer jusqu'à ce que vous appreniez les bases de la programmation orientée objet. – Alexander

0

vous n'avez pas à instancier votre classe pour accéder aux propriétés statiques

si vous ne vouliez accéder à votre première utilisation de la classe

Foo().fooValue 

généralement que vous souhaitez utiliser statique pour les propriétés que vous voulez pour accéder sans avoir à instancier l'objet à chaque fois