Objective c Objc标题-功能和功能;协议声明

Objective c Objc标题-功能和功能;协议声明,objective-c,header,protocols,Objective C,Header,Protocols,我在swift上编程已经有几年了,但直到最近我才试图更好地理解Objc。 我正在自己做一个小项目,使用VIPER架构。我有一个使用VIPER的示例.swift项目,现在我只想将其“翻译”到objc以了解语法 我对.h/.m文件有一些问题: 我不知道是应该在.m或.h文件中声明协议(单独声明),还是在.h或.m文件中声明协议(它们所属的类)。 我选择将它们全部放在一个.h文件中,并创建了一个导入它的.m文件。但这看起来很糟糕,因为.m是空的。 此外,在这些协议中,当调用“MyViewControl

我在swift上编程已经有几年了,但直到最近我才试图更好地理解Objc。 我正在自己做一个小项目,使用VIPER架构。我有一个使用VIPER的示例.swift项目,现在我只想将其“翻译”到objc以了解语法

我对.h/.m文件有一些问题: 我不知道是应该在.m或.h文件中声明协议(单独声明),还是在.h或.m文件中声明协议(它们所属的类)。 我选择将它们全部放在一个.h文件中,并创建了一个导入它的.m文件。但这看起来很糟糕,因为.m是空的。 此外,在这些协议中,当调用“MyViewController”作为类型时,我会遇到一个错误,例如“预期的类型”

100%确定问题来自标题。我理解“.h”必须从“.m”文件导入才能编译,我也理解我们不应该多次调用头。 然而,当我有A.h/B.h文件时,我感觉自己被卡住了,我需要从A到B,从A到B都做一些事情。在这种情况下,我如何才能摆脱困境

我的协议.h如下所示:

@protocol SampleProtocol
+ (MyViewController*) createModule; // Error: Expected a type
- (void) pushToView: (UINavigationController*)navController;
@end
@interface MyViewController : UIViewController
@property id<PresenterToRouterObjcProtocol> protocol;
@end
MyViewController.h如下所示:

@protocol SampleProtocol
+ (MyViewController*) createModule; // Error: Expected a type
- (void) pushToView: (UINavigationController*)navController;
@end
@interface MyViewController : UIViewController
@property id<PresenterToRouterObjcProtocol> protocol;
@end
@接口MyViewController:UIViewController
@属性id协议;
@结束

谢谢你的帮助,希望你能告诉我我错过了什么

在Objective-C中,您通常将类放在自己的.h和.m文件中。接口在.h中,实现在.m中。您可以将接口看作是一个可用消息列表,而不包含实现细节,然后实现就是它的实际实现

它可以追溯到C,在C中有.h和.C文件。h文件给出了函数的定义,以便使用它的其他代码知道如何调用它

Objective-C协议只是一个没有实现的接口,实现该协议的类必须提供实际的实现。也就是说,协议将只包含一个.h文件。协议通常会指定类要实现的必需和可选消息

我希望这有助于理解,现在如何解决你的问题。这种情况并不经常发生,但有时确实会发生这样的情况:您需要B中的A,同时也需要A中的B。在这里,我将假设A和B是类,每个类都有自己的.h和.m文件。该问题将是头文件中的一个问题

你可能有这样的东西

A.h


取而代之。

这是金子,你已经回答了所有问题!我真的很高兴我问你,先生,你让我高兴:)谢谢你-我很感激。。。刚刚注意到我的答案中有一个拼写错误!当然,
@interface
@implementation
不使用大括号,而是使用
@end
#import <Foundation...>

// No more import of B.h, but define it for compiler in general terms
@class B; // Now compiler knows there will be a B

// Define class A
@interface A : NSObject

// This will work now as the compiler knows B is coming later
@property (nonatomic,strong) B * b;

@end
@class MyViewController;