我从互联网上收到了一些数据,如果没有提供编码,则需要猜测编码,因此我使用此功能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配合使用
答案 0 :(得分:1)
在您的特定情况下,问题在于您创建了一个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?
}