c - स्विफ्ट से सी कैसे कॉल करें?




swift (4)

कंपाइलर सी एपीआई को स्विफ्ट में बदल देता है जैसे कि यह उद्देश्य-सी के लिए करता है।

import Cocoa

let frame = CGRect(x: 10, y: 10, width: 100, height: 100)

import Darwin

for _ in 1..10 {
    println(rand() % 100)
}

दस्तावेज़ों में Here देखें।

स्विफ्ट से सी रूटीन कॉल करने का कोई तरीका है?

बहुत सारे आईओएस / ऐप्पल पुस्तकालय केवल सी हैं और मैं अभी भी उनको कॉल करने में सक्षम होना चाहता हूं।

उदाहरण के लिए, मैं ओबीजेसी रनटाइम पुस्तकालयों को तेज़ी से कॉल करने में सक्षम होना चाहता हूं।

विशेष रूप से, आप आईओएस सी हेडर को कैसे पुल करते हैं?


पॉइंटर्स से निपटने के दौरान यह एक अलग गेंद 'ओ मोम प्रतीत होता है। सी पॉज़िक्स read सिस्टम कॉल को कॉल करने के लिए अब तक मेरे पास क्या है:

enum FileReadableStreamError : Error {
case failedOnRead
}

// Some help from: http://.com/questions/38983277/how-to-get-bytes-out-of-an-unsafemutablerawpointer
// and https://gist.github.com/kirsteins/6d6e96380db677169831
override func readBytes(size:UInt32) throws -> [UInt8]? {
    guard let unsafeMutableRawPointer = malloc(Int(size)) else {
        return nil
    }

    let numberBytesRead = read(fd, unsafeMutableRawPointer, Int(size))

    if numberBytesRead < 0 {
        free(unsafeMutableRawPointer)
        throw FileReadableStreamError.failedOnRead
    }

    if numberBytesRead == 0 {
        free(unsafeMutableRawPointer)
        return nil
    }

    let unsafeBufferPointer = UnsafeBufferPointer(start: unsafeMutableRawPointer.assumingMemoryBound(to: UInt8.self), count: numberBytesRead)

    let results = Array<UInt8>(unsafeBufferPointer)
    free(unsafeMutableRawPointer)

    return results
}

सी ++ के मामले में, यह त्रुटि है जो पॉप अप करती है:

  "_getInput", referenced from: 

आपको एक सी ++ हेडर फ़ाइल भी चाहिए। अपने फ़ंक्शन में c-linkage जोड़ें, फिर पुल-हेडर में हेडर फ़ाइल शामिल करें:

स्विफ्ट 3

UserInput.h

#ifndef USERINPUT_H
#define USERINPUT_H    

#ifdef __cplusplus
extern "C"{
#endif

getInput(int *output);

#ifdef __cplusplus
}
#endif

UserInput.c

#include <stdio.h>

void getInput(int *output) {
    scanf("%i", output);
}    

main.swift

import Foundation
var output: CInt = 0
getInput(&output)
print(output)

cliinput-ब्रिजिंग-Header.h

#include "UserInput.h"

मूल वीडियो यह समझा रहा है


इस पोस्ट में क्लैंग के मॉड्यूल समर्थन का उपयोग करके ऐसा करने के तरीके के बारे में भी एक अच्छी व्याख्या है।

यह कॉमनक्रिप्टो प्रोजेक्ट के लिए ऐसा करने के तरीके के आधार पर तैयार किया गया है, लेकिन सामान्य रूप से इसे किसी अन्य सी लाइब्रेरी के लिए काम करना चाहिए जिसे आप स्विफ्ट के भीतर से उपयोग करना चाहते हैं।

मैंने संक्षेप में zlib के लिए ऐसा करने के साथ प्रयोग किया। मैंने एक नया आईओएस फ्रेमवर्क प्रोजेक्ट बनाया और एक निर्देशिका zlib बनाया, जिसमें मॉड्यूल.मोडालेमैप फ़ाइल निम्न है:

module zlib [system] [extern_c] {
    header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/zlib.h"
    export *
}

फिर लक्ष्य के तहत -> पुस्तकालयों के साथ लिंक बाइनरी मैंने आइटम जोड़ने और libz.tbd जोड़ा।

आप इस बिंदु पर निर्माण करना चाह सकते हैं।

मैं फिर निम्नलिखित कोड लिखने में सक्षम था:

import zlib

public class Zlib {
    public class func zlibCompileFlags() -> UInt {
        return zlib.zlibCompileFlags()
    }
}

आपको ज़्लिब लाइब्रेरी का नाम सामने नहीं रखना है, उपर्युक्त मामले को छोड़कर मैंने स्विफ्ट क्लास को सी फंक्शन के समान ही नाम दिया है, और योग्यता के बिना स्विफ्ट फंक को एप्लिकेशन बंद होने तक बार-बार कहा जा रहा है।





swift