रिसीवर प्रकार *** उदाहरण के लिए संदेश एक आगे की घोषणा है


199

मेरे iOS5 ऐप में, मेरे पास NSObject Statesक्लास है, और इसे इनिट करने की कोशिश कर रहा है:

states = [states init];

यहाँ initविधि है States:

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

    return self;
}

लेकिन लाइन में त्रुटि है states = [states init];

उदाहरण के संदेश के लिए रिसीवर प्रकार "स्टेट्स" एक आगे की घोषणा है

इसका क्या मतलब है? मैं क्या गलत कर रहा हूं?


मैंने एक ही प्रश्न को भरने की कोशिश की, लेकिन प्रत्येक थम में अलग-अलग समाधान है। मैं थोड़ा उलझन में हूँ
सेंटिनल

3
बहुत छोटा जवाब है कि आप या तो एक #import (शायद अपनी उपसर्ग फ़ाइल में) याद कर रहे हैं या आप एक "@class एबीसी" याद कर रहे हैं; लाइन ((@hface लाइन के ठीक ऊपर एक। h फ़ाइल में)
Fattie

जवाबों:


440

मूल रूप से इसका मतलब है कि आपको .h फ़ाइल को राज्यों की घोषणा से आयात करने की आवश्यकता है।

हालाँकि, आपके कोड में बहुत सारी अन्य चीजें गलत हैं।

  • आप किसी वस्तु को +alloc'आईएनजी' के बिना कर रहे हैं। यह काम नहीं करेगा
  • आप एक ऑब्जेक्ट को नॉन-पॉइंटर प्रकार के रूप में घोषित कर रहे हैं, जो या तो काम नहीं करेगा
  • आप में नहीं बुला [super init]रहे हैं -init
  • आपने @classहेडर में कक्षा का उपयोग करने की घोषणा की है , लेकिन कभी भी कक्षा का आयात नहीं किया है।

यह थोड़ा अजीब है, हालांकि मेरे मामले में मैंने केवल .hएक परिपत्र संदर्भ मुद्दे के कारण फ़ाइल को हटा दिया है ।
Alper

क्या बिल्कुल हास्यास्पद शब्द है। लेकिन, हाँ, यह तय है।
टिमजेवर्स 2

यदि आप ऑब्जेक्ट-सी में स्विफ्ट ऑब्जेक्ट्स का उपयोग करने का प्रयास कर रहे हैं, तो यह न भूलें कि उन्हें विरासत में प्राप्त करना है NSObject
मीकल Micrůtek

27

एफडब्ल्यूआईडब्ल्यू, मुझे यह त्रुटि तब मिली जब मैं किसी मौजूदा प्रोजेक्ट में कोर डेटा को लागू कर रहा था। यह निकला कि मैं 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

मुझे इस तरह का संदेश मिला जब मेरे पास दो फाइलें थीं जो एक दूसरे पर निर्भर थीं। यहाँ मुश्किल बात यह है कि यदि आप सिर्फ एक-दूसरे को आयात करने का प्रयास करते हैं (वर्ग ए आयात वर्ग बी, वर्ग बी आयात वर्ग ए) उनकी हेडर फ़ाइलों से एक परिपत्र संदर्भ प्राप्त करेंगे। तो इसके बजाय आप क्या करेंगे ( @class Aकक्षाओं में से एक) (वर्ग बी की) हैडर फ़ाइल में एक फॉरवर्ड ( ) घोषणा को जगह दें । हालांकि, जब कक्षा बी के कार्यान्वयन के भीतर कक्षा ए के एक आइवर का उपयोग करने का प्रयास किया जाता है, तो यह बहुत ही त्रुटि सामने आती है, केवल #import "A.h"कक्षा बी की एक .m फ़ाइल में मेरे लिए समस्या तय की गई।


16

मैं इस्तेमाल करने की कोशिश कर रहा था @class "Myclass.h"

जब मैंने इसे बदल दिया #import "Myclass.h", तो यह ठीक काम किया।


