Betrachten Sie die noch nicht dokumentierten Cocoa C-Funktionen _NSLogCStringFunction()
und _NSSetLogCStringFunction()
. _NSLogCStringFunction()
gibt einen Funktionszeiger auf die C-Funktion zurück, die von der Objective-C-Laufzeit hinter den Kulissen für NSLog()
verwendet wird, und _NSSetLogCStringFunction()
ermöglicht Entwicklern, ihre eigene C-Funktion für die Protokollierung anzugeben. Weitere Informationen zu diesen beiden Funktionen finden Sie unter this Stack Overflow question und this WebObjects support article.Darstellen von NULL-Funktionszeigern zu C-Funktionen in Swift
In C, kann ich in einem NULL-Funktionszeiger auf _NSSetLogCStringFunction()
passieren:
extern void _NSSetLogCStringFunction(void(*)(const char*, unsigned, BOOL));
_NSSetLogCStringFunction(NULL); // valid
aber ich laufe in einige Probleme, wenn ich versuche, dies in reiner Swift zu tun:
/// 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) ->()')
Wenn ich versuche, diese Kompilierungswarnung mit unsafeBitCast
zu umgehen, stürzt mein Programm einfach mit EXC_BAD_INSTRUCTION
ab (wie erwartet, da die Signatur falsch ist):
let nullPtr: UnsafePointer<Void> = nil
let nullFuncPtr = unsafeBitCast(nullPtr, NSLogCStringFunc.self)
_NSSetLogCStringFunction(nullFuncPtr) // crash
Wie stelle ich einen NULL
Funktionszeiger auf (void *)
oder (void(*)(const char *, unsigned, BOOL))
/(UnsafePointer<Int8>, UInt32, Bool) -> Void
in Swift dar?
lol, Instant downvote welchen Grund auch immer - war es nicht einmal Zeit, um die ganze Frage zu lesen. – luk2302
@ luk2302 Schätze, ich habe einen Fan :) Das ist ein neuer Rekord für mich, -1 in 44 Sekunden. – JAL