通过函数参数获取协议到对象

时间:2016-07-28 19:38:55

标签: objective-c protocols objective-c-protocol

我们说我们有以下C ++代码:

struct ISomeInterface
{ 
  virtual ~ISomeInterface() {}   
  virtual void f() = 0;
};

class SomeClass : public ISomeInterface
{
public:
  void f() override
  {
      std::cout << "Hi";
  }
};

void getObject(ISomeInterface*& ptr)
{
  ptr = new SomeClass;
}

int main()
{
  ISomeInterface* p(nullptr);
  getObject(p);
  p->f();
  delete p;
}

它非常简单并且远非完美,但它描绘的是:通过函数的参数获取指向对象接口的指针。

我们如何使用Objective C协议?

@protocol SomeProtocol <NSObject>
- (void)f;
@end

@interface SomeClass : NSObject<SomeProtocol>
- (void)f;
@end

@implementation SomeClass
- (void)f { NSLog(@"Hi"); }
@end

提前致谢。

2 个答案:

答案 0 :(得分:1)

C风格的功能:

id<SomeProtocol> getObject()
{
    return [SomeClass new];
}

Objective-C(类)函数:

@implementation SomeOtherClass

+ id<SomeProtocol> getObject
{
    return [SomeClass new];
}

@end

答案 1 :(得分:1)

如果你真的想要参考参数,你可以这样做:

void getObject(id<SomeProtocol> *ptr)
{
    if (ptr) {
        *ptr = [[SomeClass alloc] init];
    }
}

int main(int argc, char *argv[])
{
    @autoreleasepool {
        id<SomeProtocol> p = nil;
        getObject(&p);
        [p f];
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}