В настоящее время я пытаюсь использовать кусок кода, который я написал на C ++, в приложении для iPhone. Я читал об упаковке кода C ++ с использованием Objective-C ++. функция 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 в NSString *.
Есть ли обходной путь для решения этой проблемы?
Вам скорее нужно выполнить объект, чем метод класса:
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
Других решений пока нет …