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 中使用。

你可能感兴趣的:(swift-混编)