ผู้รับประเภท *** สำหรับข้อความตัวอย่างเป็นการประกาศล่วงหน้า


199

ในแอพ iOS5 ของฉันฉันมีNSObject Statesชั้นเรียนและพยายามเริ่ม:

states = [states init];

นี่คือinitวิธีการในStates:

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

    return self;
}

แต่มีข้อผิดพลาดในบรรทัด states = [states init];

ผู้รับประเภท "สถานะ" สำหรับข้อความตัวอย่างเป็นการประกาศล่วงหน้า

มันหมายความว่าอะไร? ผมทำอะไรผิดหรือเปล่า?


ฉันพยายามตอบคำถามเดียวกัน แต่มีวิธีแก้ปัญหาที่แตกต่างกันในแต่ละ tham ฉันสับสนนิดหน่อย
SentineL

3
คำตอบสั้น ๆ ก็คือคุณไม่มี #import (อาจอยู่ในไฟล์ Prefix ของคุณ) หรือคุณขาด "@class Abc;" บรรทัด (เช่นในไฟล์. h ที่อยู่เหนือบรรทัด @interface)
Fattie

คำตอบ:


440

นั่นหมายความว่าคุณต้องนำเข้าไฟล์. h ที่มีการประกาศสถานะ

แต่มีเป็นจำนวนมากของสิ่งอื่น ๆ ที่ไม่ถูกต้องกับรหัสของคุณ

  • คุณกำลังเริ่มต้นวัตถุโดยไม่ต้อง+allocเข้าไป นั่นไม่ได้ผล
  • คุณกำลังประกาศวัตถุเป็นชนิดที่ไม่ใช่ตัวชี้ซึ่งจะไม่ทำงานเช่นกัน
  • คุณไม่ได้เรียกร้องใน[super init]-init
  • คุณได้ประกาศคลาสที่ใช้@classในส่วนหัว แต่ไม่เคยนำเข้าชั้นเรียน

มันค่อนข้างแปลก แต่เนื่องจากในกรณีของฉันฉันเพิ่งลบ.hไฟล์เนื่องจากปัญหาการอ้างอิงแบบวงกลม
Alper

ช่างเป็นถ้อยคำที่ไร้สาระอย่างยิ่ง แต่ใช่ว่าแก้ไขแล้ว
TimJowers2

ถ้าคุณกำลังพยายามที่จะใช้วัตถุสวิฟท์ใน Objective-C, 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 เกือบทั้งหมดเริ่มต้นด้วยการใช้เทมเพลต แต่ไม่ใช่กับโครงการที่มีอยู่ มันค่อนข้างง่ายที่จะทำผิดพลาดที่นี่
เหยิง

24

ฉันได้รับข้อความประเภทนี้เมื่อฉันมีสองไฟล์ที่ขึ้นอยู่กับแต่ละไฟล์ สิ่งที่ยุ่งยากก็คือคุณจะได้รับการอ้างอิงแบบวงกลมถ้าคุณเพียงแค่พยายามนำเข้าซึ่งกันและกัน (คลาส A อิมพอร์ตคลาส B, คลาส B อิมพอร์ตคลาส A) จากไฟล์ส่วนหัว ดังนั้นสิ่งที่คุณจะทำคือแทนที่การส่งต่อ ( @class A) ประกาศในหนึ่งในไฟล์ส่วนหัวของคลาส (คลาส B) อย่างไรก็ตามเมื่อพยายามใช้ ivar ของคลาส A ภายในการใช้คลาส B ข้อผิดพลาดนี้เกิดขึ้นเพียงเพิ่ม#import "A.h"ไฟล์. m ของคลาส B เพื่อแก้ไขปัญหาสำหรับฉัน


16

@class "Myclass.h"ผมพยายามที่จะใช้

เมื่อฉันเปลี่ยนเป็น#import "Myclass.h"มันใช้งานได้ดี


