Considerare le funzioni Cocoa C private-ancora-di-documentate _NSLogCStringFunction()
e _NSSetLogCStringFunction()
. _NSLogCStringFunction()
restituisce un puntatore alla funzione C utilizzata dal runtime Objective-C dietro le quinte per NSLog()
e _NSSetLogCStringFunction()
consente agli sviluppatori di specificare la propria funzione C per la registrazione. Ulteriori informazioni su entrambe queste funzioni sono disponibili in this Stack Overflow question e this WebObjects support article.Rappresentazione di funzioni NULL da puntatori a funzioni C in Swift
In C, posso passare in un puntatore a funzione NULL per _NSSetLogCStringFunction()
:
extern void _NSSetLogCStringFunction(void(*)(const char*, unsigned, BOOL));
_NSSetLogCStringFunction(NULL); // valid
Comunque, sto correndo in alcuni problemi quando provo a fare questo in puro Swift:
/// 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) ->()')
Se provo a ignorare questo avviso in fase di compilazione con unsafeBitCast
, il mio programma si arresta immediatamente con EXC_BAD_INSTRUCTION
(come previsto, poiché la firma è errata):
let nullPtr: UnsafePointer<Void> = nil
let nullFuncPtr = unsafeBitCast(nullPtr, NSLogCStringFunc.self)
_NSSetLogCStringFunction(nullFuncPtr) // crash
Come si rappresenta un puntatore di funzione NULL
su (void *)
o (void(*)(const char *, unsigned, BOOL))
/(UnsafePointer<Int8>, UInt32, Bool) -> Void
in Swift?
lol, downvote istante per qualsiasi motivo - non c'era nemmeno il tempo di leggere l'intera questione. – luk2302
@ luk2302 Indovina che ho un fan :) Questo è un nuovo record per me, -1 in 44 secondi. – JAL