Plist 中的字典使用相同的键给出不一致的结果
Posted
技术标签:
【中文标题】Plist 中的字典使用相同的键给出不一致的结果【英文标题】:Dictionary from Plist gives inconsistent results with same key 【发布时间】:2015-09-03 15:30:05 【问题描述】:受这个问题的启发:
Is there a way of getting a Mac's icon given its model number?
我正在努力获得类似的结果,但使用 Mac 的型号标识符作为开始,而不是 Mac 的型号。
但是当我使用我的 Mac 的型号标识符来查找相关的系统图标时,我遇到了一个奇怪的问题。
在我的办公机器上,我得到 "iMac14,2" 作为型号标识符。
当我将此 plist 作为字典加载时...
/System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist
...我看到它有适用于所有 Mac 型号的键,包括“iMac14,2”,其中的值包含图标的 URL。
但是,当我尝试为标识符键 ("iMac14,2") 获取此字典的值时,我得到了 nil
,尽管如果我使用文字键获取实际值。
但是文字键和我从modelIdentifier
函数获得的键是相同的。反正看起来是这样的……
获取模型标识符:
func modelIdentifier() -> String?
let service: io_service_t = ioserviceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice").takeUnretainedValue())
let cfstr = "model" as CFString
if let model = IORegistryEntryCreateCFProperty(service, cfstr, kCFAllocatorDefault, 0).takeUnretainedValue() as? NSData
if let nsstr = NSString(data: model, encoding: NSUTF8StringEncoding)
return String(nsstr)
return nil
if let id = modelIdentifier()
println(id) // prints "iMac14,2"
使用此结果查找值失败:
if let dict = NSDictionary(contentsOfFile: "/System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist") as? [String:AnyObject]
if let id = modelIdentifier()
if let result = dict[id] as? [String:AnyObject]
print(result) // nil
但如果我对文字字符串做同样的事情:
if let result = dict["iMac14,2"] as? [String:AnyObject]
print(result)
result
:
[架构:x86_64,本地化: description = "iMac with 27\" 宽屏 LED 背光显示屏,2013 年底推出。"; MarketingModel = "27\" iMac (Late 2013)"; 型号 = iMac; 处理器=“四核英特尔酷睿i5,四核英特尔酷睿i7”; ,hardwareImageName:/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/com.apple.imac-unibody-27-no-optical.icns]
这里有什么问题?
字符串看起来一样但不一样?
还是我错过了什么?
【问题讨论】:
【参考方案1】:IORegistryEntryCreateCFProperty
为 model
键创建的 NSData
包含一个以 NUL 结尾的字符串。您将在您的NSString
中包含该 NUL。
以这种方式创建您的字符串:
if let nsstr = NSString(CString: UnsafePointer<Int8>(model.bytes), encoding: NSUTF8StringEncoding)
return String(nsstr)
【讨论】:
以上是关于Plist 中的字典使用相同的键给出不一致的结果的主要内容,如果未能解决你的问题,请参考以下文章
使用 Matlab FFT 计算的频谱对于不同长度的样本(点数相同但 Fs 不同)给出的结果不一致?
使用循环从 plist 的根级别获取字典数组并将其放入变量中