जवाबों:
हां, आप निश्चित रूप से सेब सी लाइब्रेरी के साथ बातचीत कर सकते हैं। यहाँ बताया गया है कि कैसे।
मूल रूप से, C प्रकार, C पॉइंटर्स आदि का स्विफ्ट ऑब्जेक्ट में अनुवाद किया जाता है, उदाहरण के लिए C int
में स्विफ्ट एक है CInt
।
मैंने एक छोटे से उदाहरण का निर्माण किया है, एक और प्रश्न के लिए, जिसे थोड़ा स्पष्टीकरण के रूप में इस्तेमाल किया जा सकता है, सी और स्विफ्ट के बीच पुल कैसे करें:
main.swift
import Foundation
var output: CInt = 0
getInput(&output)
println(output)
UserInput.c
#include <stdio.h>
void getInput(int *output) {
scanf("%i", output);
}
cliinput-ब्रिजिंग-Header.h
void getInput(int *output);
यहाँ मूल जवाब है।
कंपाइलर सी एपीआई को स्विफ्ट में उसी तरह परिवर्तित करता है, जैसा वह ऑब्जेक्टिव-सी के लिए करता है।
import Cocoa
let frame = CGRect(x: 10, y: 10, width: 100, height: 100)
import Darwin
for _ in 1..10 {
println(rand() % 100)
}
डॉक्स में ऑब्जेक्टिव-सी एपीआई के साथ सहभागिता देखें ।
CFTypeRef
) स्विफ्ट ऑब्जेक्ट्स में कनवर्ट किए जाते हैं। हालाँकि, अधिकांश ObjCRuntime.h फ़ंक्शन स्विफ्ट के लिए सार्थक नहीं हैं, हालाँकि।
बस के मामले में आप मेरे लिए XCode के रूप में नए हैं और Leandro के जवाब में पोस्ट किए गए स्निपेट्स आज़माना चाहते हैं :
ये पद क्लैंग के मॉड्यूल समर्थन का उपयोग करने के बारे में एक अच्छी व्याख्या भी है ।
राष्ट्रमंडल परियोजना के लिए यह कैसे करना है, इसके संदर्भ में इसे तैयार किया गया है, लेकिन सामान्य तौर पर इसे किसी अन्य सी लाइब्रेरी के लिए काम करना चाहिए जिसे आप स्विफ्ट के भीतर से उपयोग करना चाहते हैं।
मैंने संक्षेप में ज़ालिब के लिए ऐसा करने का प्रयोग किया। मैंने एक नया iOS फ्रेमवर्क प्रोजेक्ट बनाया और एक डायरेक्टरी 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()
}
}
आपको zlib लाइब्रेरी नाम सामने रखने की आवश्यकता नहीं है , उपरोक्त मामले को छोड़कर मैंने स्विफ्ट क्लास का नाम C फ़ंक्शन के समान ही दिया गया है, और योग्यता के बिना स्विफ्ट की फ़ोकस को तब तक बार-बार कॉल किया जाता है जब तक कि आवेदन रुक नहीं जाता।
C ++ के मामले में, यह त्रुटि है कि पॉप अप:
"_getInput", referenced from:
आपको c ++ हैडर फ़ाइल भी चाहिए। अपने फ़ंक्शन में सी-लिंकेज जोड़ें , फिर ब्रिज-हेडर में हेडर फ़ाइल को शामिल करें:
स्विफ्ट 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"
यहाँ मूल वीडियो यह समझा रहा है
__OBJC
तो अपने ब्रिजिंग-हैडर में चेक जोड़ने का प्रयास करें, जैसे#ifdef __OBJC @import UIKit; #endif
यह संकेत देने वालों के साथ काम करते समय एक अलग गेंद 'ओ मोम' प्रतीत होता है। यहाँ C COSIX read
सिस्टम कॉल के लिए मेरे पास अब तक क्या है :
enum FileReadableStreamError : Error {
case failedOnRead
}
// Some help from: http://stackoverflow.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
}