Hãy xem xét các hàm C Cacao riêng tư chưa được sắp xếp tài liệu _NSLogCStringFunction()
và _NSSetLogCStringFunction()
. _NSLogCStringFunction()
trả về một con trỏ hàm đến hàm C được sử dụng bởi thời gian chạy Objective-C phía sau hậu trường cho NSLog()
và _NSSetLogCStringFunction()
cho phép các nhà phát triển chỉ định hàm C của riêng họ để ghi nhật ký. Bạn có thể tìm thêm thông tin về cả hai chức năng này trong this Stack Overflow question và this WebObjects support article.Trình bày các con trỏ hàm chức năng NULL cho hàm C trong Swift
Trong C, tôi có thể vượt qua trong một con trỏ hàm NULL để _NSSetLogCStringFunction()
:
extern void _NSSetLogCStringFunction(void(*)(const char*, unsigned, BOOL));
_NSSetLogCStringFunction(NULL); // valid
Tuy nhiên, tôi đang chạy vào một số vấn đề khi tôi cố gắng để làm điều này trong tinh khiết 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) ->()')
Nếu tôi thử bỏ qua cảnh báo thời gian biên dịch này với unsafeBitCast
, chương trình của tôi chỉ gặp sự cố với EXC_BAD_INSTRUCTION
(như dự kiến, vì chữ ký sai):
let nullPtr: UnsafePointer<Void> = nil
let nullFuncPtr = unsafeBitCast(nullPtr, NSLogCStringFunc.self)
_NSSetLogCStringFunction(nullFuncPtr) // crash
Làm cách nào để biểu thị con trỏ hàm NULL
tới (void *)
hoặc (void(*)(const char *, unsigned, BOOL))
/(UnsafePointer<Int8>, UInt32, Bool) -> Void
trong Swift?
lol, downvote ngay lập tức vì lý do gì - chẳng có thậm chí thời gian để đọc toàn bộ câu hỏi. – luk2302
@ luk2302 Đoán tôi có một fan hâm mộ :) Đó là một kỷ lục mới cho tôi, -1 trong 44 giây. – JAL