レシーバータイプ***インスタンスメッセージは前方宣言です


199

私のiOS5アプリには、NSObject Statesクラスがあり、それを初期化しようとしています。

states = [states init];

ここにinitメソッドがありStatesます:

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

    return self;
}

しかし、行にエラーがあります states = [states init];

インスタンスメッセージのレシーバータイプ「状態」は転送宣言です

どういう意味ですか?何が悪いのですか?


私は同じ質問を見つけようとしましたが、タムごとに異なる解決策があります。私は少し混乱しています
SentineL

3
非常に短い答えは、#import(おそらくPrefixファイルにある)が欠落しているか、「@ class Abc;」が欠落していることです。行(つまり、@ interface行のすぐ上にある.hファイル内)
Fattie

回答:


440

つまり、状態の宣言を含む.hファイルをインポートする必要があります。

ただし、コードには他にも多くの問題があります。

  • オブジェクトを+alloc「初期化」せずに「初期化」しています。それはうまくいきません
  • オブジェクトを非ポインター型として宣言していますが、これも機能しません
  • あなたは電話[super init]していません-init
  • @classヘッダーでを使用してクラスを宣言しましたが、クラスをインポートしていません。

私の場合.h、循環参照の問題のためにファイルを削除しただけなので、これは少し奇妙です。
アルパー、

なんというばかげた言い回し。しかし、うん、それはそれを修正しました。
TimJowers2

Objective-CでSwiftオブジェクトを使用する場合は、それらをから継承する必要があることを忘れないでくださいNSObject
MichalŠrůtek

27

FWIW、コアデータを既存のプロジェクトに実装しているときにこのエラーが発生しました。CoreData.hをプロジェクトにリンクするのを忘れたことがわかりました。私はすでにCoreDataフレームワークをプロジェクトに追加していましたが、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
CoreDataチュートリアルのほとんどすべてが、既存のプロジェクトではなくテンプレートを使用して開始するのは残念です。ここで間違いを犯すのは非常に簡単です。
Yeung

24

互いに依存する2つのファイルがあるときに、このようなメッセージが表示されました。ここでトリッキーなことは、ヘッダーファイルから相互にインポートしようとすると(クラスAがクラスBをインポートし、クラスBがクラスAをインポートする)、循環参照を取得することです。したがって、代わりに@class Aクラス(クラスB)のヘッダーファイルの1つにforward()宣言を配置します。ただし、クラスBの実装内でクラスAのivarを使用しようとすると、この非常にエラーが発生し、#import "A.h"クラスBの.mファイルにを追加するだけで問題が解決しました。


16

使ってみました @class "Myclass.h"

に変更したところ#import "Myclass.h"、問題なく動作しました。


ここでの補足だけです:@class "Myclass.h"完全に間違っています。@class Myclassクラスをインポートできないヘッダーファイルで使用する必要があります(Objective-CのSwift定義クラスで発生するような循環参照のため)が、#import "Myclass.h"インポートできる場合は使用する必要があります。
ユーザーではないユーザー

6

使用しています

States states;

どこを使うべきか

States *states;

あなたのinitメソッドはこのようにする必要があります

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

最後に、Statesクラスのオブジェクトを作成する場合は、次のようにします。

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

これがこれを行う最良の方法であるとは言っていません。ただし、オブジェクトの初期化の非常に基本的な使用法を理解するのに役立つ場合があります。


5

Objective CでSwiftクラスまたはメソッドを使用しようとしているときにこのエラーが発生した場合:この図でAppleが定義した2つのステップのいずれかを忘れた場合:

ここに画像の説明を入力してください

例:

エラーがTest.mファイルに表示されます:

クラスメッセージの受信者 'MyClass'は前方宣言です

ステップ1:チェックTest.hあり

@class MyClass;

ステップ2:ビルド設定で*-Swift.hファイル名を見つけます(Objective-Cで生成されたインターフェイスヘッダー名を探します)。名前は次のようになりますMyModule-Swift.h

手順3:Test.m上記のヘッダーがインポートされることを確認する

#import "MyModule-Swift.h"

3

このエラーをスローしているクラスのヘッダーファイルをインポートしたかどうかを確認します。


1

ユニットメソッドのプロトタイプが.hファイルにあることを確認してください。

定義しているよりもファイル内で上位のメソッドを呼び出しているため、このメッセージが表示されます。または、メソッドを再配置して、呼び出し元が呼び出すメソッドよりもファイル内で下に来るようにすることもできます。


0

宣言やインポートに問題があることを通知する可能性のある2つの関連するエラーメッセージがあります。

1つ目はあなたが参照しているもので、.hで@classを宣言するときに.m(または.pchファイル)に#importを入れないことで生成できます。

2番目の例は、Statesクラスに次のようなメソッドがある場合です。

- (void)logout:(NSTimer *)timer

#importを追加した後は次のようになります。

「状態」の目に見える@インターフェースでは、セレクター「ログアウト」を宣言していません。

これが表示された場合は、インポートまたは転送するクラスの.hファイルで(このインスタンスの)「ログアウト」メソッドを宣言したかどうかを確認する必要があります。

したがって、あなたの場合、次のものが必要です:

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

ステートクラスの.hで、これらの関連エラーの一方または両方を非表示にします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.