`` Utilisation d'un identifiant non résolu '' dans Swift


93

J'ai donc créé une application et tout fonctionnait très bien. Mais aujourd'hui, j'ai créé une nouvelle classe comme d'habitude et pour une raison quelconque dans cette classe, je ne peux pas accéder à la variable Public / Global à partir d'autres classes. Toutes les autres classes le peuvent, mais maintenant, chaque fois que j'essaye de créer une nouvelle classe, je ne peux pas. Comment cela serait-il réglé?

J'utilise Swift et Xcode 6.

La classe ouvrière:

import UIKit
import Foundation
import Parse
import CoreData

var signedIn = true

class ViewController: UIViewController {

Nouvelle classe:

import UIKit

class NewClass: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        signedIn = false

}

Mais sur signedIn = false

J'obtiens l'erreur:

utilisation de l'identifiant non résolu "signedIn"


et oui j'ai supprimé et recréé cette classe plusieurs fois
Apple Geek

Veuillez montrer votre code, à la fois fonctionnel et non fonctionnel.
Wez

Pouvez-vous spécifier la version de XCode / Swift que vous utilisez (si elle est bêta ou non)?
lchamp

@Ichamp Xcode 6.1 n'est pas bêta.
Apple Geek

1
Est-ce votre code complet? à cause de votre indentation, il semble qu'il vous manque une parenthèse bouclée }à la fin de votreviewDidLoad()
Wez

Réponses:


296

Un problème possible est que votre nouvelle classe a une cible différente ou des cibles différentes de l'autre.

Par exemple, il peut avoir une cible de test tandis que l'autre n'en a pas. Pour ce cas précis, vous devez inclure toutes vos classes dans la cible de test ou aucune d'entre elles.

Cibles


Si la classe est dans une cible différente, assurez-vous de l'importer par-dessus votre fichier swift
Medhi

2
hehe, c'était un problème. J'ai oublié de définir une cible pour la classe. Tnx :)
tBug

Oh mec, j'ai passé quelques heures à résoudre celui-ci. Un tel message d'erreur stupide. Même l'erreur de syntaxe est meilleure!
testée le

yup .. il n'a pas été défini dans une cible pour un projet de test !! merci
reidisaki

1
Le mien était entré, mais j'ai juste décoché puis revérifié, ce qui a corrigé ce problème ET mon autocomplete / intellisense est revenu!
Stephen J

7

«L'utilisation d'un identifiant non résolu» dans Swift peut également se produire lorsque vous avez oublié d'importer une bibliothèque. Par exemple, j'ai l'erreur: entrez la description de l'image ici

Dans lequel j'ai oublié le UIKit

importer UIKit


1
import AVFoundation
Jenita _Alice4Real

6

Une fois, j'ai eu ce problème après avoir renommé un fichier. J'ai renommé le fichier à partir de Xcode, mais par la suite Xcode n'a pas pu trouver la fonction dans le fichier. Même une reconstruction propre n'a pas résolu le problème, mais la fermeture puis la réouverture du projet ont permis à la construction de fonctionner.


Cela fonctionne également pour changer l'emplacement d'un fichier
Logan George le

exactement à droite, j'ai supprimé les références de fichiers, puis les ai ajoutées à nouveau. et tout a fonctionné
Hamed Nova le

4

Parfois, le compilateur est confus au sujet de la syntaxe de votre classe. Cela arrive souvent si vous collez les sources depuis un autre endroit.

Essayez de réduire le fichier source «non résolu» au strict minimum, en nettoyant et en construisant. Une fois qu'il a été construit avec succès, ajoutez toute la complexité à votre classe.

Cela m'a fait disparaître lorsque le redémarrage de Xcode ne fonctionnait pas.


4

Un autre endroit où j'ai vu cette erreur est lorsque votre projet a plusieurs cibles ET plusieurs en-têtes de pontage . S'il s'agit d'une classe partagée, assurez-vous d'ajouter la ressource à tous les en-têtes de pontage.

Un bon conseil est de regarder dans le panneau de gauche Navigateur de problèmes; l'objet racine affichera la cible qui émet la plainte.


3

Pour moi, cette erreur s'est produite parce que j'essayais d'appeler une fonction imbriquée . La seule chose que je devais faire pour la faire réparer était de faire sortir la fonction dans une portée où elle était visible.


