我想把一个C库(处理一些我在20年前在C中写过的NumberTheory相关项目)包装到Swift中。我开始为这个C库编写一个Objective-C包装器,然后从Objective-C包装器中编写一个Swift派生类。
由于Objective-C不允许我编写重载的方法/运算符,我想在Swift中完成这个。有问题的C库有以'numthe'开头的API调用,以及一个libnumthe.a和一个“numthe.h”包含文件。 Objective-C包装器/类被称为NumTheObjC和Swift类NumThe
目前,我有以下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
对于Swift包装器,我想出了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)
}
仍然存在一些想法和问题,即:
我想知道上述是否是实现目标的最佳方法
2.所有方法的签名是否应使用NumTheObjC参数类型而不是NumThe?
3.我似乎无法弄清楚如何让'a + b'的上述重载运算符返回NumThe实例而不是NumTheObjC实例。
4.使用类似C ++的模板/类型来获取各种重载方法/运算符是否有更有效的方法?
提前感谢任何建议/提示!
答案 0 :(得分:0)
1。我想知道上述是否是实现目标的最佳方法。
您可能需要一个新的子类NumThe
。您可以通过NumTheObjC
的扩展名添加新的init()。有关详细信息,请参阅this Apple doc
2。所有方法的签名是否应使用NumTheObjC参数类型而不是NumThe?
如果您使用扩展程序,则无需更改参数类型
3。我似乎无法弄清楚如何让'a + b'的上述重载运算符返回NumThe实例而不是NumTheObjC实例。
第1点('扩展名')的解决方案也应该解决这个问题
4。是否有更有效的方法使用类似C ++的模板/类型来获取各种重载的方法/运算符?
我认为不可能。再次查看Preprocessor Directives
部分的this Apple doc。