• SwiftC和C++混编 2019-06-22 21:33:59
    对于Swift调用C和C++,通常需要OC做桥接(oc调用c和c++),性能得不到优化。我们今天直接用Swift调用C使性能得到全面的提升。苹果号称和C一样快的Swift的demo我们来粒子。 测试环境: Xcode版本:11.0-beta Swift...

     苹果推出Swift后,很快就受到程序猿的青睐,快速、安全、简洁的开发已经是一个大趋势了。如果在加上C和C++真的是天衣无缝了,完美结合。对于Swift调用C和C++,通常需要OC做桥接(oc调用c和c++),性能得不到优化。我们今天直接用Swift调用C使性能得到全面的提升。苹果号称和C一样快的Swift的demo我们来粒子。

    测试环境:
    Xcode版本:11.0-beta   Swift版本:5.0
    
    • Swift直接调用C

    我们直接进入主题,Swift调用C。先创建一个工程SwiftCDemo,然后创建一个C文件,命名为CModel,.h文件创建以下函数:

     

    #ifndef CModel_h
    #define CModel_h
    
    #include <stdio.h>
    
    void printHellow(void);
    int getRandomInt(void);
    
    #endif /* CModel_h */
    

    在.c文件里实现该函数:

    #include "CModel.h"
    #include <stdlib.h>
    
    void printHellow(void){
        printf("hellow world,I am is C language");
    }
    
    int getRandomInt(void){
        return rand();
    }
    

    我们定义两个c函数(c不是很厉害只能这么简单,会使用就好)。我们现在用Swift调用。

    我们定义一个头文件,也就是对外(swift)的接口。我们创建一个.h文件,命名为CBridging.h。

    #ifdef __cplusplus
    extern "C" {
    #endif
        void printHellow(void);
        int getRandomInt(void);
        
    #ifdef __cplusplus
    }
    #endif

    对于上边的定义如果不是很明白,可以自己在网上查查,有很多讲解,我在这里就不多说啦。在创建的时候会有提示是否创建桥接文件,记得点击是,如果点击了否,那么就要自己创建了,怎么创建呢。推荐一篇文章

    我们需要在桥接文件中导入CBridging.h。然后我们在默认的ViewController.swift里运行。

    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            
            print("\n----------------------------\n\n")
            printHellow();
            let cRandomInt = getRandomInt();
            print("\n")
            print("收到C函数的随机数是:\(cRandomInt)");
        }
    
    
    }
    
    

    打印log日志为:

    ----------------------------
    
    
    hellow world,I am is C languagerecive =16807

    到此,我们已经成功的调用的C语言。对于c++呢我们也是这个方法。

    • Swift调用C++

    swift要调用c++和c是一样的。我们先创建一个c++文件,命名为CPPerson。

    在.hpp里声明一个类:

    #include <iostream>
    
    using namespace std;
    
    class CPPerson {
        string name;
        int age;
        bool isNan;
        
    public:
        
        CPPerson();
        CPPerson(const char * name,int age, bool isNan);
        ~CPPerson();
        
        void printPersonInfo();
        const char* getPersonName();
        
    };
    

    在.cpp里实现这个类。

    
    CPPerson::CPPerson(){
        this->name = "管理员";
        this->age = 20;
        this->isNan = true;
    }
    
    CPPerson::CPPerson(const char * name,int age, bool isNan){
        this->name = name;
        this->age = age;
        this->isNan = isNan;
    }
    
    void CPPerson::printPersonInfo(){
        cout << "i am is" << name << ",my age is "<< age;
        if (isNan) {
            cout << "i am a body";
        }else{
            cout << "i am a girl";
        }
    }
    const char* CPPerson::getPersonName() {
        return name.data();
    }
    
    CPPerson::~CPPerson(){
        cout << "释放资源";
    }
    

    我们在CBridging.h中加上c++接口:

    CPersonModel create();
    CPersonModel createBy(const char* name,int age);
    void printPersonInfo(CPersonModel model);
    const char* getPersonName(CPersonModel model);
    void destoryModel(CPersonModel model);

    记得加上声明:

    typedef void* CPersonModel;
    

    我们需要在.cpp文件里实现这些函数:

    CPersonModel create() {
        return new CPPerson();
    }
    CPersonModel createBy(const char* name,int age){
        return new CPPerson(name,age,true);
    }
    void printPersonInfo(CPersonModel model) {
        CPPerson *p = (CPPerson*)model;
        p->printPersonInfo();
    }
    const char* getPersonName(CPersonModel model){
        CPPerson *p = (CPPerson*)model;
        return p->getPersonName();
    }
    void destoryModel(CPersonModel model){
        CPPerson *p = (CPPerson*)model;
        delete p;
    }
    

    在ViewController.swift调用

    let person = createBy("peter", 14);
    printPersonInfo(person);
    let cName = getPersonName(person);
    let name = String(cString: cName!);
    print("fetch name is:\(name)");
    destoryModel(person);
    • C调用Swift

    swift调用C,那么C也能调用Swift。我们来看看是怎么调用的。

    在桥接文件里声明一个回调函数:

    extern void(^ __nonnull swiftFuncIMP)(int);
    

    在CModel.h文件里初始化

    void(^ __nonnull swiftFuncIMP)(int) = NULL;
    

    在swift里声明一个函数,并赋值给这个回调函数。

    func swiftFunImplement(a:Int32) -> Void {
        print("收到一个c函数的Int值->\(a)");
    }
    

    在写个测试调用的函数。我们就可以直接调用了,说了这么多,相信有点头绪了。

    另外还有点,c++调用swift,这个留下来思考。最后附上demo地址。欢迎指正。

    demo地址。

    展开全文
  •  Swift 语言出来后,可能新的项目直接使用Swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,或者有一些第三方使用OC写的,没有swift版本,怎么办?那就...
  • Swift调用C代码的方法 2015-08-09 19:25:32
    本篇纪录的是Swift中调用C代码的方法,我使用的是MAC OS X10.10.4的系统,Xcode7beta版,下面是swift调用C的步骤: 1.新建一个命令行工程,取名为TestSwift01 2.创建Objective-C文件,在项目上鼠标右键,选择New ...
  • 本文为 Perfect 官方投稿,作者 Rocky,版权归原作者所有,未经作者同意,请勿转载。 ... 技术之路,共同进步,欢迎投稿、约稿,给文章纠错...本程序示范了如何用 Swift 调用自定义 C 语言模块的方法。您可以直接点击...
  • Swift的统一的功能语法足够灵活来表达任何东西,无论是甚至没有参数名称的简单的C风格的函数表达式,还是需要为每个本地参数和外部参数设置复杂名称的Objective-C语言风格的函数。参数提供默认值,以简化函数调用,...
  • Swift、Xcode和Cocoa入门指南(iOS9 Programming Fundamentals With swift)  第二章 函数  Swift语法中最具特色也最重要的就是声明和调用函数的方式;  所有代码都位于函数中,而动作则是由函数触发的;  ...
  • 其实在绝大多数C语言编译器内部是有幂函数这个函数的,具体的指令是pow(a,b),这个指令实现的功能就是求解a^b的值,也就是求解a的b次方。 例如,假如我们要求解6的7次方,并把最终的结果存入变量result,那么我们...
  • 编写一个函数把华氏温度转换为摄氏温度,转换公式为:C = (F - 32) * 5/9 AC的C++代码如下: #include<iostream> using namespace std; double Celsius(int f){ return 1.0*(f-32)*5/9; } int main() { ...
  • Swift总的来说是一门比较容易编写的静态编译且略带一些动态特性的编程语言。由于Swift在2014年才刚诞生,因此当前在语法上修改的幅度比较大,尤其是从Swift 1.0到Swift 2.0;Swift 2.0到Swift 3.0。然而,此编程语言...
  • 函数(你想知道的都在这里)注:本文为作者自己总结,过于基础的就不再赘述 ,都是亲自测试的结果。如有错误或者遗漏的地方,欢迎指正,一起学习。1、 函数的简单定义和调用简单的无参函数就不再赘述 , name为形参 ,...
  • swift 阶乘问题 2019-04-23 21:51:53
    第一题: 问题1. 阶乘(factorial) ... = n x (n-1) x (n-2)....2 x 1} 的函数 myFactorial. (n>0) 例 : myFactorial(8) = 8x7x6x5x4x3x2x1 = 40320 问题2:金字塔 * *** ***** ******* OC 方法 ...
  • Swift中的函数 2020-06-23 14:53:08
    介绍 咖喱是大多数现代编程语言中的一项功能。... 在本教程中,我将向您展示如何利用Swift中的函数循环。 1.函数式授课 在定义我们自己的自定义函数之前,我将首先向您展示一个使用类在Swift中进行简化...
  • 详解Swift中的函数函数闭包使用
  • Swift语言的函数 2020-03-04 10:08:15
    在数学中,函数有3要素:定义域、对应...在Swift语言中,使用func关键字来声明函数,一个完整的函数声明和实现应该符合如下格式: methodName为函数名称,之后跟的小括号中需要设置函数的参数类型和个数,多个参...
  • 编写函数把华氏温度转换为摄氏温度,公式为:C = (F - 32) * 5/9 在主程序中提示用户输入一个华氏温度,转化后输出相应的摄氏温度。 #include using namespace std; float centigrade(float a) { float b; b=5.0/9.0...
  • 原文链接:... 转自猫·仁波切的博客(微博) 其中 @asmname 的两个用法源于我的猜测验证,用到了 Xcode, lldb, nm, llvm ir 等工具或格式。...相关的分析主要基于我 dump 出的
  • 从控制台输出“HelloWorld”是我学习C语言的第一步,也是我人生中非常重要的一步。多年后的今天,我仍希望以HelloWorld作为第一步,与大家共同开启一个神奇、瑰丽的世界——Swift编程。本章以HelloWorld作为切入点,...
  • Swift写简易计算器 2016-04-08 22:16:46
    Swift写一个简单计算器的Demo 1、实现加减乘除+根号(结果display为Double型) 2、边界适应:各元素之间的距离固定,且适应手机旋转(Roate)
  • 函数Swift】可选值 2019-02-28 02:53:05
    可选值(Optionals)是 Swift 引入的一项非常棒的特性,本文将基于原书中的案例以及函数式编程思想进行讨论。 概述 首先推荐大家阅读原书中的可选值章节,有很多使用细节以及与 Objective-C 的对比讨论,我认为如果...
  • Swift的统一的功能语法足够灵活来表达任何东西,无论是甚至没有参数名称的简单的C风格的函数表达式,还是需要为每个本地参数和外部参数设置复杂名称的Objective-C语言风格的函数。参数提供默认值,以简化函数调用,...
1 2 3 4 5 ... 20
收藏数 7,368
精华内容 2,947