2016-07-28 64 views
1

比方說,我們有如下的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 

在此先感謝。

回答

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])); 
    } 
} 
+0

是的,實際上,它的工作。並沒有什麼特定的目標。謝謝 –

1

C風格的功能:

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

的Objective-C(類)功能:

@implementation SomeOtherClass 

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

@end 
+0

通過函數的參數 - 這就是問題 –

+0

@AndrewLavq爲什麼當有一個完美的'return'語句? – Droppy

+0

有人可能想要返回布爾值來通知調用者函數是否成功。此外,還可以通過參數返回多個協議。這是一個典型的C++方法,我發現它很有用 –