Swift 基本知识之十六 swift与C 混编的两种方式

第一种方式 通过建桥接文件,达到与C混编
第二种方式,通过隐藏的符号 @asmname把C语言的函数映射成swift的函数
具体以下解释


*第一种 桥接方式*
-------

而对于第三方的 C 代码,Swift 也提供了协同使用的方法。我们知道,Swift 中调用 Objective-C 代码非常简单,只需要将合适的头文件暴露在 {product-module-name}-Bridging-Header.h 文件中就行了。而如果我们想要调用非标准库的 C 代码的话,可以遵循同样的方式,将 C 代码的头文件在桥接的头文件中进行导入:
第一步:
//test.h
int test(int a);

//test.c
int test(int a) {  
    return a + 100;
}
第二步 在Module-Bridging-Header.h中添加test.h
//Module-Bridging-Header.h
#import "test.h"

第三步 在File.swift中进行调用
//File.swift
func testSwift(input: Int32) {  
    let result = test(input)
    print(result)
}

testSwift(1) 
第四步:结果输出 
// 输出:2



*第二种 映射方式*
--------

另外,我们甚至还有一种不需要借助头文件和 Bridging-Header 来导入 C 函数的方法,那就是使用 Swift 中的一个隐藏的符号 @asmname。@asmname 可以通过方法名字将某个 C 函数直接映射为 Swift 中的函数。比如上面的例子,我们可以将 test.h 和 Module-Bridging-Header.h 都删掉,然后将 swift 文件中改为下面这样,也是可以正常进行使用的:

//File.swift
//将 C 的 test 方法映射为 Swift 的 c_test 方法
@asmname("test") func c_test(a: Int32) -> Int32

func testSwift(input: Int32) {  
    let result = c_test(input)
    print(result)
}

testSwift(1)  
// 输出:2
这种导入在第三方 C 方法与系统库重名导致调用发生命名冲突时,可以用来为其中之一的函数重新命名以解决问题。当然我们也可以利用 Module 名字 + 方法名字的方式来解决这个问题。

除了作为非头文件方式的导入之外,@asmname 还承担着和 @objc 的 “重命名 Swift 中类和方法名字” 类似的任务,这可以将 C 中不认可的 Swift 程序元素字符重命名为 ascii 码,以便在 C 中使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图解AI

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值