Problème lecture class

Bonjour à tous,

J’ai essayé de reproduire le chapitre 2.2 - Notions de Swift 4 (Classes et objets) dans mon début d’application.

Voilà la classe que j’ai créée dans le fichier Main.Storyboard. Celle-ci est située en dehors de la classes ViewController.

class Country {
var Name:String = ""
var totalCoin:Int = 0
var obtainedCoin:Int = 0
var notObtainedCoin:Int = 0
}

J’arrive ensuite à attribuer cela

var country1 = Country()

Mais quand je veux changer les paramètres de la variable country1, je ne peux pas y accéder… Je n’ai pas la petite fenêtre me permettant de sélectionner le paramètre une fois que j’ai tapé country1. Et si je force en écrivant country1.Name, j’ai un message d’erreur : Expected declaration.

Une idée d’où pourrai venir mon erreur ?
Quand je code exactement la même chose dans le playground tout fonctionne à merveille…

Merci d’avance !

A bientôt

un petit screenshot pour nous aider à comprendre ?


La voilà !

Bonjour,
Tu tentes d’affecter une valeur à ta variable dans les déclarations de ta classe ViewController. Cela n’est pas possible. Si tu veux changer la variable Name de ta classe il faut :

  • le faire à l’intérieur d’une fonction de ton ViewController :
    func maFonction() {
    country1.Name = “France”
    }

  • créer un constructeur sur ta classe Country en passant directement le nom :
    var country 1 = Country(“France”)

Ou créer une extension de la classe si c’est utile pour ton cas.

extension ViewController {
var Name:String = ""
var totalCoin:Int = 0
var obtainedCoin:Int = 0
var notObtainedCoin:Int = 0
}

Les extension ne peuvent pas contenir de propriétés non ? Il faut utiliser des fonctions il me semble.

Yes, j’ai fait un gros raccourci sur ma réponse.
Par exemple, je gère un location delegate dans une extension.

extension CreateNewZoneViewController: CLLocationManagerDelegate {
    
    // Handle incoming location events.
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location: CLLocation = locations.last!
        print("Location: \(location)")
        
        let camera = GMSCameraPosition.camera(withLatitude: location.coordinate.latitude,
                                              longitude: location.coordinate.longitude,
                                              zoom: zoomLevel)
        
        if mapView.isHidden {
            print("mapview hidden")
            mapView.isHidden = false
            mapView.camera = camera
        } else {
            print("animate")
            mapView.animate(to: camera)
        }
    }

Y’a bien une fonction de location manager mais j’ai aussi toutes mes variables dedans

1 « J'aime »

Tout d’abord merci à tous pour vos réponses.
Cependant je souhaite créer des variables de type Country et pouvoir les réutiliser dans toutes mes fonctions… Je ne crois pas que cela soit possible dans vos cas non? Peut-être que je me trompe…

Si tu peux. C’est juste que tu dois taper country1.name = “France” entre les accolades { } de la ou les fonctions qui t’intéressent. Mais tu ne peux pas changer les paramètres de la variable country1 en dehors des accolades.

Dans ton cas, je pense qu’il est plus judicieux de créer une classe différente que tu appelleras Country.swift qui contient quelque chose du genre

struct Country {
var Name:String = ""
var totalCoin:Int = 0
var obtainedCoin:Int = 0
var notObtainedCoin:Int = 0
}

Puis faire une fonction pour récupérer l’ensemble des pays qui te renverra un tableau avec la liste des pays et ensuite tu pourras la manipuler en faisant allCountries[].Name, allCountries[].totalCoin, etc.

1 « J'aime »

Pourquoi déclarer une class, en l’occurence Country dans cet exemple, dans la class d’un ViewController ?
Attention l’organisation de ton projet.
Il serait peut être judicieux de créer un nouveau ficher ‹ Country.swift › comme photo ci-dessous

et sinon la piste à suivre pour ton probleme est dans le cours…
singleton, variable static et variable private seront tes amis.

Mieux vaut que tu essayes de trouver et surtout comprendre par toi même.

J’avais à peu près le même problème il y a quelques semaines.

effectivement c’est une autre solution par rapport à celle que je viens de poster mais tout dépend du projet de @quentin.brtrd
En tout cas on est d’accord sur un point…

1 « J'aime »

@quentin.brtrd dis moi si je me trompe, mais à la lecture de ta question je pense que tu viens tout juste de commencer le cours et tu veux juste essayer de refaire les exemples mais avec tes propres données.
Si c’est le cas alors, sache que les exemples ont été faits dans un Playground et non dans un projet normal.
Les Playgrounds facilitent les choses au départ mais ils autorisent des choses qui ne fonctionnent pas dans des vrai projets.
Par exemple dans un Playground on peut mettre du code un peu partout et ça marche très bien. Dans un vrai projet, il faut impérativement que les ligne de code à exécuter soient placées dans des fonctions.
En dehors des fonctions tu as uniquement le droit de créer des variables et de les initialiser avec une valeurs.

Donc je pense que le mieux serait que tu passes sur un Playground pour t’entraîner.

Si tu souhaites rester sur un projet, alors je suis d’accord avec @alexandre.cane : crée un nouveau fichier pour chacune des classes que tu vas faire. Ensuite tu pourras créer des objets de type Country dans la fonction viewDidLoad par exemple :

override func viewDidLoad() {
        super.viewDidLoad()
        
        let country1 = Country()
        country1.Name = "France"
}