UnsafeMutablePointer<Int8> von String in Swift
Ich bin mit der dgeev
- Algorithmus aus der LAPACK-Implementierung in der Accelerate-framework zu berechnen, die Eigenvektoren und Eigenwerte einer matrix. Leider ist der LAPACK Funktionen sind nicht beschrieben in der Apple-Dokumentation mit einem bloßen link zu http://netlib.org/lapack/faq.html enthalten.
Wenn Sie nachschauen, werden Sie feststellen, dass die ersten beiden Argumente in dgeev
sind Zeichen, die signalisieren, ob die Berechnung Eigenvektoren oder nicht. Im Swift ist es zu Fragen für UnsafeMutablePointer<Int8>
. Wenn ich einfach verwenden "N"
bekomme ich einen Fehler. Die dgeev
Funktion und die Fehler die beschrieben werden in der folgenden Abbildung
Was soll ich tun um dieses Problem zu lösen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das "problem" ist, dass die ersten zwei Parameter deklariert
char *
und nicht als
const char *
, auch wenn die strings nicht geändert werden, durch die Funktion:zugeordnet ist, die Swift als
Eine mögliche Problemumgehung besteht
Im block
$0
ist ein Zeiger auf eine NULL-terminiertes array vonchar
mit derUTF-8-Darstellung von string.
Bemerkung:
dgeev_()
nicht ändern Sie die Zeichenfolgen auf die ersten beiden Argumente,also ist es "sein sollte", erklärte der als
wäre zugeordnet die Swift als
und in diesem Fall können Sie einfach nennen, wie
weil Swift die Umwandlung von strings in
UnsafePointer<Int8>)
automatisch,wie bereits in String-Wert auf UnsafePointer<UInt8> - Funktion parameter-Verhalten.
Es ist hässlich, aber Sie verwenden können:
und verwenden
unsafeMutablePointerOfN
als parameter anstelle von "N"..UTF8String
ist nur garantiert werden, solange gültig, wie dieNSString
Objekt vorhanden ist, und könnten sofort zerstört werden, weil es keine Bezugnahme auf es nach der ersten Zeile. Wahrscheinlich wird dies hier nicht passieren, da der string hier wird eine Literale Konstante.Swift 4.2 und 5 Sie können diese ähnlichen Ansatz
Können Sie das Ergebnis von
unsafePointer
.