我收到一些来自互联网的数据,如果没有提供,需要猜测编码,所以我使用这个函数stringEncoding(for:encodingOptions:convertedString:usedLossyConversion:)
,它需要传递AutoreleasingUnsafeMutablePointer
来接收转换后的字符串,我编写的代码如下:
var str = "Hello, playground"
func decode(data: Data) -> String? {
var covertedString = NSString()
let stringPointer = AutoreleasingUnsafeMutablePointer<NSString?>(&covertedString)
guard NSString.stringEncoding(for: data, encodingOptions: nil, convertedString: stringPointer, usedLossyConversion: nil) != 0 else {
return nil
}
return covertedString as String
}
let data = str.data(using: .utf8)!
decode(data: data)
虽然我从函数调用中得到的covertedString
是正确的,但应用程序总是崩溃。知道为什么AutoreleasingUnsafeMutablePointer
会让它崩溃吗?我试图不通过convertedString
,然后它不再崩溃,所以看起来它是根本情况。知道它崩溃的原因吗?
我正在使用Xcode版本10.1(10B61)和Swift 4
在你的特殊情况下,问题是你已经创建了一个NSString
,但后来指向了NSString?
,这是另一回事。
但这并不重要。您不直接创建AutoreleasingUnsafeMutablePointer(或通常是任何类型的UnsafePointer)。在您使用它们时,它们不会被承诺有效。相反,您使用&
隐式创建它们。
func decode(data: Data) -> String? {
var convertedString: NSString? = "" // <- Make sure to make this optional
guard NSString.stringEncoding(for: data,
encodingOptions: nil,
convertedString: &convertedString, // <- Use &
usedLossyConversion: nil) != 0
else {
return nil
}
return convertedString as String?
}