दिलचस्प पोस्ट
पाइप बफर आकार 4k या 64k है? एक UIImage पर एक और छवि खींचें एक स्थिर वेब अनुप्रयोग में पृष्ठांकन अजाक्स कॉल प्रतिक्रिया की तरह 'के लिए (;;); {json डेटा} 'का अर्थ है? Xib के साथ एक पुन: प्रयोज्य UIView बनाना (और स्टोरीबोर्ड से लोड करना) php स्ट्रिंग समापन, प्रदर्शन अजगर के साथ बीडीडी का अभ्यास डाटा बाध्यकारी बिना मूल्य सौंपें स्विफ्ट में स्टैटिक फ़ंक और क्लास फंक के बीच अंतर क्या है? बजाय नियंत्रक देखने के लिए कैसे (या नेविगेशन स्टैक से हटा) segue धक्का के बजाय? कैसे "पूरी तरह से" एक dict पर ओवरराइड? सेलेनियम वेबड्रिवर पृष्ठभूमि में चुपचाप खुली ब्राउज़र विंडो कर सकते हैं? आईओएस विंडो की रूट व्यू नियंत्रक बदलना मैं मौजूदा निष्पादित फाइल का पथ पायथन में कैसे प्राप्त करूं? एमएस एसक्यूएल सर्वर प्रबंधन स्टूडियो का उपयोग किए बिना मैं SQL सर्वर में अपना डिफ़ॉल्ट डेटाबेस कैसे बदल सकता हूँ?

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

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

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

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

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

Solutions Collecting From Web of "स्विफ्ट से सी कैसे कॉल करें?"

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