Pointers 非女性化指针<;Int8>;从斯威夫特的字符串

Pointers 非女性化指针<;Int8>;从斯威夫特的字符串,pointers,swift,char,lapack,accelerate-framework,Pointers,Swift,Char,Lapack,Accelerate Framework,我在加速框架中使用LAPACK实现的dgeev算法来计算矩阵的特征向量和特征值。遗憾的是,苹果的文档中没有对LAPACK函数进行描述,只包含了一个链接 如果您查找它,您会发现dgeev中的前两个参数是表示是否计算特征向量的字符。在Swift中,它请求不可分配指针。当我简单地使用“N”时,我会得到一个错误。dgeev功能和错误在以下屏幕截图中描述 我应该怎么做才能解决这个问题呢?这很难看,但您可以使用: let unsafePointerOfN = ("N" as NSString).UTF8St

我在加速框架中使用LAPACK实现的
dgeev
算法来计算矩阵的特征向量和特征值。遗憾的是,苹果的文档中没有对LAPACK函数进行描述,只包含了一个链接

如果您查找它,您会发现
dgeev
中的前两个参数是表示是否计算特征向量的字符。在Swift中,它请求
不可分配指针
。当我简单地使用
“N”
时,我会得到一个错误。
dgeev
功能和错误在以下屏幕截图中描述


我应该怎么做才能解决这个问题呢?

这很难看,但您可以使用:

let unsafePointerOfN = ("N" as NSString).UTF8String
var unsafeMutablePointerOfN: UnsafeMutablePointer<Int8> = UnsafeMutablePointer(unsafePointerOfN)
让unsafePointerOfN=(“N”作为NSString)。UTF8String
var unsafeMutablePointerOfN:UnsafeMutablePointer=UnsafeMutablePointer(unsafePointerOfN)
并使用
unsafemeutablepointerofn
作为参数,而不是“N”。

问题是前两个参数被声明为
char*
而不是作为
const char*
,即使函数未修改字符串:

int dgeev_(char *__jobvl, char *__jobvr, ...);
映射到Swift作为

func dgeev_(__jobvl: UnsafeMutablePointer<Int8>, __jobvr: UnsafeMutablePointer<Int8>, ...) -> Int32;
func dgeev_(__jobvl: UnsafePointer<Int8>, __jobvr: UnsafePointer<Int8>, ...) -> Int32;
在块内部,
$0
是一个指针,指向以NUL结尾的
字符数组
字符串的UTF-8表示形式


备注:
dgeev_389;()
不修改前两个参数所指向的字符串, 所以它“应该”被宣布为

int dgeev_(const char *__jobvl, const char *__jobvr, ...);
将映射到Swift作为

func dgeev_(__jobvl: UnsafeMutablePointer<Int8>, __jobvr: UnsafeMutablePointer<Int8>, ...) -> Int32;
func dgeev_(__jobvl: UnsafePointer<Int8>, __jobvr: UnsafePointer<Int8>, ...) -> Int32;
因为Swift字符串会自动转换为
UnsafePointer)

如中所述,使用Swift4.2和5,您可以使用类似的方法

let str = "string"
let unsafePointer = UnsafeMutablePointer<Int8>(mutating: (str as NSString).utf8String)
let str=“string”
让unsafePointer=UnsafeMutablePointer(变为:(str为NSString).utf8String)

您可以从
unsafePointer

中获得结果,该解决方案至少存在一个理论问题:由
返回的字符串。UTF8String
仅在
NSString
对象存在时才保证有效,这可能会被立即销毁,因为在第一行之后没有引用它。这很可能不会发生在这里,因为这里的字符串是一个文本常量。