दिलचस्प पोस्ट
अजगर और सुंदर सूप का उपयोग करके वेब पेज से लिंक पुनर्प्राप्त करें तीर शैली परिवर्तन का चयन करें इन्स्ट के बराबर क्यों है? मुझे जीसीएम सर्वर साइड से "बेमेल सेंडरआईडी" क्यों मिलता है? स्टेटमेंट .setFetchSize (nSize) विधि वास्तव में SQL सर्वर JDBC ड्रायवर में क्या करती है? स्क्रैप करने पर नोड से सभी पाठों में शामिल होने से कैसे बचें पाठ के साथ SQLServer पहचान कॉलम कोको के साथ लॉगिन आइटम के रूप में पंजीकरण करें? एक सदस्य समारोह के अंत में एक const का क्या अर्थ है? रीसाइक्लियर दृश्य आइटम को सजीव कैसे करें, जब वे दिखाई देते हैं मापदंडों के साथ मिलकर विभिन्न प्रतीकों (*, और, आदि) के बीच भेद क्या है? स्विफ्ट का उपयोग करके किसी श्रेणी में एक यादृच्छिक संख्या कैसे उत्पन्न करें (10 … 20) लिंट के लिए सी / सी ++ फ्री विकल्प? लॉगिंग, पहलू उन्मुखी प्रोग्रामिंग, और निर्भरता इंजेक्शन – यह सब समझने की कोशिश कर रहा है मैं @ Html.LabelFor टेम्पलेट को ओवरराइड कर सकता / सकती हूं?

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

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

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

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

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

वेब के समाधान से एकत्रित समाधान "स्विफ्ट से सी कैसे कॉल करें?"

हां, आप निश्चित रूप से सेब सी पुस्तकालयों के साथ बातचीत कर सकते हैं। यहां बताया गया है कि कैसे
असल में, सी प्रकार, सी पॉइंटर्स, आदि स्विफ्ट ऑब्जेक्ट्स में अनुवादित होते हैं, उदाहरण के लिए स्विफ्ट में सी CInt एक 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); 

यहां मूल उत्तर है

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

 import Cocoa let frame = CGRect(x: 10, y: 10, width: 100, height: 100) import Darwin for _ in 1..10 { println(rand() % 100) } 

डॉक्स में उद्देश्य-सी एपीआई के साथ इंटरैक्टिंग देखें।

बस के मामले में आप मुझे के रूप में XCode के लिए नए के रूप में कर रहे हैं और Leandro के जवाब में तैनात स्निपेट्स का प्रयास करना चाहते हैं:

  1. फ़ाइल> New-> परियोजना
  2. प्रोजेक्ट प्रीसेट के रूप में कमांड लाइन टूल चुनें और प्रोजेक्ट "क्लीइनपुट" का नाम दें
  3. प्रोजेक्ट नेविगेटर (बाईं ओर नीले पैनल) पर राइट-क्लिक करें और "नई फ़ाइल …" चुनें
  4. ड्रॉप डाउन संवाद नाम "यूजर इनपुट" नामक फ़ाइल में "शीर्षलेख फ़ाइल भी बनाएं" बॉक्स को अनचेक करें एक बार जब आप "अगला" पर क्लिक करेंगे तो आपको पूछा जाएगा कि क्या XCode को आपके लिए ब्रिजिंग-हेडर हैएच फ़ाइल बनाना चाहिए। "हां" चुनें
  5. ऊपर दिए गए लिंड्रो के उत्तर से कोड कॉपी और पेस्ट करें। एक बार जब आप नाटक बटन पर क्लिक करते हैं, तो उसे टर्मिनल में संकलन और चलाया जाना चाहिए, जो कि एक्सकोड में नीचे के पैनल में बनाया गया है। यदि आप टर्मिनल में एक नंबर दर्ज करते हैं, तो एक नंबर लौटाया जाएगा।

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

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

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

 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() } } 

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

ऐसा लगता है कि एक अलग बॉल 'ओ मोम जब संकेत के साथ काम करते हैं। सी POSIX सिस्टम कॉल को कॉल करने के लिए अब तक मेरे पास क्या है:

 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 }