我想將一個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++類模板/類型來獲取各種重載方法/運算符時,是否有更高效的方法?
在此先感謝您的任何建議/提示!
非常感謝Anthony對擴展機制的引用,我還沒有看過。我依然面臨下面的代碼(也見項目3)以上:
VAR NT1 = NumThe(12),NT2 = NumThe(45)
VAR NT3 = NT1 + NT2
我想要的NT-3是一個NumThe-instance,而是它的一個NumTheObjC實例。我該如何做到這一點? – 2014-09-13 12:29:09