【问题标题】:Dictionary from Plist gives inconsistent results with same keyPlist 中的字典使用相同的键给出不一致的结果
【发布时间】: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]


这里有什么问题?

字符串看起来一样但不一样?

还是我错过了什么?

【问题讨论】:

    标签: swift cocoa


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-05-28
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多