zoukankan      html  css  js  c++  java
  • 如何在C语言中调用Swift函数

    在Apple官方的《Using Swift with Cocoa and Objectgive-C》一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中使用Objective-C中的类。在后半部分也介绍了如何在Swift中使用C函数,不过对于如何在C语言中使用Swift函数却只字未提。这里我就为大家分享一下如何在C语言中调用Swift函数。


    我们首先要知道的是,所有Swift函数都属于闭包。其次,Swift函数的调用约定与Apple为Clang编译器贡献的Blocks语法一致。因此,我们需要通过使用Blocks调用约定将Swift函数导入到C语言中。由于在C语言中无法直接声明Blocks调用约定的函数,因此我们可以通过定义全局的指向Blocks的对象指针来实现。

    下面我们创建一个名为SwiftTest的macOS系统上的Swift工程。然后新建一个名为test.c的C源文件,如果Xcode没有弹出是否新建bridging-header文件,那么我们可以新增一个Objective-C源文件,最后把它给移除。这里,我们必须在工程里包含SwiftTest-Bridging-Header.h这个头文件。

    然后我们编辑此头文件:

    extern void (^ __nonnull SwiftFunc)(void);
    extern void CFuncTest(void);

    这里声明的全局指向void(^)(void)类型的Block的引用对象。

    然后我们再看test.c源文件:

    void (^SwiftFunc)(void) = NULL;
    
    void CFuncTest(void)
    {
        SwiftFunc();
    }

    我们定义SwiftFunc全局对象,将它初始化为空。

    然后在ViewController.swift中编辑以下内容:

    // 这里是对SwiftFunc的实现
    private func swiftFuncImpl() {
        print("This is a Swift function!");
    }
    
    class ViewController: NSViewController {
        
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // 这里对定义在test.c中的SwiftFunc进行初始化
            SwiftFunc = swiftFuncImpl
    
            // 这里用dispatch_async来测试SwiftFunc是否一直被hold着
            dispatch_async(dispatch_get_main_queue()) {
                
                CFuncTest()
            }
        }
    }

    当调用了test.c中定义的CFuncTest函数之后,该函数里将直接调用SwiftFunc这一Block引用对象,从而达到了在C语言中调用了Swift中函数的目的。

  • 相关阅读:
    hihocoder 1049 后序遍历
    hihocoder 1310 岛屿
    Leetcode 63. Unique Paths II
    Leetcode 62. Unique Paths
    Leetcode 70. Climbing Stairs
    poj 3544 Journey with Pigs
    Leetcode 338. Counting Bits
    Leetcode 136. Single Number
    Leetcode 342. Power of Four
    Leetcode 299. Bulls and Cows
  • 原文地址:https://www.cnblogs.com/zenny-chen/p/5692985.html
Copyright © 2011-2022 走看看