मैं लिनक्स पर कुछ कोड संकलित करने की कोशिश कर रहा हूं जो 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
जैसे अन्य क्लास जोड़े के साथ काम करने की आवश्यकता है।
क्या मुझे यहां कुछ याद आ रहा है, या क्या वास्तव में लिनक्स पर फाउंडेशन और कोरफाउंडेशन प्रकारों के बीच कनवर्ट करने का कोई तरीका नहीं है?
क्या यह काम करता है? http://stackoverflow.com/a/24900185/603977 बदसूरत डबल कास्ट। हालांकि, लिनक्स के बारे में नहीं जानते। लिफ्ट पर स्विफ्ट के साथ बड़ा "गोचा" यह है कि ओबीजेसी रनटाइम वहां नहीं है। –
@ जोश कैसवेल नहीं; स्विफ्ट एंड फाउंडेशन के बीच ब्रिजिंग [अभी तक कंपाइलर द्वारा स्वचालित रूप से नहीं किया गया है] (https://github.com/apple/swift-corelibs-foundation/blob/master/Docs/Issues.md), यही कारण है कि मुझे करना है अस्थायी '_bridgeToObjectiveC' विधि का उपयोग करें, और मैंने अपने तीसरे उदाहरण में' NSString' से 'CFString' तक कास्टिंग करने का प्रयास किया। – NobodyNada