2016-01-30 9 views
8

स्विफ्ट से सी में कॉल करना बहुत आसान है, हालांकि मैं सी में द्वि-दिशात्मक रैपर बनाने की सोच रहा हूं, इसलिए मेरे सी को स्विफ्ट फ़ंक्शंस को कॉल करना है।सी से स्विफ्ट में कॉल करने का सबसे अच्छा तरीका क्या है?

अभी, मैं सी में फ़ंक्शन पॉइंटर्स घोषित करके ऐसा कर सकता हूं, और स्विफ्ट पक्ष ने उन्हें स्विफ्ट में कॉल कोड पर सेट करने के बाद उन्हें कॉल करने के बाद कॉल किया है।

मेरे सी हेडर फाइल:

typedef void (*callback_t)(void); 

void callBackIntoSwift(callback_t cb); 

मेरे सी कार्यान्वयन फ़ाइल:

#include "stuff.h" 
#include <stdio.h> 

void callBackIntoSwift(callback_t cb) 
{ 
    printf("Will call back into Swift\n"); 
    cb(); 
    printf("Did call back into Swift\n"); 
} 

ब्रिजिंग शीर्षक में मेरी सी हेडर फाइल सहित के बाद, मैं स्विफ्ट की ओर निम्न कर सकते हैं:

let cb: callback_t = { 
    someKindOfSwiftFunction() 
} 

callBackIntoSwift(cb) 

या भी:

callBackIntoSwift { 
    someKindOfSwiftFunction() 
} 

क्या ऐसा करने का कोई बेहतर तरीका है, जहां फ़ंक्शन पॉइंटर्स और कॉलबैक की आवश्यकता नहीं है? मैं सीधे सी-साइड कॉल someKindOfSwiftFunction को कॉल करना चाहता हूं ... लेकिन जब मैं घोषणाओं को कार्य करने के लिए @convention (c) लागू करने का प्रयास करता हूं तो मुझे यह संदेश मिलता है कि विशेषता केवल प्रकारों पर लागू की जा सकती है, न कि घोषणाओं।

उदा। किसी भी विचार या कोडबेस उदा। गितूब मैं देख सकता हूं?

उत्तर

0

आप कुछ इस तरह कर सकते हैं:

FileSwift.swift

public class SwiftTest: NSObject { 
    @objc public static func testMethod() { 
     print("Test") 
    } 
} 

FileSwiftWrapper.h

void SwiftFunctionWrapper(); 

FileSwiftWrapper.m

#import "ProductModuleName-Swift.h" 

void SwiftFunctionWrapper() { 
     [SwiftTest testMethod]; 
} 
+1

ओपी, कैसे कॉल करने के लिए नहीं एक ऑब्जेक्टिव-सी विधि – pbush25

+0

लेखक swif कॉल करना चाहते हैं सी से टी कोड। "स्विफ्ट से सी में कॉल करना बहुत आसान है, हालांकि मैं सी में द्वि-दिशात्मक रैपर बनाने की सोच रहा हूं, इसलिए मेरे सी को स्विफ्ट फ़ंक्शंस को कॉल करना है।" @ pbush25 – Rolan

+0

शायद मैं अपनी टिप्पणी बढ़ा सकता हूं। 'स्विफ्टफंक्शनक्शन()' फ़ंक्शन को किसी भी सी फ़ाइल से बुलाया जा सकता है। – Rolan

1

Joe Groff के अनुसार:

अभी तक कोई आधिकारिक तरीका नहीं है। नाम मैंगलिंग के अलावा, स्विफ्ट फ़ंक्शंस सी से अनधिकृत रूप से एक अलग कॉलिंग सम्मेलन का उपयोग करते हैं, यदि आप कोड ब्रेकेज और कंपाइलर बग की सामान्य मात्रा से अधिक निपटने के इच्छुक हैं, तो यह एक अनधिकृत विशेषता @_cdecl है जो यह करता है:

@_cdecl("mymodule_foo") 
func foo(x: Int) -> Int { 
    return x * 2 
} 

जो आप तो सी से कॉल कर सकते हैं: तेज में सी कार्यों बुला के बारे में पूछा

#include <stdint.h> 

intptr_t mymodule_foo(intptr_t); 

intptr_t invoke_foo(intptr_t x) { 
    return mymodule_foo(x); 
} 
+1

Altough यह उत्तर सही है, मुझे कुछ काम करने में परेशानी होती है। [यही कारण है कि मैंने एक छोटा सा लेख बनाया] (https://gist.github.com/HiImJulien/c79f07a8a619431b88ea33cca51de787)। – Julien

संबंधित मुद्दे