Обертывание кода C++ с помощью Objective-C++

В настоящее время я пытаюсь использовать фрагмент кода, который я написал на С++, в приложении для iphone. Я читал об обертывании кода C++ с использованием Objective-C++. функция С++, которую я пытаюсь вызвать, принимает в качестве аргументов 2 std::string и возвращает std::string:

// ObjCtoCPlusPlus.mm 
#import <Foundation/Foundation.h>
#include "CPlusPlus.hpp"
#import "ObjCtoCPlusPlus.h"

@implementation Performance_ObjCtoCPlusPlus : NSObject

- (NSString*) runfoo: (NSString*)list
{
        std::string nodelist = std::string([[list componentsSeparatedByString:@"*"][0] UTF8String]);
        std::string lines = std::string([[list componentsSeparatedByString:@"*"][1] UTF8String]);
        std::string result = Performance_CPlusPlus::run(nodelist, lines);
        return [NSString stringWithCString:result.c_str()
                       encoding:[NSString defaultCStringEncoding]];
}
- (void) exp
{
    Performance_CPlusPlus::explanation();
}
@end

Я вызываю функцию target-C++ из swift

// I am calling the function from the viewController.swift

@IBAction func button(sender: AnyObject) {
        let z : String = "0 1/1 2";
        let q : String = "a b Y";
        let x = Performance_ObjCtoCPlusPlus.runfoo((q + "*" + z) as NSString)
    }

ошибка: невозможно преобразовать значение типа NSString в ожидаемый тип аргумента PerformanceObjCtoCPlusPlus. Я думаю, что ошибка, которую я получаю, связана с тем, что я не могу преобразовать тип Swift String в NSString *. есть ли обходной путь для решения этой проблемы?


person Marwan    schedule 16.04.2016    source источник
comment
Вы пробовали это? stackoverflow.com/questions/33118095/ Я не знаком с задачей c, но я не думаю, что runfoo является статическим методом   -  person Kit Fung    schedule 16.04.2016


Ответы (1)


Вам скорее нужно выполнить объект, чем метод класса:

    let z : String = "0 1/1 2";
    let q : String = "a b Y";

    let obj = Performance_ObjCtoCPlusPlus()
    let res = obj.runfoo(q + "*" + z)

    print(res)

И еще одно наблюдение - вам не нужно приводить String к NSString. Совместимость Swift с Obj-C делает это за вас бесплатно.

Кстати, я использую Swift 2.2

person Igor B.    schedule 16.04.2016
comment
Если это необходимо, я могу поделиться своим примером приложения, которое я использовал для анализа проблемы. - person Igor B.; 16.04.2016
comment
У меня ошибка в строке let res= obj.runfoo(q + * + z). Ошибка: невозможно преобразовать значение типа «String» в ожидаемый тип аргумента «(UnsafePointer‹Int8›, UnsafePointer‹Int8›)» - person Marwan; 16.04.2016
comment
Это странно. У меня нет такой проблемы. Можете ли вы ознакомиться с моим примером приложения здесь: github.com/melifaro-/iOSSwiftSample - person Igor B.; 17.04.2016
comment
Код клиента находится в файле AppDelegate. Работает ли это для вас? - person Igor B.; 17.04.2016