2016-11-14 7 views
3

Newbie question. J'essaie simplement de déclarer une classe (ou même une structure) en tant que fichier Swift séparé, puis de la construire ou de l'utiliser dans une classe séparée. Considérez ceci:Déclaration de classe et utilisation

import Foundation 

class PayloadTest{ 
    var label: String 
    init(label:String) { 
      self.label = label 
    } 
} 

---- puis fichier séparé

import WatchKit 
import Foundation 


class InterfaceController2: WKInterfaceController { 

    var payloadtest = PayloadTest(label: "test string init") 

    payloadtest.label = "test" // this line gives error - says it was expecting a declaration 
    . 
    . 
    . 
} 

Je ne peux pas comprendre pourquoi si je fais une classe ou struct au même niveau dans mon extension watchos, il est autorisé à être consulté ou reconnu lorsque j'essaie d'accéder aux variables.

+4

Vous avez besoin de rafraîchir sur différents concepts de portée. Essayez de faire de votre classe une classe publique, (bien sûr) vous devrez aussi exposer les différentes choses à l'intérieur. Les autres niveaux d'exposition incluent internal, fileprivate et private. Dans Swift 3, les définitions de fileprivate (non disponible en 2.x) peuvent être différentes avec Swift 4, alors soyez prudent. (Oui, des fichiers séparés pour vos classes signifient que chaque classe est privée par défaut.) – dfd

Répondre

2

Comme DFD mentionné dans la section des commentaires ceci est une question de portée. Dans de nombreux langages de programmation, vous ne pouvez pas écrire des instructions (expressions) qui ne sont ni une déclaration, ni une initialisation, ni un appel de méthode en dehors de la fonction ou d'une méthode.

Permettez-moi d'expliquer ce que je disais,

Dans une classe ou une définition de la structure des déclarations (expressions) en dehors de la déclaration & initialisation doivent être présents dans la fonction (méthode) définition.

class PayloadTest{ 
//The below statement is declaration, which declares label is an property of type string. 
    var label: String 
    init(label:String) { 
//The below statement is an assignment, and it compiles and execute fine as this is inside a init method. 
     self.label = label 
    } 
} 

Cependant, dans votre deuxième extrait,

importation WatchKit importation Fondation

class InterfaceController2: WKInterfaceController { 

//The below statement compiles fine even tough it isn't present inside a method coz it is initialization statement. 

var payloadtest = PayloadTest(label: "test string init") 

//However the compiler complains about the below assignment statement because, this is neither an declaration nor an initialization statement and it should not be outside method. 
//So you've to keep this statement inside a method for compiler to stop complaining. 

payloadtest.label = "test" // this line gives error - says it was expecting a declaration 
.... 
} 

Pour le deuxième travail d'extrait mis la ligne ci-dessous du code dans une méthode et d'appeler cette méthode,

payloadtest.label = "test" 

Donc toujours reme mber toute déclaration en dehors de la déclaration, l'initialisation doit être présente dans une définition de méthode ou de fonction et cela s'applique à la plupart des langages.

Veuillez passer en revue les différents niveaux d'oscilloscope présents. HTH :)

+0

cela m'a certainement aidé à comprendre le problème. J'apprécie la réponse rapide et complète pour aider! – PDX23

1

Vous ne pouvez pas avoir une expression imbriquée dans une classe comme celle-là. Vous pouvez contourner ce problème en plaçant votre code dans une fermeture que vous appelez immédiatement:

classe InterfaceController2: WKInterfaceController {

var payloadtest = { 
    let pt = PayloadTest(label: "test string init") 
    pt.label = "test" 
    return pt 
}() 
0

Essayez ce code ci-dessous fonctionnent avec le type en option -

class PayloadTest { 
    var label: String? 
    init(label:String) { 
     self.label = label 
    } 
} 

Output with the code.

+0

Salut Anand, comment rendre l'étiquette facultative, résout le problème? S'il vous plaît passer par la question. – iamyogish

+0

Je passe déjà par la question et après cela a donné ma réponse à cette personne incapable d'accéder à la variable sur laquelle j'ai travaillé et j'ai eu le même problème après que j'ai trouvé la solution et poster ma réponse ici. @iamyogish –

+0

Il n'est pas capable d'accéder à la propriété payloadtest.label = "test", la propriété label de Payloadtest non pas parce qu'elle n'est pas optionnelle, il essaie d'écrire une instruction exécutable dans une portée de classe. Et cela ne fonctionnera pas puisque toute instruction exécutable en dehors de la déclaration, l'initialisation devrait être présente dans une fonction. – iamyogish

1

vous pouvez essayer de déplacer ce code dans une fonction. (Version 3.0 de Swift)

class InterfaceController: WKInterfaceController { 

    var payloadtest = PayloadTest(label: "test string init") 


    fileprivate func test() { 
    payloadtest.label = "test" // tape this line in a function 
    } 


}