2014-09-12 12 views
2

我想將一個C庫(處理一些與C語言相關的一些NumberTheory相關項目)包裝到Swift中。我開始爲這個C庫編寫Objective-C包裝器,最後從Objective-C包裝器中編寫了一個Swift派生類。
由於Objective-C不允許我編寫重載的方法/運算符,因此我想在Swift中完成此操作。所討論的C庫具有以'numthe'開頭的API調用,以及一個libnumthe.a和一個「numthe.h」包含文件。 Objective-C的包裝/類稱爲NumTheObjC和雨燕類NumThe如何有效地將C庫打包成Swift類

目前我已經爲NumTheObjC.h文件下面的代碼:

#import <Foundation/Foundation.h> 
#import <stdio.h> 
#import "numthe.h" 
@interface NumTheObjC : NSObject 
{ 
    numthe_prime nPrime;  // Holds a numthe_prime number type instance. 
    numthe_perfect nPerfect; // Holds a numthe_perfect number type instance. 
    //... more numthe types/structure instances here. 
} 
-(id)init;     // Default initializer 
-(id)init:(NSString *)str; // Initialize from string-value. 
-(void)add:(NumTheObjC *)op;          // a += b 
+(NumTheObjC *)add:(NumTheObjC *)left right:(NumTheObjC *)right; // x = a + b 
-(void)setFromInt:(signed int)nrInt;  // Initialize/set from int. 
-(void)setFromLong:(signed long)nrLong;  // Initialize/set from long. 
-(void)setFromUInt:(unsigned int)nrUInt; // Initialize/set from uint. 
-(void)setFromULong:(unsigned long)nrULong; // Initialize/set from ulong. 
@end 

而對於斯威夫特包裝我想出了NumThe.swift文件:

class NumThe : NumTheObjC { 
    init(nr: Int) { 
     super.init() 
     setFromInt(nr) 
    } 
    init(nr: UInt) { 
     super.init() 
     setFromUInt(nr) 
    } 
    init(strNr: String) { 
     super.init(strNr) 
    } 
    //... more overloaded 'constructors/initializers here ... 
} 
//-- Overloaded operator a + b 
func + (inout left: NumThe, right: NumThe) -> NumTheObjC { 
    return NumTheObjC.add(left, right: right) 
} 
//-- Overloaded operator += 
func += (inout left: NumTheObjC, right: NumThe) { 
    return left.add(right) 
} 

還有些想法和問題依然存在,即:
1.我想知道,如果上面是實現我的目標的最佳途徑。
2.所有方法的簽名是否應該使用NumTheObjC參數類型而不是NumThe?
3.我似乎無法弄清楚如何讓'a + b'的上述重載運算符返回一個NumThe實例而不是NumTheObjC-instance。
4.在使用C++類模板/類型來獲取各種重載方法/運算符時,是否有更高效的方法?

在此先感謝您的任何建議/提示!

回答

0

1.我想知道以上是否是實現我的目標的最佳方法。

您可能需要一個新的子類NumThe。您可以通過NumTheObjC的擴展名添加新的init()。請參閱this Apple doc以獲取更多信息

2.應該所有方法的簽名使用NumTheObjC參數類型而不是NumThe?

如果使用延長,那麼你不需要改變你的參數類型

3.我似乎無法弄清楚如何讓對上述重載運算符「A + B」返回NumThe實例而不是NumTheObjC實例。

解決方案1點(「擴展」)應該可以解決這個太

4.是否有使用C++模板相似/類型,以獲得各種重載方法/經營者的更有效的方法?

我不認爲這是可能的。再次檢查出this Apple doc,Preprocessor Directives部分。

+0

非常感謝Anthony對擴展機制的引用,我還沒有看過。我依然面臨下面的代碼(也見項目3)以上:
VAR NT1 = NumThe(12),NT2 = NumThe(45)
VAR NT3 = NT1 + NT2
我想要的NT-3是一個NumThe-instance,而是它的一個NumTheObjC實例。我該如何做到這一點? – 2014-09-13 12:29:09

相關問題