2016-08-09 75 views
4

Ich spiele gerade mit dem Aufruf von C++ - Methoden aus Swift-Projekt. Ich habe this Tutorial verwendet, um String-Wert zu setzen und zu erhalten, funktionierte perfekt.Swift - Aufruf von C++ - Dateien mit Objective-C-Wrapper - Weitergabe von Int-Werten

Dann habe ich versucht, das gleiche mit Integer-Wert zu tun, und ich stieß auf einige Probleme in meiner Objective-C-Wrapper-Klasse.

#import <Foundation/Foundation.h> 
#import "TestCppClassWrapper.h" 
#include "TestCppClass.h" 
@interface TestCppClassWrapper() 
@property TestCppClass *cppItem; 
@end 
@implementation TestCppClassWrapper 
- (instancetype)initWithTitle:(NSString*)title: (NSInteger*)variable 
{ 
    if (self = [super init]) { 
     self.cppItem = new TestCppClass(std::string([title cStringUsingEncoding:NSUTF8StringEncoding]), std::uintptr_t(variable)); 
    } 
    return self; 
} 
- (NSString*)getTitle 
{ 
    return [NSString stringWithUTF8String:self.cppItem->getTtile().c_str()]; 
} 
- (void)setTitle:(NSString*)title 
{ 
    self.cppItem->setTitle(std::string([title cStringUsingEncoding:NSUTF8StringEncoding])); 
} 
- (NSInteger*)getVariable 
{ 
    return [NSInteger self.cppItem->getVariable()]; 
} 
- (void)setVariable:(NSInteger*)variable 
{ 
    self.cppItem->setVariable(std::NSInteger(variable)); 
} 
@end 

Problem tritt hier, wie Sie

enter image description here

erraten haben

Ich bin nicht viel vertraut weder mit obj-c noch mit C++, das ist, warum ich nicht in der Lage bin Figur, wie, wie genau sollte ich mit Typen umgehen, String ist ganz individuell Fall (Codierung und Zeug), so ist es schwer für mich, es zu Int beziehen.

#include "TestCppClass.h" 
TestCppClass::TestCppClass() {} 
TestCppClass::TestCppClass(const std::string &title, const std::int8_t &variable): m_title(title), m_variable(variable) {} 
TestCppClass::~TestCppClass() {} 
void TestCppClass::setTitle(const std::string &title) 
{ 
    m_title = title; 
} 
void TestCppClass::setVariable(const std::int8_t &variable) 

{ 
    m_variable = variable * 2; 
} 
const std::string &TestCppClass::getTtile() 
{ 
    return m_title; 
} 
const std::int8_t &TestCppClass::getVariable() 
{ 
    return m_variable; 
} 

Vielen Dank im Voraus

+0

Es gibt tatsächlich keine 'NSInteger' Klasse im Namensraum der C++ Standardbibliothek. Was gibt 'TestCppClass :: getVariable' zurück? – molbdnilo

+0

sehe meine bearbeitete Frage bitte :) – DCDC

+0

Kurze Antwort ist nein, Sie können C++ nicht direkt in Swift Code aufrufen. Sie können jedoch einen Objective-C-Wrapper für den C++ - Code erstellen und diesen mit Swift aufrufen. Related post: http://stackoverflow.com/questions/24042774/can-i-mix-swift-with-c-like-the-objective-c-mm-files?rq=1 –

Antwort

1

NSInteger(variable) ist ein Objective C-Methode, effektiv in der globalen Namespace. Es ist nicht im Namespace std. Lassen Sie den std:: Teil weg.

Was ist die Schnittstelle von TestCppClass Klasse?

+0

werfen Sie einen Blick auf meine Bearbeitung:) – DCDC

4

NSInteger ist keine Klasse, es ist ein typedef für long, also benutze es so wie es ist.

Sie könnten

- (instancetype)initWithTitle:(NSString*)title: (NSInteger)variable 
{ 
    if (self = [super init]) { 
     self.cppItem = new TestCppClass(std::string([title cStringUsingEncoding:NSUTF8StringEncoding]), variable); 
    } 
    return self; 
} 

- (NSInteger) getVariable 
{ 
    return self.cppItem->getVariable(); 
} 
- (void)setVariable:(NSInteger)variable 
{ 
    self.cppItem->setVariable(variable); 
} 

tun, aber Sie würden eine Verengung Umwandlung in den Setter bekommen.
(Ich bin nicht sicher, ob das ein Problem oder wenn NSInteger ist von entscheidender Bedeutung für die Swift-Schnittstelle.)

Und vorbei um std::int8_t durch Verweis ist sinnlos - es einfach verwenden „plain“.

+0

In der Tat verschwinden Fehler, aber jetzt habe ich in Swift 'let WrapperItem = TestCppClassWrapper (Titel:" Init Testtext für cpp Element Wrapper-Klasse ", 7)" Ich bekomme "kann Wert des Typs 'Int' nicht konvertieren in erwartete Argument Typ 'UnsafeMutablePointer ' – DCDC

+0

@DCDC Hinzugefügt die Änderung, die Sie vornehmen müssen, um' initWithTitle' (das ist ein Sternchen zu entfernen). – molbdnilo

+0

der Fehler bleibt leider, vielleicht sollte ich etwas mit Typ in cpp-Datei ändern? – DCDC