Наприклад, приймач типу ***, наприклад, повідомлення - це пряма заява


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 Abc;" рядок (тобто у .h-файлі трохи вище рядка @interface)
Fattie

Відповіді:


440

Це в основному означає, що вам потрібно імпортувати .h файл, що містить декларацію штатів.

Однак у вашому коді є багато інших помилок.

  • Ви -направляєте об'єкт, не +allocвикористовуючи його. Це не спрацює
  • Ви декларуєте об'єкт як тип, що не вказує, який також не працюватиме
  • Ви не викликаючи [super init]в -init.
  • Ви оголосили клас із використанням @classу заголовку, але ніколи не імпортували клас.

Це трохи дивно, оскільки в моєму випадку я просто видалив .hфайл через проблему кругової посилання.
Альпер

Яке абсолютно смішне формулювання. Але, так, це виправило.
TimJowers2

Якщо ви намагаєтесь використовувати об'єкти Swift в 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

Таке повідомлення я отримав, коли мав два файли, які залежали один від одного. Тут складно, що ви отримаєте циркулярну довідку, якщо просто спробуєте імпортувати один одного (клас А імпортує клас В, клас В імпортує клас А) із їхніх заголовкових файлів. Тож, що ви зробите, це замість того, щоб розмістити форвард ( @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;

Ваш метод init повинен бути таким

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

Тепер, нарешті, коли ви збираєтеся створити об’єкт для класу States, ви повинні зробити це так.

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

Я не кажу, що це найкращий спосіб зробити це. Але це може допомогти вам зрозуміти саме основне використання об'єктів ініціалізації.


5

Якщо ви отримуєте цю помилку під час спроби використання класу або методу Swift в Objective C : ви забули один з 2 кроків, визначених Apple на цій схемі:

введіть тут опис зображення

Приклад:

У вашому 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

Є два пов'язані з ними повідомлення про помилки, які можуть сказати вам, що декларації та / або імпорт не в порядку.

Перший - це той, про який ви посилаєтесь, який може бути згенерований НЕ введенням #import у ваш .m (або .pch файл), оголошуючи @class у вашому .h.

Другий, який ви можете побачити, якби у вас був клас у штаті:

- (void)logout:(NSTimer *)timer

після додавання #import це:

Немає видимого @interface для "States" оголошує селектор "logout:"

Якщо ви бачите це, вам потрібно перевірити і перевірити, чи оголосили ви свій метод "виходу" (у цьому випадку) у .h файл класу, який ви імпортуєте чи пересилаєте.

Тож у вашому випадку вам знадобиться:

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

у .h для вашого класу States, щоб зникнути одна чи обидві пов'язані помилки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.