7

मैं लिनक्स पर कुछ कोड संकलित करने की कोशिश कर रहा हूं जो CoreFoundation और Foundation दोनों का उपयोग करता है, लेकिन लिनक्स मैकोज़ और आईओएस के समान तरीके से ब्रिजिंग को लागू नहीं करता है।लिनक्स पर कोरफाउंडेशन से/से ब्रिजिंग

ऑब्जेक्टिव-सी और स्विफ्ट के बीच सेतु काम करता है:

import Foundation 
import CoreFoundation 
import Glibc 

func wantsNSString(_ string: NSString) { 
     print(string) 
} 

let string = "Hello, world!" 
wantsNSString(string._bridgeToObjectiveC()) 

लेकिन मैं समझ नहीं CoreFoundation को पाटने के लिए कैसे। मैं सिर्फ एक समारोह चाहता है के लिए एक NSString पारित नहीं हो सकता एक CFString:

import Foundation 
import CoreFoundation 
import Glibc 

func wantsCFString(_ string: CFString) { 
     print(string) 
} 

let string = "Hello, world!" 
wantsCFString(string._bridgeToObjectiveC()) //error: cannot convert value of type 'String._ObjectType' (aka 'NSString') to expected argument type 'CFString' 

मैं सिर्फ MacOS पर है जैसे कि यह कास्ट नहीं कर सकते हैं:

import Foundation 
import CoreFoundation 
import Glibc 

func wantsCFString(_ string: CFString) { 
     print(string) 
} 

let string = "Hello, world!" 
wantsCFString(string._bridgeToObjectiveC() as CFString) 
//error: 'String._ObjectType' (aka 'NSString') is not convertible to 'CFString'; did you mean to use 'as!' to force downcast? 

त्रुटि संदेश की तरह as! का उपयोग compiles पता चलता है लेकिन

error: conditional downcast to CoreFoundation type 'CFString' will always succeed 

: क्रम (Illegal instruction), और as? पर एक दुर्घटना में परिणाम त्रुटि पैदा करता हैमें एनएस और सीएफ प्रकारों के बीच कनवर्ट करने के लिए प्रोटोकॉल हैं, और कई प्रकार के प्रारंभकर्ता और गुण हैं, लेकिन वे सभी internal या private हैं। I केवल CFStringCreateWithCString का उपयोग कर सकता है, लेकिन इसे InputStream और CFReadStream जैसे अन्य क्लास जोड़े के साथ काम करने की आवश्यकता है।

क्या मुझे यहां कुछ याद आ रहा है, या क्या वास्तव में लिनक्स पर फाउंडेशन और कोरफाउंडेशन प्रकारों के बीच कनवर्ट करने का कोई तरीका नहीं है?

+0

क्या यह काम करता है? http://stackoverflow.com/a/24900185/603977 बदसूरत डबल कास्ट। हालांकि, लिनक्स के बारे में नहीं जानते। लिफ्ट पर स्विफ्ट के साथ बड़ा "गोचा" यह है कि ओबीजेसी रनटाइम वहां नहीं है। –

+0

@ जोश कैसवेल नहीं; स्विफ्ट एंड फाउंडेशन के बीच ब्रिजिंग [अभी तक कंपाइलर द्वारा स्वचालित रूप से नहीं किया गया है] (https://github.com/apple/swift-corelibs-foundation/blob/master/Docs/Issues.md), यही कारण है कि मुझे करना है अस्थायी '_bridgeToObjectiveC' विधि का उपयोग करें, और मैंने अपने तीसरे उदाहरण में' NSString' से 'CFString' तक कास्टिंग करने का प्रयास किया। – NobodyNada

उत्तर

1

ऐसा लगता है कि मैं यह कर सकते हैं unsafeBitCastNSString को/CFString से:

import Foundation 
import CoreFoundation 
import Glibc 

func wantsCFString(_ string: CFString) { 
     print(string) 
} 

let string = "Hello, world!" 
wantsCFString(unsafeBitCast(string._bridgeToObjectiveC(), to: CFString.self) 
//prints "Hello, world!" 

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

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