2016-03-10 30 views
1

我在C++中有一個靜態庫,現在我想在我的新Swift項目中使用這個庫。我發現我不能直接在Swift項目中使用C++類,所以我必須在OC中封裝這個庫。然後我有一些問題包裝:iOS如何在Swift項目中封裝C++類

//AbstractClassA.h 
#include <string> 

class AbstractClassA { 
public: 
    virtual string getString() = 0; 
    virtual int getInt() = 0; 
    virtual ~AbstractClassA() {}; 

}; 

//AbstractClassB.h 
class AbstractClassB { 
public: 
    virtual void function(int a) = 0; 
    virtual ~AbstractClassB() {}; 

}; 

//ChildA.h 
#include "AbstractClassA.h" 
#include "AbstractClassB.h" 

class ChildA : public AbstractClassA 
{ 
public: 
    ChildA(int a = 640); 
    ChildA(AbstractClassB* classb, int a = 640); 
    virtual ~ChildA(); 
    string getString(); 
    int getInt(); 

protected: 
    int a; 
    string b; 
}; 

如何在OC中包裝這些類?謝謝你的幫助!

回答

1

您創建了一個包裝C++類的Objective-C++類。頭文件不能包含任何C++功能;帶有實現的文件必須以.mm結尾,以告訴Xcode使用Objective-C++編譯器,而不是Objective-C。

在.h文件中,您將擁有類ChildAWrapper的接口,方法init,initWithInt:,initWithClassB:,initWithClassB:Int:和readonly屬性stringValue和intValue。

在.mm文件中,您將有一個類型爲ChildA *的實例變量。 init方法創建一個ChildA對象。 dealloc刪除它。您可以通過調用ChildA對象的方法來實現這些屬性,將std :: string轉換爲NSString *。

對於具有Objective-C類ClassBWrapper的ClassB也是如此。你需要一個readonly屬性void * wrappedClass返回一個指向ClassB對象的指針,轉換爲void *,因爲ChildAWrapper將需要它。

+0

不幸的是,這也是我的理解。這是很多工作。 – Tommy

+0

對不起,我想不出ClassBWrapper,你能告訴我代碼片段嗎?在ChildAWrapper中,我真正需要什麼方法? initWithAbstractClassB:或initWithAbstractClassBWrapper? – SomnusLee