Методы пользовательского класса, не распознанные Xcode

#objective-c #cocoa #cocoa-touch #xcode

#objective-c #cocoa #cocoa-touch #xcode

Вопрос:

Я написал следующий пользовательский класс:

AKRelativeDates.h

 #import <Foundation/Foundation.h>
#import "NSDate-Utilities.h"

@interface AKRelativeDates

- (NSString *)relativeDateFromDate:(NSDate *)date in24hFormat:(BOOL)in24hFormat capitalized:(BOOL)capitalized;

@end
  

AKRelativeDates.m

 #import "AKRelativeDates.h"

@implementation AKRelativeDates

- (NSString *)relativeDateFromDate:(NSDate *)date in24hFormat:(BOOL)in24hFormat capitalized:(BOOL)capitalized
{
    // method implementation removed
    return @"test";
}

@end
  

Я импортировал файл заголовка, класс распознан, но метод — нет. Я делаю что-то не так?

Комментарии:

1. Я не вижу date, in24hFormat и т.д… Объявлены в любом месте вашего заголовочного файла. Я вижу, что они объявлены в вашем методе, но вы должны объявить их непосредственно в вашем заголовочном файле.

2. Что вы подразумеваете под «не распознанным»? Получаете ли вы предупреждения в коде, использующем этот метод?

3. @JeremyP Да, я получаю следующее предупреждение: ‘AKRelativeDates’ может не отвечать на ‘ relativeDateFromDate:in24hFormat:capitalized:’, плюс еще одно, что метод не найден, возвращаемый тип по умолчанию равен ‘id’. Завершение кода Xcode также не предлагает этот метод

Ответ №1:

Вы упускаете некоторые вещи из своего заголовка:

 #import <Foundation/Foundation.h>
#import "NSDate-Utilities.h"

@interface AKRelativeDates : NSObject    //Follow the class name with the superclass.

{
    //Now enclose any class objects if any - if none then brackets are optional
}

//And now time for the method declarations:

- (NSString *)relativeDateFromDate:(NSDate *)date in24hFormat:(BOOL)in24hFormat capitalized:(BOOL)capitalized;

@end
  

Кроме того, если это метод класса (т. Е. вы не хотите создавать объект перед использованием этого метода), замените ‘-‘ на ‘ ‘

Комментарии:

1. Скобки необходимы только в том случае, если класс объявляет переменные экземпляра.

2. @Bavarious, которого я не знал 🙂 Изменили ответ, чтобы отразить это.

3. Спасибо! Вот и все, знак » «. Таким образом, он распознается, хотя и происходит сбой… Включение суперкласса (NSObject) также было необходимо, хотя скобки необязательны.

Ответ №2:

Как говорит Джордан, ваш заголовок неполон.

Однако вы также не импортируете его в файл исходного кода, в котором вы используете метод.

Комментарии:

1. Я не включил исходный код, в котором я пытался его использовать.. Однако я указал, что заголовок был импортирован туда.

Ответ №3:

@JeremyP Да, я получаю следующее предупреждение: ‘AKRelativeDates’ может не отвечать на ‘ relativeDateFromDate:in24hFormat:capitalized:‘, плюс еще одно, что метод не найден, возвращаемый тип по умолчанию равен ‘id’. Завершение кода Xcode также не предлагает этот метод

Судя по вашему ответу, вы, вероятно, используете его таким образом:

 [AKRelativeDates relativeDateFromDate:theDate in24hFormat:theIn24hFormat capitalized:theCapitalized];
  

Вы обращаетесь к методу из class, но вы объявили метод как метод экземпляра. @Jordan указал вам правильный ответ в своем последнем предложении. Я просто пытаюсь быть более конкретным.

Измените — на в обоих .файл h и .m, подобный этому:

   (NSString *)relativeDateFromDate:(NSDate *)date in24hFormat:(BOOL)in24hFormat capitalized:(BOOL)capitalized
  

Комментарии:

1. Разница в сообщении об ошибке заключалась в том, что тем временем я пытался изменить несколько вещей в Xcode; на самом деле проблема была со знаком — / , поскольку я намеревался создать этот метод для использования напрямую, без создания экземпляра объекта ранее.