“问题”是前两个参数被声明为char *
而不是const char *,即使函数没有修改字符串:
int dgeev_(char *__jobvl, char *__jobvr, ...);
映射到 Swift 为
func dgeev_(__jobvl: UnsafeMutablePointer<Int8>, __jobvr: UnsafeMutablePointer<Int8>, ...) -> Int32;
一种可能的解决方法是
let result = "N".withCString {
dgeev_(UnsafeMutablePointer($0), UnsafeMutablePointer($0), &N, ...)
}
在块内部,$0 是一个指向以 NUL 结尾的 char 数组的指针,其中
字符串的 UTF-8 表示形式。
备注: dgeev_() 不会修改前两个参数指向的字符串,
所以它“应该”声明为
int dgeev_(const char *__jobvl, const char *__jobvr, ...);
这将被映射到 Swift
func dgeev_(__jobvl: UnsafePointer<Int8>, __jobvr: UnsafePointer<Int8>, ...) -> Int32;
在这种情况下,您可以简单地将其称为
let result = dgeev_("N", "N", &N, ...)
因为 Swift 字符串会自动转换为UnsafePointer<Int8>),
如String value to UnsafePointer<UInt8> function parameter behavior 中所述。