il tipo di destinatario *** per esempio il messaggio è una dichiarazione diretta


199

Nella mia app iOS5, ho NSObject Stateslezione e sto provando a iniziarla:

states = [states init];

ecco il initmetodo in States:

- (id) init
{
    if ((self = [super init]))
    {
        pickedGlasses = 0;
    }

    return self;
}

Ma c'è un errore nella linea states = [states init];

tipo di ricevitore "Stati" per esempio messaggio è una dichiarazione diretta

Cosa significa? Che cosa sto facendo di sbagliato?


Ho provato a trovare la stessa domanda, ma c'è una soluzione diversa in ciascuno di tham. Sono un po 'confuso
SentineL,

3
La risposta molto breve è o ti manca un #import (forse nel tuo file Prefix) o ti manca un "@class Abc;" linea (cioè in un file .h appena sopra la linea
@interface

Risposte:


440

Ciò significa sostanzialmente che è necessario importare il file .h contenente la dichiarazione degli Stati.

Tuttavia, ci sono molte altre cose sbagliate nel tuo codice.

  • Stai entrando in un oggetto senza +allocfarlo. Non funzionerà
  • Stai dichiarando un oggetto come un tipo non puntatore, che non funzionerà neanche
  • Non stai chiamando [super init]in -init.
  • Hai dichiarato la classe utilizzando @classnell'intestazione, ma non hai mai importato la classe.

Questo è un po 'strano, dato che nel mio caso avevo appena rimosso il .hfile a causa di un problema di riferimento circolare.
Alper,

Che formulazione assolutamente ridicola. Ma sì, è stato risolto.
TimJowers2,

Se stai provando a usare gli oggetti Swift in Objective-C, non dimenticare che devono ereditare NSObject.
Michal Šrůtek,

27

FWIW, ho riscontrato questo errore durante l'implementazione dei dati di base in un progetto esistente. Si è scoperto che ho dimenticato di collegare CoreData.h al mio progetto. Avevo già aggiunto il framework CoreData al mio progetto ma ho risolto il problema collegandomi al framework nella mia intestazione precompilata proprio come fanno i modelli di Apple:

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
#endif

2
Che peccato che quasi tutte le esercitazioni su CoreData inizino con l'uso del modello ma non con un progetto esistente. È abbastanza facile sbagliare qui.
Yeung,

24

Ho ricevuto questo tipo di messaggio quando avevo due file che dipendevano l'uno dall'altro. La cosa difficile qui è che otterrai un riferimento circolare se provi a importare l'un l'altro (la classe A importa la classe B, la classe B importa la classe A) dai loro file di intestazione. Quindi quello che faresti è invece inserire una @class Adichiarazione forward ( ) in uno dei file di intestazione delle classi (classe B). Tuttavia, quando si tenta di utilizzare un ivar di classe A all'interno dell'implementazione di classe B, si verifica questo errore, semplicemente aggiungendo un #import "A.h"file .m di classe B risolto il problema per me.


16

Stavo cercando di usare @class "Myclass.h".

Quando l'ho cambiato #import "Myclass.h", ha funzionato bene.


Solo una nota a margine qui: @class "Myclass.h"è completamente errato. @class Myclassdovrebbe essere utilizzato in un file di intestazione in cui la classe non può essere importata (a causa di riferimenti circolari, come si verificherebbe con una classe definita in Swift in Objective-C) ma #import "Myclass.h"dovrebbe essere usata se può essere importata.
Utente che non è un utente il

6

Tu stai usando

States states;

dove dovresti usare

States *states;

Il tuo metodo init dovrebbe essere così

-(id)init {
  if( (self = [super init]) ) {
      pickedGlasses = 0;
  }
  return self;
}

Ora finalmente quando hai intenzione di creare un oggetto per la classe States dovresti farlo in questo modo.

State *states = [[States alloc] init];

Non sto dicendo che questo è il modo migliore per farlo. Ma può aiutarti a capire l'uso basilare dell'inizializzazione degli oggetti.


5

Se ricevi questo errore durante il tentativo di utilizzare la classe o il metodo Swift nell'Obiettivo C : hai dimenticato uno dei 2 passaggi che Apple ha definito in questo diagramma:

inserisci qui la descrizione dell'immagine

Esempio:

Errore visualizzato nel tuo Test.mfile:

Il destinatario "MyClass" per il messaggio di classe è una dichiarazione in avanti

Passaggio 1: verificare che Test.habbia

@class MyClass;

Passaggio 2: trova *-Swift.hil nome del file in Impostazioni build (cerca il nome dell'intestazione dell'interfaccia generata da Objective-C ). Il nome sarà qualcosa di simileMyModule-Swift.h

Passaggio 3: verificare che Test.mimporti l'intestazione sopra

#import "MyModule-Swift.h"

3

Controlla se hai importato i file di intestazione delle classi che generano questo errore.


1

Assicurarsi che il prototipo per il metodo dell'unità sia nel file .h.

Poiché stai chiamando il metodo più in alto nel file rispetto a quello che stai definendo, ricevi questo messaggio. In alternativa, è possibile riorganizzare i metodi, in modo che i chiamanti siano più bassi nel file rispetto ai metodi che chiamano.


0

Esistono due messaggi di errore correlati che potrebbero indicare che qualcosa non va nelle dichiarazioni e / o nelle importazioni.

Il primo è quello a cui ti riferisci, che può essere generato NON inserendo un #import nel tuo .m (o file .pch) mentre dichiari un @class nel tuo .h.

Il secondo che potresti vedere, se avessi un metodo nella tua classe States come:

- (void)logout:(NSTimer *)timer

dopo aver aggiunto #import è questo:

@Interface visibile per "States" dichiara il selettore 'logout:'

Se vedi questo, devi controllare e vedere se hai dichiarato il tuo metodo di "logout" (in questo caso) nel file .h della classe che stai importando o inoltrando.

Quindi nel tuo caso, avresti bisogno di un:

- (void)logout:(NSTimer *)timer;

nella classe h del tuo Stato per far scomparire uno o entrambi questi errori correlati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.