在macOS上使用Swift实现打印机ID与打印机名称的映射
在macOS上用Swift实现打印机ID到名称的映射
我帮你把Objective-C版本的打印机ID到名称映射逻辑转换成Swift版本了,直接看下面的代码和说明就可以用:
完整Swift实现代码
import Foundation func mapPrinterIDToName() -> [String: String] { var printerList: CFArray? let status = PMServerCreatePrinterList(kPMServerLocal, &printerList) // 检查是否成功获取打印机列表 guard status == noErr, let printers = printerList else { print("无法获取打印机列表") return [:] } var printerIDToNameMap = [String: String]() let printerCount = CFArrayGetCount(printers) // 遍历所有打印机 for index in 0..<printerCount { guard let printer = CFArrayGetValueAtIndex(printers, index) as? PMPrinter else { continue } // 获取打印机唯一ID guard let printerID = PMPrinterGetID(printer) as String? else { continue } // 获取打印机显示名称 guard let printerName = PMPrinterGetName(printer) as String? else { continue } printerIDToNameMap[printerID] = printerName } // 释放Core Foundation对象(显式释放更稳妥) if let list = printerList { CFRelease(list) } return printerIDToNameMap } // 测试调用示例 let printerMapping = mapPrinterIDToName() print("打印机ID与名称映射结果:") for (printerID, printerName) in printerMapping { print("\(printerID) -> \(printerName)") }
关键逻辑说明
- 获取打印机列表:通过
PMServerCreatePrinterList(kPMServerLocal, &printerList)获取本地所有打印机的列表,kPMServerLocal表示本地服务器 - 遍历与信息提取:遍历列表中的每个
PMPrinter对象,用PMPrinterGetID获取打印机的唯一标识ID,PMPrinterGetName获取用户可见的打印机名称 - 内存管理:因为用到了Core Foundation的
CFArray,显式调用CFRelease释放资源,避免内存泄漏(Swift的ARC对桥接对象有处理,但显式释放更安全) - 返回结果:最终返回一个
[String: String]类型的字典,直接对应打印机ID到名称的映射
注意事项
- 这个代码只能在macOS项目中使用,因为
PMServer相关API是macOS专属的,iOS等其他平台不支持 - 如果Xcode报错找不到相关API,可以检查项目是否链接了
CoreServices框架(一般Xcode会自动处理,若未自动链接,可在项目Build Phases的Link Binary With Libraries中添加) - 访问本地打印机列表不需要特殊权限,若要访问远程打印机可能需要额外配置
内容的提问来源于stack exchange,提问作者Yusuke Terada
相关产品推荐
相关产品推荐

