Swift、CとC++のミックス


アップルが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を呼び出します.まず、プロジェクトSwitCDemoを作成し、CModelという名前のCファイルを作成します.hファイルは以下の関数を作成する.
     
    #ifndef CModel_h
    #define CModel_h
    
    #include 
    
    void printHellow(void);
    int getRandomInt(void);
    
    #endif /* CModel_h */
    

    はい.cファイルでこの関数を実現する:
    #include "CModel.h"
    #include 
    
    void printHellow(void){
        printf("hellow world,I am is C language");
    }
    
    int getRandomInt(void){
        return rand();
    }
    

    私たちは2つのc関数を定義します(cはあまり強くありません.簡単にしか使えません.使えばいいです).私たちは今Swiftで呼び出しています.
    ヘッダファイル、すなわち外部(swift)のインタフェースを定義します.CBridging.hという名前の.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("
    ----------------------------

    ") printHellow(); let cRandomInt = getRandomInt(); print("
    ") print(" C :\(cRandomInt)"); } }

    ログを印刷するには、次のようにします.
    ----------------------------
    
    
    hellow world,I am is C languagerecive =16807

    これで、C言語の呼び出しに成功しました.c++に対して私たちもこの方法です.
  • Swift呼び出しC++
  • swiftがc++を呼び出すのはcと同じです.まず、CPPersonという名前のc++ファイルを作成します.
    はい.hppにはクラスが宣言されています.
    #include 
    
    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アドレス.