Par "amener la fonction à une portée où elle était visible", voulez-vous dire la marquer comme publique?
Barry Jones

Non. Simplement déplacer / faire glisser la fonction vers une portée différente, c'est-à-dire dans le cadre de la classe
Honey

3

Dans mon cas, j'avais un fichier Object-C qui était également dans la même adhésion cible. J'ai corrigé en ajoutant un #import "YourObjectCFileHeader.h"fichier à l'intérieurBridging-Header.h


1

Parce que vous ne l'avez pas déclaré. Si vous souhaitez utiliser une variable d'une autre classe, vous devez utiliser

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var DestViewController : ViewController = segue.destinationViewController as ViewController
    DestViewController.signedIn = false
}

Vous devez mettre ce code à la fin du code NewClass


oui mais j'ai utilisé d'autres classes et elles ont bien fonctionné sans ça, c'est juste quand je crée cette nouvelle classe.
Apple Geek

2
Cela ne fonctionnera pas, il a déclaré la variable signedIn dans la portée globale, pas dans sa classe.
Sam

1

Votre NewClasshérite de UIViewController. Vous avez déclaré signedIndans ViewController. Si vous voulez NewClasspouvoir identifier cette variable, elle devra être déclarée dans une classe dont vous NewClasshéritez.


1

J'ai eu cette erreur pour Mantle Framework dans mon projet Objective-Swift. Ce que j'ai essayé c'est,

  1. Vérifiez si l'importation est présente dans le fichier Bridging-Header.h
  2. Modifiez l'appartenance cible pour Framework dans le fichier Mantle.h comme indiqué dans la capture d'écran ci-dessous.

Basculer entre l'appartenance privée, commencez par créer le projet, vous obtenez des erreurs. Ensuite, construisez le projet avec l'appartenance publique pour tous les frameworks apparus pour le fichier Mantle.h , vous devez réussir.

C'est juste un bug de construction avec plusieurs frameworks dans le projet Objective-C Swift.

entrez la description de l'image ici


0

S'il s'agit d'une classe que vous avez créée, assurez-vous que la classe n'est pas imbriquée.

Fe

A.swift

class A {

   class ARelated {

   }
}

l'appel var b = ARelated()donnera «Utilisation de l'identifiant non résolu: ARelated».

Tu peux soit:

1) séparez les classes si vous le souhaitez sur le même fichier:

A.swift

class A {

}

class ARelated {

}

2) Conservez votre même structure et utilisez la classe englobante pour accéder à la sous-classe:

var b = A.ARelated


0

J'ai fait une erreur stupide. J'ai oublié de mentionner la classe comme publique ou ouverte lors de la mise à jour du code dans l'espace de travail cocoapod.

Veuillez vérifier si l'accesseur fonctionne dans un espace de travail séparé.


0

Vous avez oublié de déclarer la variable. Juste mettre vardevantsignedIn = false


Je suppose que ce n'est qu'une faute de frappe dans le code publié (avec le crochet de fermeture manquant sur viewDidLoad.
shim

0

Mon problème était d'appeler mon programme avec le même nom que l'un de ses cocoapodes. Cela a provoqué un conflit. Solution: créez un nom de programme différent.


0

Cela ne concerne pas directement votre exemple de code, mais en général l'erreur. Je l'écris ici, car Google dirige cette erreur vers cette question, elle peut donc être utile pour les autres développeurs.


Un autre cas d'utilisation où vous pouvez recevoir une telle erreur est lorsque vous ajoutez un sélecteur à une méthode dans une autre classe, par exemple:

private class MockTextFieldTarget {
private(set) var didCallDoneAction = false
    @objc func doneActionHandler() {
        didCallDoneAction = true
    }
}

Et puis dans une autre classe:

final class UITextFieldTests: XCTestCase {
    func testDummyCode() {
        let mockTarget = MockTextFieldTarget()
        UIBarButtonItem(barButtonSystemItem: .cancel, target: mockTarget, action: MockTextFieldTarget.doneActionHandler)
        // ... do something ...
    }
}

Si dans la dernière ligne vous appeliez simplement #selector(cancelActionHandler)au lieu de #selector(MockTextFieldTarget.cancelActionHandler), vous obtiendrez

utilisation d'identifiant non résolu

Erreur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.