在我的应用程序中,我有一个C++类和一个Objective类,它们一起工作的方式如下:
PingPong.h
#ifndef __RSSCPPCallbackTest__PingPong__h
#define __RSSCPPCallbackTest__PingPong__h
#include <iostream>
class PingPong
{
public:
static void requestPingPongWithText(std::string text);
static void eventRequestPingPongWithTextSuccess(std::string successString);
static void eventRequestPingPongWithTextFailure(std::string failureString);
};
#endifPingPong.cpp
#ifndef __RSSCPPCallbackTest__PingPong__m
#define __RSSCPPCallbackTest__PingPong__m
#include "PingPong.h"
void PingPong::requestPingPongWithText(std::string text)
{
if (text.compare("ping") == 0)
{
PingPong::eventRequestPingPongWithTextSuccess("success ping");
}
else
{
PingPong::eventRequestPingPongWithTextFailure("failure pong");
}
}
#endif目标-C类: MainViewController.mm
@implementation MainViewController
/* init, viewDidLoad, etc... */
// Call ping with a button
- (IBAction)sayPing:(id)sender {
NSString *text = @"ping";
PingPong::requestPingPongWithText([text UTF8String]);
}
// Call pong with another button
- (IBAction)sayPong:(id)sender {
NSString *text = @"pong";
PingPong::requestPingPongWithText([text UTF8String]);
}
@end
void PingPong::eventRequestPingPongWithTextSuccess(std::string successString)
{
NSLog(@"successString: %@", [NSString stringWithCString:successString.c_str()
encoding:[NSString defaultCStringEncoding]]);
}
void PingPong::eventRequestPingPongWithTextFailure(std::string failureString)
{
NSLog(@"failureString: %@", [NSString stringWithCString:failureString.c_str()
encoding:[NSString defaultCStringEncoding]]);
}这个很好用。最后,我要做的是将它包装成一个函数,其中包含如下所示的完成块:
[self requestPingPongWithText: text
completion:^(NSString *successString, NSString *failureString)) completion {
if (successString) {
NSLog(@"successString: %@", successString); }
else if (failureString) {
NSLog(@"failureString: %@", failureString); }
}];我如何包装我现有的代码,使函数如上面所示?
发布于 2014-06-30 18:31:38
让我们在Lets Pong.h中做一个新的类型:
typedef void (^OnComplete)(std::string successString, std::string failureString);
按块为请求创建一个新方法:
static void requestPingPongWithBlock(std:string text, OnComplete block);另一种方法是,将其明确化:
static void requestPingPongWithBlock(std:string text, void (^block)(std::string successString, std::string failureString));在PingPong.cpp中实现:
void PingPong::requestPingPongWithBlock(std::string text, OnComplete block)
{
if (text.compare("ping") == 0)
{
block("success ping", "");
}
else
{
block("", "failure pong");
}
}在MainViewController.mm中
-(void)requestPingPongWithText:(NSString*)text completion:(OnComplete) compblock{
PingPong::requestPingPongWithBlock([text UTF8String],compblock);
}你可以这样称呼它:
[self requestPingPongWithText: text
completion:^(std::string successString, std::string failureString) {
if (successString.length() != 0) {
NSLog([NSString stringWithUTF8String: successString.c_str()]); }
else if (failureString.length() != 0) {
NSLog([NSString stringWithUTF8String: failureString.c_str()]); }
}];我希望这是有帮助的;)
https://stackoverflow.com/questions/24494361
复制相似问题