目标C - 如何创建界面?

时间:2010-08-26 22:07:48

标签: objective-c interface

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

4 个答案:

答案 0 :(得分:29)

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

@protocol MyProtocol
-(void)myMethod;
-(void)myMethod2;
@end

在MyClass.h中

#import "MyProtocol.h"
@interface MyClass : NSObject<MyProtocol>
@end

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

id<MyProtocol> var;

NSObject<MyProtocol> *var;

更多信息here

答案 1 :(得分:8)

使用

声明“协议”(Objective-C的接口)
@protocol MyProtocol <BaseProtocol1,...,BaseProtocolN>
//methods and properties
@end

其中<BaseProtocol>是可选的,表示MyProtocol“继承了”BaseProtocol的界面。 NSObject协议在此上下文中很有用,因为它允许您使用

@protocol MyProtocol <NSObject>
//...
@end

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

然后声明一个类“符合”协议:

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

@end

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

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

if([myInstance conformsToProtocol:@protocol(MyProtocol)]) {
  // myInstance conforms to MyProtocol
}

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

id<MyProtocol> o;

在这种情况下,如果您发送[o retain]MyProtocol符合NSObject协议,则编译器会抱怨。您可以通过将MyProtocol声明为符合上述NSObject或将o视为

来宣布这些警告。
NSObject<MyProtocol> o;

由于NSObject不是Cocoa中唯一的根对象(即NSProxy不从NSObject继承),所以符合MyProtocol的所有实例也不一定正确符合NSObject。如果您知道他们这样做,您可以声明MyProtocol符合NSObject

答案 2 :(得分:2)

在Objective-C世界中,接口称为“协议”

根据Apple的说法,

Protocols declare methods that can be implemented by any class. Protocols are useful in at least three situations:

To declare methods that others are expected to implement
To declare the interface to an object while concealing its class
To capture similarities among classes that are not hierarchically related

所以,要宣布一个协议,你可以:

@protocol SomeClassProtocol
- (void) do:(int) number something:(id) sender;
- (void) somethingElse;
@end

要实现协议,请执行以下操作:

@interface MyClass : NSObject <Protocol1, Protocol2, ..., ProtocolN>
@end

查看this link以获取官方文档。

答案 3 :(得分:0)

接口在Objective C中称为协议

如果您要在项目中添加一个类,您可以选择将其创建为协议,最终会得到以下内容:

@protocol MyProtocol
-(void) DoSomething;
@end