Ich versuche, eine ObjC-Stackoverflow-Antwort in Swift und fehlgeschlagen zu konvertieren. Es sieht so aus, als ob ich ein UnsafeMutablePointer<mach_msg_type_number_t>
übergebe, wenn ich ein inout mach_msg_type_number_t
weitergeben sollte und ich mein Problem nicht lösen kann. Soweit ich die Swift-Pointer-Dokumentation verstehe (nicht viel) sollten diese austauschbar sein.?
Weitere Informationen unten.
Hier ist das Ziel C:
%Vor%und hier ist so weit wie ich in Swift (viele Zeilen für eine einfachere Typprüfung)
%Vor% Die task_info
Signatur lautet:
und der Fehler in der letzten Zeile ist:
%Vor%Bei der Interaktion mit C-Funktionen können Sie sich nicht auf die Fehlermeldungen des Compilers verlassen. Teilen Sie den Parameter nach Parametern auf, klicken Sie auf den Befehl, bis Sie wissen, mit was Sie arbeiten. Die Typen, mit denen Sie beginnen, sind:
task_name_t
: UInt32
task_flavor_t
: UInt32
task_info_t
: UnsafeMutablePointer<Int32>
UnsafeMutablePointer<mach_msg_type_number_t>
: UnsafeMutablePointer<UInt32>
kern_return_t
- Int32
Es gibt ein kniffliges Swift-Bit und einen Bug in deinem Code, der hier im Weg steht. Erstens muss der Parameter task_info_out
ein UnsafeMutablePointer<UInt32>
sein, muss aber auf eine Instanz von mach_task_basic_info
zeigen. Wir können das umgehen, indem wir ein UnsafeMutablePointer<mach_task_basic_info>
erstellen und es zum Zeitpunkt des Aufrufs in ein anderes UnsafeMutablePointer
einschließen. Der Compiler verwendet Typinferenz, um zu wissen, dass der Wrapping-Zeiger als% untergeteilt werden soll. co_de%.
Zweitens rufen Sie UInt32
(den Zeiger auf sizeof(mach_task_basic_info_t)
) auf, wenn Sie mach_task_basic_info
aufrufen sollten, damit Ihre Byteanzahl zu niedrig ist, um die Datenstruktur zu halten.
Bei weiteren Untersuchungen wurde das etwas komplizierter. Der ursprüngliche Code dafür war falsch, da sizeinfo(mach_task_basic_info)
auf die Konstante size
initialisiert werden sollte. Leider ist das ein Makro, keine einfache Konstante:
Swift importiert diese nicht, also müssen wir es selbst neu definieren. Hier ist Arbeitscode für all das:
%Vor%Nates Antwort ist ausgezeichnet, aber es gibt eine Feinabstimmung, die Sie machen können, um es zu vereinfachen.
Erstens, anstatt den task_basic_info
-Zeiger zuzuweisen / freizugeben, können Sie die Struktur auf dem Stapel erstellen und dann withUnsafeMutablePointer
verwenden, um einen Zeiger direkt darauf zu bekommen, den Sie übergeben können.