alıcı tipi *** örneğin mesaj bir ileri bildirimdir


199

İOS5 uygulamamda NSObject Statesdersim var ve başlatmaya çalışıyorum:

states = [states init];

İşte inityöntemi States:

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

    return self;
}

Ancak satırda hata var states = [states init];

alıcı tipi "Durumlar" örneğin mesaj bir ileri bildirimdir

Bu ne demek? Neyi yanlış yapıyorum?


Aynı soruyu sormaya çalıştım, ama her tham'da farklı bir çözüm var. Biraz kafam karıştı
SentineL

3
Bunun en kısa cevabı ya bir #import'u (belki de Prefix dosyanızda) ya da "@class Abc;" satırı (yani, @interface satırının hemen üzerindeki bir .h dosyasında)
Fattie

Yanıtlar:


440

Bu, temelde Durum bildirimini içeren .h dosyasını içe aktarmanız gerektiği anlamına gelir.

Ancak, kodunuzda yanlış olan birçok şey var .

  • Bir nesneyi onsuz yapıyorsunuz +alloc. Bu işe yaramayacak
  • Bir nesneyi işaretçi olmayan tür olarak bildiriyorsunuz, bu da çalışmıyor
  • Sen demeyeceğiz [super init]de -init.
  • Sınıfı @classbaşlıkta kullanarak ilan ettiniz , ancak hiçbir zaman sınıfı içe aktarmadınız.

Bu biraz garip olsa da, çünkü benim durumumda .hdosyayı dairesel bir referans sorunu nedeniyle kaldırmıştım .
Alper

Ne kadar saçma bir ifade. Ama evet, bunu düzelttim.
TimJowers2

Swift nesnelerini Objective-C'de kullanmaya çalışıyorsanız, miras almaları gerektiğini unutmayın NSObject.
Michal Šrůtek

27

FWIW, mevcut bir projeye temel verileri uygularken bu hatayı aldım. CoreData.h'ı projeme bağlamayı unuttum. CoreData çerçevesini projeme ekledim, ancak Apple'ın şablonları gibi önceden derlenmiş başlığımda çerçeveye bağlayarak sorunu çözdüm:

#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
Ne hemen hemen tüm CoreData öğretici şablonu kullanmak, ancak mevcut bir proje ile başlamak ne yazık. Burada hata yapmak oldukça kolaydır.
Yeung

24

Birbirine bağlı iki dosyam olduğunda bu tür bir mesaj aldım. Buradaki zor olan şey, üstbilgi dosyalarından birbirlerini (A sınıfı içe aktarma sınıfı B, B sınıfı içe aktarma sınıfı) içe aktarmaya çalışırsanız dairesel bir başvuru elde etmenizdir. Bunun yerine @class A, sınıfların (B sınıfı) başlık dosyalarından birine forward ( ) bildirimi yerleştirmek. Bununla birlikte, B sınıfının uygulanması içinde A sınıfı bir ivar kullanmaya çalışıldığında, bu hata ortaya çıkar, sadece #import "A.h"B sınıfı bir .m dosyasına bir ekleme ekleyerek sorunu çözdüm.


16

Kullanmaya çalışıyordum @class "Myclass.h".

Bunu değiştirdiğimde #import "Myclass.h"işe yaradı.


Burada sadece bir yan not: @class "Myclass.h"tamamen yanlış. @class Myclasssınıfın içe aktarılamadığı bir başlık dosyasında kullanılmalıdır (Objective-C'de Swift tanımlı bir sınıfla gerçekleşecek gibi dairesel başvuru nedeniyle) ancak #import "Myclass.h"içe aktarılabiliyorsa kullanılmalıdır.
Kullanıcı olmayan kullanıcı

6

Kullanıyorsun

States states;

nerede kullanman gerektiği

States *states;

İnit yönteminiz şu şekilde olmalıdır

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

Son olarak States sınıfı için bir nesne yaratacağınız zaman bunu böyle yapmalısınız.

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

Bunu yapmanın en iyi yolu olduğunu söylemiyorum. Ancak, nesneleri başlatmanın çok temel kullanımını anlamanıza yardımcı olabilir.


5

Amaç C'de Swift sınıfını veya yöntemini kullanmaya çalışırken bu hatayı alıyorsanız : Apple'ın bu diyagramda tanımlanan 2 adımından birini unuttunuz:

resim açıklamasını buraya girin

Misal:

Test.mDosyanızda hata görünüyor :

Sınıf mesajı için 'MyClass' alıcısı bir ileri bildirimdir

1. Adım: onay Test.hsahiptir

@class MyClass;

2.Adım: Derleme Ayarları'nda*-Swift.h dosya adını bulun ( Objective-C Oluşturulmuş Arabirim Üstbilgi Adı konusuna bakın ). İsim gibi bir şey olacakMyModule-Swift.h

3.Adım: Test.mYukarıdaki üstbilgiyi içeri aktarıp almadığınızı kontrol edin

#import "MyModule-Swift.h"

3

Bu hatayı atanan sınıfların başlık dosyalarını içe aktarıp aktarmadığınızı kontrol edin.


1

Birim yönteminizin prototipinin .h dosyasında olduğundan emin olun.

Yöntemi dosyada tanımladığınızdan daha yüksek olarak çağırdığınız için bu iletiyi alırsınız. Alternatif olarak, yöntemlerinizi yeniden düzenleyebilirsiniz, böylece arayanlar dosyada aradıkları yöntemlerden daha düşük olur.


0

Bildirimler ve / veya içe aktarma işlemlerinde bir sorun olduğunu söyleyebilecek ilgili iki hata mesajı vardır.

Birincisi, .h dosyasında bir @class bildirilirken .m (veya .pch dosyanız) içine bir #import yerleştirilmemesiyle oluşturulabileceğiniz addır.

Görebileceğiniz saniye, Devletler sınıfınızda aşağıdaki gibi bir yönteminiz varsa:

- (void)logout:(NSTimer *)timer

#import ekledikten sonra:

"Durumlar" için görünen @interface seçeneği seçmeden 'oturum kapatma:'

Bunu görürseniz, içe aktardığınız veya ilettiğiniz sınıfın .h dosyasında (bu örnekte) "çıkış" yönteminizi bildirip bildirmediğinizi kontrol etmeniz ve görmeniz gerekir.

Yani sizin durumunuzda şunlara ihtiyacınız olacak:

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

İlgili sınıf hatalarından birini veya her ikisini birden ortadan kaldırmak için, Devletler sınıfınızın .h dosyasında.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.