2016-07-28 26 views
1

Angenommen, wir haben folgende C++ Code:Erstes Protokoll zu einem Objekt über Funktionen Parameter

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; 
} 

Es ist ganz einfach und weit davon entfernt, perfekt zu sein, aber es zeichnet das Bild: einen Zeiger auf eine Schnittstelle zu einem Objekt bekommen über die Parameter der Funktion.

Wie erhalten wir dasselbe mit Objective C-Protokollen?

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

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

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

Vielen Dank im Voraus.

Antwort

1

Wenn Sie tatsächlich die Referenzparameter möchten, können Sie tun:

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

ja, tatsächlich, es hat funktioniert. und nichts objektiv-c spezifisch. Danke –

1

C-Style-Funktion:

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

Objective-C (Klasse) Funktion:

@implementation SomeOtherClass 

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

@end 
+0

über Parameter der Funktion - das ist die Frage –

+0

@AndrewLavq Warum, wenn es eine vollkommen gute "Rückkehr" Aussage gibt? – Droppy

+0

könnte man einen booleschen Wert zurückgeben, um einen Anrufer darüber zu informieren, ob die Funktion erfolgreich ist. Außerdem können mehrere Protokolle über Parameter zurückgegeben werden. Dies ist ein typischer C++ Ansatz und ich fand es nützlich –