如何有效地将C库包装到Swift类中

时间:2014-09-12 20:32:42

标签: objective-c c swift operator-overloading wrapper

我想把一个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 ++的模板/类型来获取各种重载方法/运算符是否有更有效的方法?

提前感谢任何建议/提示!

1 个答案:

答案 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