目标C - 如何创建界面?

ary*_*axt 5 interface objective-c

我需要能够创建一个像在C#中创建的接口来强制执行一组类来实现某些方法.这在目标c中是否可行?

Elf*_*red 29

您可以创建协议.它看起来像这样:在MyProtocol.h中:

@protocol MyProtocol
-(void)myMethod;
-(void)myMethod2;
@end
Run Code Online (Sandbox Code Playgroud)

在MyClass.h中

#import "MyProtocol.h"
@interface MyClass : NSObject<MyProtocol>
@end
Run Code Online (Sandbox Code Playgroud)

如果要接收给定协议的对象,可以这样做:

id<MyProtocol> var;
Run Code Online (Sandbox Code Playgroud)

要么

NSObject<MyProtocol> *var;
Run Code Online (Sandbox Code Playgroud)

更多信息在这里


Bar*_*ark 8

您使用声明"协议"(Objective-C的接口)

@protocol MyProtocol <BaseProtocol1,...,BaseProtocolN>
//methods and properties
@end
Run Code Online (Sandbox Code Playgroud)

where <BaseProtocol>是可选的,表示MyProtocol"继承" BaseProtocol的界面.该NSObject协议在此上下文中很有用,因为它允许您使用

@protocol MyProtocol <NSObject>
//...
@end
Run Code Online (Sandbox Code Playgroud)

指示(在适当的时候)MyProtocol具有标准NSObject方法的符合实例(例如-retain/-release,等).

然后,您声明一个类"符合"协议:

@interface MyClass : NSObject <MyProtocol,...,OtherProtocols>
{}

@end
Run Code Online (Sandbox Code Playgroud)

您可以测试实例是否符合协议:

id myInstance = ...; //some object instance

if([myInstance conformsToProtocol:@protocol(MyProtocol)]) {
  // myInstance conforms to MyProtocol
}
Run Code Online (Sandbox Code Playgroud)

您可以通过声明变量保存符合协议的实例来进一步消除编译器警告(请注意,Objective-C的动态性质会阻止编译器验证该合同,并且您仍然可以通过为变量分配不符合的实例来获取运行时错误):

id<MyProtocol> o;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果您发送的[o retain]MyProtocol符合NSObject协议,编译器将会抱怨.您可以通过声明MyProtocol符合NSObject上述描述或通过delcaring oas 来使这些警告静音

NSObject<MyProtocol> o;
Run Code Online (Sandbox Code Playgroud)

因为NSObject它不是Cocoa中唯一的根对象(即NSProxy不继承自NSObject),所以符合的所有实例也不一定都MyProtocol符合NSObject.如果您知道他们这样做,您可以声明MyProtocol符合NSObject.