यहाँ एक साइड-नोट: @class "Myclass.h"पूरी तरह से गलत है। @class Myclassएक हेडर फ़ाइल में उपयोग किया जाना चाहिए जहां वर्ग आयात नहीं किया जा सकता है (परिपत्र संदर्भ के कारण, जैसे कि उद्देश्य-सी में स्विफ्ट-परिभाषित वर्ग के साथ होगा) लेकिन #import "Myclass.h"अगर इसे आयात किया जा सकता है तो इसका उपयोग किया जाना चाहिए।
उपयोगकर्ता जो

6

आप उपयोग कर रहे हैं

States states;

जहाँ आपको उपयोग करना चाहिए

States *states;

आपका init मेथड इस तरह होना चाहिए

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

अब अंत में जब आप स्टेट्स क्लास के लिए एक ऑब्जेक्ट बनाने जा रहे हैं तो आपको इसे इस तरह करना चाहिए।

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

मैं यह नहीं कह रहा हूं कि यह ऐसा करने का सबसे अच्छा तरीका है। लेकिन यह आपको ऑब्जेक्ट को इनिशियलाइज़ करने के बहुत ही बुनियादी उपयोग को समझने में मदद कर सकता है।


5

यदि आप उद्देश्य C में स्विफ्ट क्लास या विधि का उपयोग करते समय यह त्रुटि प्राप्त कर रहे हैं : आप इस आरेख पर परिभाषित Apple के 2 चरणों में से एक को भूल गए हैं:

यहां छवि विवरण दर्ज करें

उदाहरण:

त्रुटि आपकी Test.mफ़ाइल में दिखाई देती है:

क्लास संदेश के लिए रिसीवर 'MyClass' एक आगे की घोषणा है

चरण 1: जाँच करें कि Test.hहै

@class MyClass;

चरण 2: बिल्ड सेटिंग्स*-Swift.h में फ़ाइल का नाम ढूंढें ( ऑब्जेक्टिव-सी जनरेटेड इंटरफ़ेस हेडर का नाम देखें )। नाम कुछ इस तरह होगाMyModule-Swift.h

चरण 3: जाँच करें कि Test.mउपरोक्त शीर्ष लेख आयात करता है

#import "MyModule-Swift.h"

3

जांचें कि क्या आपने उन कक्षाओं की हेडर फाइलें आयात की हैं जो इस त्रुटि को फेंक रही हैं।


1

सुनिश्चित करें कि आपकी इकाई विधि का प्रोटोटाइप .h फ़ाइल में है।

क्योंकि आप फ़ाइल में विधि को उच्चतर बता रहे हैं, जिससे आप उसे परिभाषित कर रहे हैं, आपको यह संदेश मिलता है। वैकल्पिक रूप से, आप अपने तरीकों को फिर से व्यवस्थित कर सकते हैं, ताकि कॉल करने वाले तरीकों की तुलना में कॉलर्स फ़ाइल में कम हो।


0

दो संबंधित त्रुटि संदेश हैं जो आपको बता सकते हैं कि घोषणाओं और / या आयातों में कुछ गड़बड़ है।

पहला वह है जिसका आप उल्लेख कर रहे हैं, जो आपके .h में एक @class घोषित करते समय अपने .m (या .pch फ़ाइल) में #import नहीं डालकर उत्पन्न किया जा सकता है।

दूसरा जो आप देख सकते हैं, यदि आपके पास अपने राज्यों की श्रेणी में एक विधि है:

- (void)logout:(NSTimer *)timer

#import जोड़ने के बाद यह है:

"स्टेट्स" के लिए कोई दृश्यमान @ प्रस्तुतकर्ता चयनकर्ता को 'लॉगआउट:' घोषित नहीं करता है

यदि आप इसे देखते हैं, तो आपको जाँचने और देखने की आवश्यकता है कि क्या आपने अपनी "लॉगआउट" विधि (इस उदाहरण में) उस वर्ग की .h फ़ाइल में घोषित की है जिसे आप आयात या अग्रेषित कर रहे हैं।

तो आपके मामले में, आपको इसकी आवश्यकता होगी:

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

अपने राज्यों की कक्षा में .h को इन संबंधित त्रुटियों में से एक या दोनों को गायब करने के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.