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】:

IORegistryEntryCreateCFPropertymodel 键创建的 NSData 包含一个以 NUL 结尾的字符串。您将在您的NSString 中包含该 NUL。

以这种方式创建您的字符串:

    if let nsstr = NSString(CString: UnsafePointer<Int8>(model.bytes), encoding: NSUTF8StringEncoding) 
        return String(nsstr)
    

【讨论】:

以上是关于Plist 中的字典使用相同的键给出不一致的结果的主要内容,如果未能解决你的问题,请参考以下文章

python 中关于字典的键

使用 Matlab FFT 计算的频谱对于不同长度的样本(点数相同但 Fs 不同)给出的结果不一致?

使用循环从 plist 的根级别获取字典数组并将其放入变量中

如何使用键将对象添加到 NSMutableDictionary?

比较两个字典(键,值)并返回不具有相同值的键

从另一个字典更改子字典的键值 - Python