Ответ 1
Вы можете просто сохранить функцию C и вызвать ее из Swift. Рецепты, приведенные в Как вызвать код Objective-C из Swift, применимы и к чистому C-коду.
Но на самом деле не слишком сложно перевести этот код в Swift:
func amIBeingDebugged() -> Bool {
var info = kinfo_proc()
var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()]
var size = strideofValue(info)
let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0)
assert(junk == 0, "sysctl failed")
return (info.kp_proc.p_flag & P_TRACED) != 0
}
Примечания:
-
kinfo_proc()
создает полностью инициализированную структуру со всеми поля установлены на ноль, поэтому установкаinfo.kp_proc.p_flag = 0
не требуется. - Тип C
int
Int32
- Swift. -
sizeof(info)
из кода C должен бытьstrideOfValue(info)
в Swift, чтобы включить прокладку структуры. СsizeofValue(info)
вышеуказанный код всегда возвращал false в Simulator для 64-разрядных устройств. Это была самая трудная часть, чтобы понять.
Обновление для Swift 3 (Xcode 8):
strideofValue
и связанные функции уже не существуют,
они были заменены на MemoryLayout
:
func amIBeingDebugged() -> Bool {
var info = kinfo_proc()
var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()]
var size = MemoryLayout<kinfo_proc>.stride
let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0)
assert(junk == 0, "sysctl failed")
return (info.kp_proc.p_flag & P_TRACED) != 0
}