文書化されているプライベート・ソート済みのCocoa C関数_NSLogCStringFunction()
と_NSSetLogCStringFunction()
を考えてみましょう。 _NSLogCStringFunction()
は、NSLog()
のObjective-Cランタイムバックグラウンドで使用されるC関数への関数ポインタを返します。_NSSetLogCStringFunction()
は、開発者が独自のC関数をログに指定できるようにします。これらの機能の詳細については、this Stack Overflow questionおよびthis WebObjects support articleを参照してください。 CではSwiftのC関数へのNULL関数ポインタの表現
、私は_NSSetLogCStringFunction()
にNULL関数ポインタを渡すことができます。
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
Swiftの(void *)
または(void(*)(const char *, unsigned, BOOL))
/(UnsafePointer<Int8>, UInt32, Bool) -> Void
へのNULL
関数ポインタを表すにはどうすればよいですか?
笑、何らかの理由でインスタントdownvote - 全体の質問を読んでも、時間がありませんでした。 – luk2302
@ luk2302私はファンがいると思う:)それは私のための新しい記録、44秒で-1です。 – JAL