如何使用非女性化指针<;不透明指针>;斯威夫特? 如何在某个核心基础框架中使用Swift?为什么有一个不可配置的指针
给定,常规:一些如何使用非女性化指针<;不透明指针>;斯威夫特? 如何在某个核心基础框架中使用Swift?为什么有一个不可配置的指针,swift,macos,Swift,Macos,给定,常规:一些unsafemeutablepointer其中typealias SomeType=OpaquePointer 特定示例API //来源:导入ApplicationServices.PrintCore typealias PMPrinter=不透明指针 func PMSessionGetCurrentPrinter(printSession:PMPrintSession,currentPrinter:UnsafeMutablePointer) func PMPrinterGetP
unsafemeutablepointer
其中typealias SomeType=OpaquePointer
特定示例API
//来源:导入ApplicationServices.PrintCore
typealias PMPrinter=不透明指针
func PMSessionGetCurrentPrinter(printSession:PMPrintSession,currentPrinter:UnsafeMutablePointer)
func PMPrinterGetPaperList(PMPrinter,不可更换指针)
特定示例用例:获取打印机支持的纸张列表
let printInfo=NSPrintInfo.shared()
让printSession=PMPrintSession(printInfo.PMPrintSession())
var CurrentPrinter可选:PMPrinter?=无
PMSessionGetCurrentPrinter(打印会话和当前打印选项!)
guard let currentPrinter=currentPrinterOptional else{return}
//获取此打印机支持的预定义纸张数组。
//PMPrinterGetPaperList(PMPrinter,不可更换指针)
var paperListUnmanaged:非托管?
PMPrinterGetPaperList(当前打印机和paperListUnmanaged)
guard let paperList=paperListUnmanaged?.takeUnretainedValue()作为[AnyObject]?else{return}
观测误差
编译的东西不会运行。看起来(也许)合理的语法无法编译
上面的示例获取以下(预期)运行时“致命错误:在展开可选值时意外发现nil”
有些人选择其他尝试:
//编译错误:初始化之前获取的变量“currentPrinter”的地址
var currentPrinter:PMPrinter
PMSessionGetCurrentPrinter(打印会话和当前打印机)
//编译错误:Nil无法初始化指定的类型“PMPrinter”(也称为“OpaquePointer”)
var currentPrinter:PMPrinter=nil
PMSessionGetCurrentPrinter(打印会话和当前打印机)
//编译错误:初始化前使用了变量“currentPrinterPtr”
var currentPrinterPtr:UnsafeMutablePointer
PMSessionGetCurrentPrinter(打印会话,currentPrinterPtr)
//编译OK:实际编译
//运行时错误:在展开可选值时意外发现nil
var CurrentPrinter可选:PMPrinter?=无
PMSessionGetCurrentPrinter(打印会话和当前打印选项!)
资源
虽然文档中有有用的信息,但是难以找到一个可行的实现
UnsafeMutablePointer
,typealias为UnsafeMutablePointer
。PMPrinter
和PMPaper
在PrintCore框架中定义
作为指向“不完整类型”的指针
它们作为不透明指针导入Swift,有点
使用起来很麻烦
PMSessionGetCurrentPrinter()
的第二个参数是指向
非可选的PMPrinter
变量,在Swift中必须为
在作为inout参数传递之前初始化。一种可能的方法
要初始化空指针,请使用unsafeBitCast
从数组中获取PMPaper
对象的最简单方法似乎是
使用CFArrayGetValueAtIndex()
而不是将其桥接到
敏捷阵型。返回可转换的UnsafeRawPointer
指向不透明指针
这在我的测试中起了作用:
let printInfo = NSPrintInfo.shared()
let printSession = PMPrintSession(printInfo.pmPrintSession())
var currentPrinter = unsafeBitCast(0, to: PMPrinter.self)
PMSessionGetCurrentPrinter(printSession, ¤tPrinter);
var paperListUnmanaged: Unmanaged<CFArray>?
PMPrinterGetPaperList(currentPrinter, &paperListUnmanaged)
guard let paperList = paperListUnmanaged?.takeUnretainedValue() else {
fatalError()
}
for idx in 0..<CFArrayGetCount(paperList) {
let paper = PMPaper(CFArrayGetValueAtIndex(paperList, idx))!
var width = 0.0, height = 0.0
PMPaperGetWidth(paper, &width)
PMPaperGetHeight(paper, &height)
print(width, height)
}
let printInfo=NSPrintInfo.shared()
让printSession=PMPrintSession(printInfo.PMPrintSession())
var currentPrinter=unsafeBitCast(0,到:PMPrinter.self)
PMSessionGetCurrentPrinter(打印会话和当前打印机);
var paperListUnmanaged:非托管?
PMPrinterGetPaperList(当前打印机和paperListUnmanaged)
guard let paperList=paperListUnmanaged?.takeUnrepainedValue()其他{
法塔莱罗()
}
对于0中的idx。您提供的信息有助于完成一个测试并创建类似于苹果相关技术说明(TN2155和TN2248)的Swift代码示例,该技术说明目前只有Objective-C代码列表。谢谢
let printInfo = NSPrintInfo.shared()
let printSession = PMPrintSession(printInfo.pmPrintSession())
var currentPrinter = unsafeBitCast(0, to: PMPrinter.self)
PMSessionGetCurrentPrinter(printSession, ¤tPrinter);
var paperListUnmanaged: Unmanaged<CFArray>?
PMPrinterGetPaperList(currentPrinter, &paperListUnmanaged)
guard let paperList = paperListUnmanaged?.takeUnretainedValue() else {
fatalError()
}
for idx in 0..<CFArrayGetCount(paperList) {
let paper = PMPaper(CFArrayGetValueAtIndex(paperList, idx))!
var width = 0.0, height = 0.0
PMPaperGetWidth(paper, &width)
PMPaperGetHeight(paper, &height)
print(width, height)
}