Ios 将自定义对象导入多个文件

Ios 将自定义对象导入多个文件,ios,objective-c,jsonmodel,Ios,Objective C,Jsonmodel,我在将自定义对象导入viewController时遇到了一些问题 我创建了一个消息对象,它保存来自服务器的json响应。 然后我创建了一个MessageManager类,它完成对API的所有网络调用 MessageManager导入消息,以创建消息对象并将其传递给使用它的任何类 我现在有了viewController类,它可以同时导入MessageManager和Message。所以我可以创建Message的实例变量。 但是,我在编译器中遇到了重复的符号错误 我如何避开这个问题,并有正确的导入顺

我在将自定义对象导入viewController时遇到了一些问题

我创建了一个消息对象,它保存来自服务器的json响应。 然后我创建了一个MessageManager类,它完成对API的所有网络调用

MessageManager导入消息,以创建消息对象并将其传递给使用它的任何类

我现在有了viewController类,它可以同时导入MessageManager和Message。所以我可以创建Message的实例变量。 但是,我在编译器中遇到了重复的符号错误

我如何避开这个问题,并有正确的导入顺序

如果我从viewcontroller中删除Message.h,并删除任何引用消息的代码,它将正常编译

由JSONModel返回并解析json对象的Messages.h
根据您在问题中提到的文件,您的项目中只有
Messages.h
文件,没有
Messages.m
文件,而是在头文件中声明了实现,对吗?通过复制问题中的类,我能够复制示例项目I中的重复符号错误。但是当我用
Messages
MessageManager
类的实现创建Messages.m文件时,重复符号编译器错误消失了,我能够创建
MessageManager
类的实例

话虽如此,我不知道你说的是什么意思


JSONModel教程都显示在头中执行@implementation,而根本不需要.m文件

评论,但根据JSONModel的说法,他们说:

不需要在实现(.m)文件中执行任何操作

这可能并不意味着你不需要.m文件。无论如何,一个类同时拥有.h和.m文件是一个好的做法,因为Xcode项目目标的
构建阶段
选项卡下的
编译源代码
选项只有.m文件。这告诉编译器在构建目标时应该编译哪些源文件。由于您在.h文件中声明了实现,编译器在构建时无法找到它

下面是示例Xcode项目I设置的屏幕截图:

MessageManager.h文件

#import <Foundation/Foundation.h>
@class MessagesModel;

@interface MessageManager : NSObject

+ (MessagesModel *)getMessages;

@end
ViewController.m文件:

#import "MessageManager.h"
#import "Messages.h" //<-- Imported here

@implementation MessageManager

+ (MessagesModel *)getMessages {
    NSError *error = nil;
    NSDictionary *dictionary = @{@"action": @"replied",
                                 @"dateTime": @"",
                                 @"result": @"success",
                                 @"numItems": @"1",
                                 @"items": @[@{@"id": @"1",
                                               @"sender_id": @"2",
                                               @"receiver_id": @"3",
                                               @"user_user_id": @"4",
                                               @"job_id": @"5",
                                               @"file_id": @"6",
                                               @"title": @"Hello world",
                                               @"replied" : @"7"}]};
    MessagesModel *messages = [[MessagesModel alloc] initWithDictionary:dictionary error:&error];
    if (error)
        NSLog(@"Oops!");

    return messages;
}

@end
#import "ViewController.h"
#import "MessageManager.h"
#import "Messages.h" //<-- Imported here

@interface ViewController ()

@property (strong, nonatomic) MessagesModel *messagesModel;
@property (weak, nonatomic) NSArray<Messages *> *messages;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.messagesModel = [MessageManager getMessages];
    self.messages = self.messagesModel.items;
    NSLog(@"%@", self.messages);
}

@end
#导入“ViewController.h”
#导入“MessageManager.h”

#导入“Messages.h”/基于您在问题中提到的文件,您的项目中只有
Messages.h
文件,没有
Messages.m
文件,而是在头文件中声明实现,对吗?通过复制问题中的类,我能够复制示例项目I中的重复符号错误。但是当我用
Messages
MessageManager
类的实现创建Messages.m文件时,重复符号编译器错误消失了,我能够创建
MessageManager
类的实例

话虽如此,我不知道你说的是什么意思


JSONModel教程都显示在头中执行@implementation,而根本不需要.m文件

评论,但根据JSONModel的说法,他们说:

不需要在实现(.m)文件中执行任何操作

这可能并不意味着你不需要.m文件。无论如何,一个类同时拥有.h和.m文件是一个好的做法,因为Xcode项目目标的
构建阶段
选项卡下的
编译源代码
选项只有.m文件。这告诉编译器在构建目标时应该编译哪些源文件。由于您在.h文件中声明了实现,编译器在构建时无法找到它

下面是示例Xcode项目I设置的屏幕截图:

MessageManager.h文件

#import <Foundation/Foundation.h>
@class MessagesModel;

@interface MessageManager : NSObject

+ (MessagesModel *)getMessages;

@end
ViewController.m文件:

#import "MessageManager.h"
#import "Messages.h" //<-- Imported here

