UnsafeMutablePointer<Int8> 来自 Swift 中的字符串
UnsafeMutablePointer<Int8> from String in Swift
我正在使用 Accelerate 框架中 LAPACK 实现的 dgeev
算法来计算矩阵的特征向量和特征值。遗憾的是,Apple 文档中没有描述 LAPACK 函数,仅包含 link 到 http://netlib.org/lapack/faq.html。
查一下就会发现,dgeev
中的前两个参数是表示是否计算特征向量的字符。在 Swift 中,它要求 UnsafeMutablePointer<Int8>
。当我简单地使用 "N"
时,我得到一个错误。 dgeev
函数和错误在下面的截图中描述
我应该怎么做才能解决这个问题?
它很丑,但你可以使用:
let unsafePointerOfN = ("N" as NSString).UTF8String
var unsafeMutablePointerOfN: UnsafeMutablePointer<Int8> = UnsafeMutablePointer(unsafePointerOfN)
并使用 unsafeMutablePointerOfN
作为参数而不是 "N"。
中的"problem"就是前两个参数声明为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([=12=]), UnsafeMutablePointer([=12=]), &N, ...)
}
在块内,[=18=]
是一个指向以 NUL 结尾的 char
数组的指针,其中
字符串的 UTF-8 表示。
备注: dgeev_()
不修改前两个参数指向的字符串,
所以它 "should be" 声明为
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.
中所述
使用 Swift 4.2 和 5 你可以使用类似的方法
let str = "string"
let unsafePointer = UnsafeMutablePointer<Int8>(mutating: (str as NSString).utf8String)
您可以从 unsafePointer
得到结果。
我正在使用 Accelerate 框架中 LAPACK 实现的 dgeev
算法来计算矩阵的特征向量和特征值。遗憾的是,Apple 文档中没有描述 LAPACK 函数,仅包含 link 到 http://netlib.org/lapack/faq.html。
查一下就会发现,dgeev
中的前两个参数是表示是否计算特征向量的字符。在 Swift 中,它要求 UnsafeMutablePointer<Int8>
。当我简单地使用 "N"
时,我得到一个错误。 dgeev
函数和错误在下面的截图中描述
我应该怎么做才能解决这个问题?
它很丑,但你可以使用:
let unsafePointerOfN = ("N" as NSString).UTF8String
var unsafeMutablePointerOfN: UnsafeMutablePointer<Int8> = UnsafeMutablePointer(unsafePointerOfN)
并使用 unsafeMutablePointerOfN
作为参数而不是 "N"。
中的"problem"就是前两个参数声明为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([=12=]), UnsafeMutablePointer([=12=]), &N, ...)
}
在块内,[=18=]
是一个指向以 NUL 结尾的 char
数组的指针,其中
字符串的 UTF-8 表示。
备注: dgeev_()
不修改前两个参数指向的字符串,
所以它 "should be" 声明为
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.
使用 Swift 4.2 和 5 你可以使用类似的方法
let str = "string"
let unsafePointer = UnsafeMutablePointer<Int8>(mutating: (str as NSString).utf8String)
您可以从 unsafePointer
得到结果。