来讲解一下“详解 Objective-C 中 interface 与 protocol 的作用”的完整攻略。
什么是 interface 和 protocol?
在 Objective-C 中,interface 和 protocol 都是用来定义类之间的接口虚构,使得对象之间可以进行通信。不同的是,interface 定义了一个类,而 protocol 只是一个行为规范。
Interface
interface 用于定义一个类的结构和属性,并声明该类将遵循的协议。其定义方式如下:
@interface MyClass : NSObject <MyProtocol>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
- (void)myMethod;
@end
其中,@interface 声明一个名为 MyClass 的 Objective-C 类,继承自基类 NSObject,并实现了 MyProtocol 协议。接着,我们定义了两个属性 name 和 age,以及一个实例方法 myMethod。
Protocol
protocol 则用于定义一组协议,规定该协议内需要实现的方法。其定义方式如下:
@protocol MyProtocol <NSObject>
- (void)doSomething;
@end
其中,@protocol 声明一个名为 MyProtocol 的协议,继承自基类 NSObject。接着,在协议中定义了一个方法 doSomething,遵循该协议的类必须实现该方法。
Interface 和 Protocol 的作用
在 Objective-C 中,interface 和 protocol 主要用于实现面向接口编程(OOP)的流程。具体来说,它们的作用主要体现在以下两点:
1. Interface 实现类的定义
interface 用于定义一个类的结构和属性,并声明该类将遵循的协议。在 Objective-C 中,一般通过继承基类 NSObject 来实现类的定义。通过 interface,我们可以定义类的属性、方法和协议,并在实现类中实现这些方法和属性。例如,我们可以使用 @property 定义类的属性:
@interface MyClass : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
在类的实现中,我们可以通过该属性来操作类的数据:
@implementation MyClass
- (void)setName:(NSString *)name {
_name = name;
NSLog(@"My name is %@", name);
}
@end
2. Protocol 规定类的行为
protocol 用于规定一组协议,规定该协议内需要实现的方法。在定义协议时,我们可以规定该协议需要实现的方法,这些方法将会是遵循该协议的类所必须实现的行为。例如,我们定义一个协议:
@protocol MyProtocol <NSObject>
- (void)doSomething;
@end
然后通过 interface 来声明一个类需要遵循该协议:
@interface MyClass : NSObject <MyProtocol>
@end
这时我们就需要在 MyClass 中实现该协议所规定的方法 doSomething。具体实现可以如下:
@implementation MyClass
- (void)doSomething {
NSLog(@"Do something");
}
@end
这样,遵循 MyProtocol 协议的对象就都需要实现 doSomething 方法了。
示例
下面通过两个示例来说明 interface 和 protocol 的使用。
示例一:协议代理
我们可以使用 protocol 来实现协议代理。假设我们有一个 ViewController,需要依赖于一个 DataSource 来获取数据。我们就可以定义一个协议 MyDataSource:
@protocol MyDataSource <NSObject>
- (NSArray *)getData;
@end
接着,我们在 ViewController 中声明一个 DataSource 属性:
@interface ViewController : UIViewController
@property (nonatomic, weak) id<MyDataSource> dataSource;
@end
我们还需要在 ViewController 中实现该协议:
@implementation ViewController
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if ([self.dataSource respondsToSelector:@selector(getData)]) {
NSArray *data = [self.dataSource getData];
NSLog(@"Data is %@", data);
}
}
@end
这样,我们就可以在调用 ViewController 时,把一个遵循 MyDataSource 协议的对象赋值给 dataSource 属性,来获取需要的数据了。
示例二:多继承
Objective-C 语言本身不支持多继承,但我们可以通过 protocol 来实现类似的效果。举一个例子,我们定义一个 Animal 的 protocol:
@protocol Animal <NSObject>
- (void)move;
@end
然后定义一个 Bird 类,实现 Animal 协议:
@interface Bird : NSObject <Animal>
@end
@implementation Bird
- (void)move {
NSLog(@"Fly");
}
@end
在这里,我们让 Bird 类遵循了 Animal 协议,并实现 move 方法。接着,我们定义一个 Fish 类,同样实现 Animal 协议:
@interface Fish : NSObject <Animal>
@end
@implementation Fish
- (void)move {
NSLog(@"Swim");
}
@end
现在,让我们定义一个 AnimalClasses 类,用于管理所有的 Animal 类:
@interface AnimalClasses : NSObject <Animal>
@property (nonatomic, strong) NSArray *animalClasses;
@end
@implementation AnimalClasses
- (instancetype)init {
if (self = [super init]) {
self.animalClasses = @[[[Bird alloc] init], [[Fish alloc] init]];
}
return self;
}
- (void)move {
for (id<Animal> animal in self.animalClasses) {
[animal move];
}
}
@end
在 AnimalClasses 类中,我们遵循了 Animal 协议,并实现 move 方法。我们还定义了一个 animalClasses 数组,保存了所有遵循 Animal 协议的类。在 move 方法中,我们遍历 animalClasses 数组,依次调用每个 Animal 类的 move 方法。
最后,我们可以通过 AnimalClasses 类来控制多个 Animal 类的运动:
AnimalClasses *animals = [[AnimalClasses alloc] init];
[animals move];
输出结果将是:
Fly
Swim
这样,我们就通过 protocol 实现了对象的多继承。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解 objective-c中interface与protocol的作用 - Python技术站