【发布时间】:2014-09-12 20:32:41
【问题描述】:
我想将一个 C 库(处理一些与 NumberTheory 相关的项目,我在大约 20 年前用 C 语言编写)包装到 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)
}
仍然存在一些想法和问题,即:
1. 我想知道以上是否是实现我目标的最佳方法。
2. 所有方法的签名都应该使用 NumTheObjC 参数类型而不是 NumThe 吗?
3. 我似乎无法弄清楚如何让上面的“a + b”重载运算符返回一个 NumThe 实例而不是 NumTheObjC 实例。
4. 使用 C++ 之类的模板/类型来获取各种重载方法/操作符有没有更有效的方法?
提前感谢您的任何建议/提示!
【问题讨论】:
标签: objective-c c swift operator-overloading wrapper