我有一个用Swift编写的函数,我想从Rust调用。我尝试通过Objective-C公开它,但是我继续从ld
收到错误,说它无法找到_foo
。通过将Rust项目编译为staticlib,将Rust项目链接到Swift项目。
#pragma once
#include <stdint.h>
uint8_t foo_bridge(uint8_t);
#import <Foundation/Foundation.h>
#import <Foo-Swift.h>
uint8_t foo_bridge(uint8_t byte) {
return foo(byte);
}
public func foo(byte: UInt8) -> UInt8 {
return byte * 2
}
extern "C" {
pub fn foo_bridge(byte: u8) -> u8;
}
#import "foo.h"
[package]
name = "foo"
version = "0.1.0"
[lib]
name = "foo"
crate-type = ["staticlib"]
答案 0 :(得分:4)
这里的问题是尝试从Objective-C调用一个裸Swift函数,这是不受支持的。
如果您检查Foo-Swift.h
标题,则会发现foo()
功能不存在,这表示其符号_foo
赢了&# 39;在运行时也可以使用。
解决方案是将foo()
函数放在可以从Objective-C调用的东西中,就像从NSObject派生的类一样:
class Foo: NSObject {
class func foo(byte: UInt8) -> UInt8 {
return byte * 2
}
}
一旦你这样做,你会发现Foo-Swift.h
标题现在有一个界面:
@interface Foo : NSObject
+ (uint8_t)fooWithByte:(uint8_t)byte;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
由于我们现在知道它可以从Objective-C获得,我们可以这样称呼:
uint8_t foo_bridge(uint8_t byte) {
return [Foo fooWithByte:byte];
}