में सी फंक्शंस के लिए पूर्ण फ़ंक्शन प्वाइंटर्स का प्रतिनिधित्व करना निजी-अभी-तरह के दस्तावेज कोको सी फ़ंक्शन _NSLogCStringFunction()
और _NSSetLogCStringFunction()
पर विचार करें। _NSLogCStringFunction()
NSLog()
के लिए ऑब्जेक्टिव-सी रनटाइम के पीछे-दृश्यों द्वारा उपयोग किए गए सी फ़ंक्शन में फ़ंक्शन पॉइंटर लौटाता है, और _NSSetLogCStringFunction()
डेवलपर्स को लॉगिंग के लिए अपना स्वयं का फ़ंक्शन निर्दिष्ट करने की अनुमति देता है। इन दोनों कार्यों पर अधिक जानकारी this Stack Overflow question और this WebObjects support article में मिल सकती है।स्विफ्ट
सी में, मैं _NSSetLogCStringFunction()
करने के लिए एक शून्य समारोह सूचक में पारित कर सकते हैं:
extern void _NSSetLogCStringFunction(void(*)(const char*, unsigned, BOOL));
_NSSetLogCStringFunction(NULL); // valid
हालांकि, मैं कुछ मुद्दों में चल रहा हूँ जब मैं शुद्ध स्विफ्ट में ऐसा करने का प्रयास करें:
/// Represents the C function signature used under-the-hood by NSLog
typealias NSLogCStringFunc = (UnsafePointer<Int8>, UInt32, Bool) -> Void
/// Sets the C function used by NSLog
@_silgen_name("_NSSetLogCStringFunction")
func _NSSetLogCStringFunction(_: NSLogCStringFunc) -> Void
_NSSetLogCStringFunction(nil) // Error: nil is not compatible with expected argument type 'NSLogCStringFunc' (aka '(UnsafePointer<Int8>, UInt32, Bool) ->()')
यदि मैं unsafeBitCast
के साथ इस संकलन-समय चेतावनी को बाईपास करने का प्रयास करता हूं, तो मेरा प्रोग्राम केवल EXC_BAD_INSTRUCTION
(जैसा कि अपेक्षित है, हस्ताक्षर गलत है) के साथ क्रैश हो जाता है:
let nullPtr: UnsafePointer<Void> = nil
let nullFuncPtr = unsafeBitCast(nullPtr, NSLogCStringFunc.self)
_NSSetLogCStringFunction(nullFuncPtr) // crash
मैं (void *)
या स्विफ्ट में (void(*)(const char *, unsigned, BOOL))
/(UnsafePointer<Int8>, UInt32, Bool) -> Void
करने के लिए एक NULL
समारोह सूचक कैसे प्रतिनिधित्व करते हैं?
lol, जो भी कारण के लिए तत्काल downvote - वहाँ भी समय पूरे प्रश्न पढ़ने के लिए नहीं था। – luk2302
@ luk2302 मान लीजिए मेरे पास एक प्रशंसक है :) यह मेरे लिए एक नया रिकॉर्ड है, -1 44 सेकंड में। – JAL