@implementation MessageManager

+ (MessagesModel *)getMessages {
    NSError *error = nil;
    NSDictionary *dictionary = @{@"action": @"replied",
                                 @"dateTime": @"",
                                 @"result": @"success",
                                 @"numItems": @"1",
                                 @"items": @[@{@"id": @"1",
                                               @"sender_id": @"2",
                                               @"receiver_id": @"3",
                                               @"user_user_id": @"4",
                                               @"job_id": @"5",
                                               @"file_id": @"6",
                                               @"title": @"Hello world",
                                               @"replied" : @"7"}]};
    MessagesModel *messages = [[MessagesModel alloc] initWithDictionary:dictionary error:&error];
    if (error)
        NSLog(@"Oops!");

    return messages;
}

@end
#import "ViewController.h"
#import "MessageManager.h"
#import "Messages.h" //<-- Imported here

@interface ViewController ()

@property (strong, nonatomic) MessagesModel *messagesModel;
@property (weak, nonatomic) NSArray<Messages *> *messages;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.messagesModel = [MessageManager getMessages];
    self.messages = self.messagesModel.items;
    NSLog(@"%@", self.messages);
}

@end
#导入“ViewController.h”
#导入“MessageManager.h”

#导入“Messages.h”//听起来,Message.h中的内容可能不止是声明。你能复制并粘贴说明哪些符号被复制到你的问题中的确切信息吗?@PhillipMills添加了使用jsonModelDon编写的message.h,它不能将
@implementation
内容放在.h文件中。永远!:)实现在.m中,JSONModel教程都显示在头中执行@implementation,而根本不需要.m文件,您可以随心所欲,但我建议将这几行移到一个.m文件中,看看重复符号错误是否消失。听起来您可能有更多的内部消息.h,而不仅仅是声明。你能复制并粘贴说明哪些符号被复制到你的问题中的确切信息吗?@PhillipMills添加了使用jsonModelDon编写的message.h,它不能将
@implementation
内容放在.h文件中。永远!:)实现放在.m中。JSONModel教程都显示在头中执行@implementation,而根本不需要.m文件。好吧,你可以随心所欲,但我建议将这几行移到.m文件中,看看你的重复符号错误是否消失。我已经试着向他解释了一周了。我希望你有更好的运气,我做到了。@PhillipMills是的,我看到了你所有的评论。我只是想用一种更精细的方式来表达我已经试着向他解释了一个星期了。我希望你有更好的运气,我做到了。@PhillipMills是的,我看到了你所有的评论。我只是觉得我应该用更详细的方式来表达
#import <Foundation/Foundation.h>
@class MessagesModel;

@interface MessageManager : NSObject

+ (MessagesModel *)getMessages;

@end
#import "MessageManager.h"
#import "Messages.h" //<-- Imported here

@implementation MessageManager

+ (MessagesModel *)getMessages {
    NSError *error = nil;
    NSDictionary *dictionary = @{@"action": @"replied",
                                 @"dateTime": @"",
                                 @"result": @"success",
                                 @"numItems": @"1",
                                 @"items": @[@{@"id": @"1",
                                               @"sender_id": @"2",
                                               @"receiver_id": @"3",
                                               @"user_user_id": @"4",
                                               @"job_id": @"5",
                                               @"file_id": @"6",
                                               @"title": @"Hello world",
                                               @"replied" : @"7"}]};
    MessagesModel *messages = [[MessagesModel alloc] initWithDictionary:dictionary error:&error];
    if (error)
        NSLog(@"Oops!");

    return messages;
}

@end
#import <JSONModel/JSONModel.h>

@protocol Messages;
@interface Messages : JSONModel
@property (nonatomic) NSString<Optional>* id;
@property (nonatomic) NSString<Optional>* sender_id;
@property (nonatomic) NSString<Optional>* receiver_id;
@property (nonatomic) NSString<Optional>* user_user_id;
@property (nonatomic) NSString<Optional>* job_id;
@property (nonatomic) NSString<Optional>* file_id;
@property (nonatomic) NSString<Optional>* title;
@property (nonatomic) NSString<Optional>* replied;
@end


@protocol MessagesModel;
@interface MessagesModel : JSONModel
@property (nonatomic) NSString<Optional>* action;
@property (nonatomic) NSDate<Optional>* dateTime;
@property (nonatomic) NSString<Optional>* result;
@property (nonatomic) NSString<Optional>* numItems;
@property (nonatomic, strong) NSArray <Messages>  *items;
@end
#import "Messages.h"

@implementation Messages

@end

@implementation MessagesModel

+ (JSONKeyMapper *)keyMapper {
    return [JSONKeyMapper mapperForSnakeCase];
}

@end
#import "ViewController.h"
#import "MessageManager.h"
#import "Messages.h" //<-- Imported here

@interface ViewController ()

@property (strong, nonatomic) MessagesModel *messagesModel;
@property (weak, nonatomic) NSArray<Messages *> *messages;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.messagesModel = [MessageManager getMessages];
    self.messages = self.messagesModel.items;
    NSLog(@"%@", self.messages);
}

@end