เพียงแค่บันทึกด้านข้างที่นี่: @class "Myclass.h"ไม่ถูกต้องสมบูรณ์ @class Myclassควรใช้ในไฟล์ส่วนหัวที่ไม่สามารถนำเข้าคลาส (เนื่องจากการอ้างอิงแบบวงกลมเช่นจะเกิดขึ้นกับคลาสที่กำหนด Swift ใน Objective-C) แต่#import "Myclass.h"ควรใช้หากสามารถนำเข้าได้
ผู้ใช้ที่ไม่ใช่ผู้ใช้

6

คุณกำลังใช้

States states;

ที่ไหนที่คุณควรใช้

States *states;

วิธีการเริ่มต้นของคุณควรเป็นเช่นนี้

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

ในที่สุดเมื่อคุณจะสร้างวัตถุสำหรับคลาส States คุณควรทำเช่นนี้

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

ฉันไม่ได้บอกว่านี่เป็นวิธีที่ดีที่สุดในการทำสิ่งนี้ แต่อาจช่วยให้คุณเข้าใจการใช้งานเบื้องต้นของการเริ่มต้นวัตถุ


5

หากคุณได้รับข้อผิดพลาดนี้ขณะพยายามใช้ Swift class หรือวิธีการใน Objective C : คุณลืมหนึ่งใน 2 ขั้นตอนที่ Apple กำหนดไว้ในแผนภาพนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่าง:

เกิดข้อผิดพลาดในTest.mไฟล์ของคุณ:

ผู้รับ 'MyClass' สำหรับข้อความในชั้นเรียนเป็นการประกาศล่วงหน้า

ขั้นตอนที่ 1: ตรวจสอบว่าTest.hมี

@class MyClass;

ขั้นตอนที่ 2: ค้นหา*-Swift.hชื่อไฟล์ในBuild Settings (ค้นหาชื่อส่วนหัวของอินเตอร์เฟสที่สร้าง C เป้าหมาย ) ชื่อจะเป็นอย่างไรMyModule-Swift.h

ขั้นตอนที่ 3: ตรวจสอบว่าTest.mนำเข้าส่วนหัวด้านบน

#import "MyModule-Swift.h"


1

ตรวจสอบให้แน่ใจว่าต้นแบบสำหรับวิธีการหน่วยของคุณอยู่ในไฟล์. h

เนื่องจากคุณกำลังเรียกวิธีการในไฟล์สูงกว่าที่คุณกำหนดไว้คุณจะได้รับข้อความนี้ อีกวิธีหนึ่งคุณสามารถจัดเรียงวิธีการของคุณใหม่เพื่อให้ผู้โทรอยู่ในไฟล์ต่ำกว่าวิธีที่พวกเขาเรียก


0

มีข้อความแสดงข้อผิดพลาดที่เกี่ยวข้องสองข้อความที่อาจบอกคุณว่ามีบางอย่างผิดปกติกับการประกาศและ / หรือการนำเข้า

สิ่งแรกคือสิ่งที่คุณอ้างถึงซึ่งสามารถสร้างขึ้นได้โดยไม่ใส่ #import ในไฟล์. m (หรือ. pch) ของคุณในขณะที่ประกาศ @class ใน. h

ครั้งที่สองที่คุณอาจเห็นว่าถ้าคุณมีวิธีการในชั้นเรียนรัฐของคุณเช่น:

- (void)logout:(NSTimer *)timer

หลังจากเพิ่ม #import คือ:

ไม่มี @interface ที่มองเห็นได้สำหรับ "สถานะ" ประกาศตัวเลือก 'ออกจากระบบ:'

หากคุณเห็นสิ่งนี้คุณจะต้องตรวจสอบและดูว่าคุณได้ประกาศวิธี "ออกจากระบบ" (ในอินสแตนซ์นี้) ในไฟล์. h ของคลาสที่คุณกำลังนำเข้าหรือส่งต่อหรือไม่

ดังนั้นในกรณีของคุณคุณจะต้อง:

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

ใน. hs class class ของคุณเพื่อทำให้ข้อผิดพลาดที่เกี่ยวข้องอย่างใดอย่างหนึ่งหรือทั้งคู่หายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.