Xcode 在Swift 3中将NSData转换为NSString?
我有一个返回某些系统值的函数。它在Swift 2.2中运行良好,我刚刚升级到Xcode 8和Swift 3,但现在它失败了Xcode 在Swift 3中将NSData转换为NSString?,xcode,nsstring,nsdata,swift3,Xcode,Nsstring,Nsdata,Swift3,我有一个返回某些系统值的函数。它在Swift 2.2中运行良好,我刚刚升级到Xcode 8和Swift 3,但现在它失败了 func ioPlatExpertDevString(_ property: String) -> String { // Start tapping in to the IO Service let ioPlatformExpertDevice:io_service_t? = IOServiceGetMatchingService(kIOMaster
func ioPlatExpertDevString(_ property: String) -> String {
// Start tapping in to the IO Service
let ioPlatformExpertDevice:io_service_t? = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"))
var sAnswer = "Not Found"
let cfAnswer:AnyObject! = IORegistryEntryCreateCFProperty(ioPlatformExpertDevice!, "\(property)" as CFString!, kCFAllocatorDefault, 0).takeRetainedValue()
if (cfAnswer != nil) {
let nsAnswer = (cfAnswer as! NSString)
sAnswer = nsAnswer.uppercased
}
// Close the IO Service
IOObjectRelease(ioPlatformExpertDevice!)
return sAnswer
}
在此之前,我使用的是“CFData”而不是“AnyObject”。它构建得很好,但在运行时,我得到以下错误:
无法将类型为“\uu NSCFData”(0x7fff7b833ec0)的值强制转换为“NSString”(0x7fff7ac32038)
请执行而不是注释类型,除非编译器告诉您这样做 例如,
IOServiceGetMatchingService
返回一个非可选的io\u服务\u t
,您的可选注释会使情况变得更糟
IORegistryEntryCreateCFProperty
返回非托管代码>也不需要注释,字符串插值和强制转换为隐式展开也是可选的
CFTypeRef
可以桥铸为本机Swift类型
如果返回类型是(NS)Data
,则它不太可能在以前的版本中工作
如果可以将字符串
和数据
转换为字符串
,则此代码将考虑这些数据
func ioPlatExpertDevString(_ property: String) -> String {
// Start tapping in to the IO Service
let ioPlatformExpertDevice = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"))
var sAnswer = "Not Found"
let cfAnswer = IORegistryEntryCreateCFProperty(ioPlatformExpertDevice, property as CFString, kCFAllocatorDefault, 0).takeRetainedValue()
if let cfData = cfAnswer as? Data, let answer = String(data:cfData, encoding:.utf8) {
sAnswer = answer.uppercased()
} else if let answer = cfAnswer as? String {
sAnswer = answer.uppercased()
}
// Close the IO Service
IOObjectRelease(ioPlatformExpertDevice)
return sAnswer
}
更换
let nsAnswer = (cfAnswer as! NSString)
至
let nsAnswer = NSString(data: cfAnswer as! Data, encoding: String.Encoding.utf8.rawValue)
有关最新版本的Swift:
String(decoding: data, as: UTF8.self)
您为哪个属性调用该函数?