- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如何使用 UnsafeMutablePointer<OpaquePointer>
在 Swift 中使用一些 Core Foundation 框架?为什么有一个 UnsafeMutablePointer<OpaquePointer>
?
给定,一般:一些UnsafeMutablePointer<SomeType>
其中 typealias SomeType = OpaquePointer
具体示例 API
// SOURCE: import ApplicationServices.PrintCore
typealias PMPrinter = OpaquePointer
func PMSessionGetCurrentPrinter(_ printSession: PMPrintSession, _ currentPrinter: UnsafeMutablePointer<PMPrinter>)
func PMPrinterGetPaperList(PMPrinter, UnsafeMutablePointer<Unmanaged<CFArray>?>)
具体示例用例:获取打印机支持的纸张列表
let printInfo = NSPrintInfo.shared()
let printSession = PMPrintSession(printInfo.pmPrintSession())
var currentPrinterOptional: PMPrinter? = nil
PMSessionGetCurrentPrinter(printSession, ¤tPrinterOptional!)
guard let currentPrinter = currentPrinterOptional else { return }
// Get the array of pre-defined PMPapers this printer supports.
// PMPrinterGetPaperList(PMPrinter, UnsafeMutablePointer<Unmanaged<CFArray>?>)
var paperListUnmanaged: Unmanaged<CFArray>?
PMPrinterGetPaperList(currentPrinter, &paperListUnmanaged)
guard let paperList = paperListUnmanaged?.takeUnretainedValue() as [AnyObject]? else { return }
编译的内容不运行。看起来(也许)合理的语法无法编译。
上面的示例得到以下(预期的)运行时“ fatal error :在展开可选值时意外发现 nil”。
一些选择其他尝试:
// Compile Error: Address of variable 'currentPrinter' taken before is is initialized
var currentPrinter: PMPrinter
PMSessionGetCurrentPrinter(printSession, ¤tPrinter)
// Compile Error: Nil cannot initialze specified type 'PMPrinter' (aka 'OpaquePointer')
var currentPrinter: PMPrinter = nil
PMSessionGetCurrentPrinter(printSession, ¤tPrinter)
// Compile Error: Variable 'currentPrinterPtr' used before being initialized
var currentPrinterPtr: UnsafeMutablePointer<PMPrinter>
PMSessionGetCurrentPrinter(printSession, currentPrinterPtr)
// Compile OK: actually compiles
// Runtime Error: unexpectedly found nil while unwrapping an Optional value
var currentPrinterOptional: PMPrinter? = nil
PMSessionGetCurrentPrinter(printSession, ¤tPrinterOptional!)
Apple: Core Printing ⇗
Apple: Using Swift with Cocoa and Objective-C ⇗
虽然文档中包含有用的信息,但 UnsafeMutablePointer<PMPrinter>
的可行实现typealias 为 UnsafeMutablePointer<OpaquePointer>
一直难以捉摸。
最佳答案
PMPrinter
和 PMPaper
在 PrintCore 框架中定义作为指向“不完整类型”的指针
typedef struct OpaquePMPrinter* PMPrinter;
typedef struct OpaquePMPaper* PMPaper;
它们作为 OpaquePointer
导入到 Swift 中,有点使用起来很麻烦。
PMSessionGetCurrentPrinter()
的第二个参数是指向非可选 PMPrinter
变量,在 Swift 中它必须是在作为 inout 参数传递之前进行初始化。一种可能的方式初始化空指针是使用 unsafeBitCast
。
从数组中获取 PMPaper
对象的最简单方法似乎是是使用 CFArrayGetValueAtIndex()
而不是将其桥接到快速数组。返回一个可以转换的 UnsafeRawPointer
到 OpaquePointer
。
这在我的测试中有效:
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)
}
关于swift - 如何在 Swift 中使用 UnsafeMutablePointer<OpaquePointer>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44893912/
我在我的项目中使用一个框架,并且对于一个功能,它需要一个 OpaquePointer!。 我应该设置哪个 OpaquePointer 以及如何设置? 下面的答案,如何设置不透明,被 xcode 接受,
我正在尝试创建一个类别数组,对我来说这是一个具有“名称”属性的数据模型实体。但是,Xcode 将它设置为 OpaquePointer,这不是我想要的并且会导致一堆错误。我如何强制它是类别而不是 Opa
来自向量标量线性代数函数(来自 vectorOps.h) https://developer.apple.com/reference/accelerate/1546030-visamax func v
如何使用 UnsafeMutablePointer在 Swift 中使用一些 Core Foundation 框架?为什么有一个 UnsafeMutablePointer ? 给定,一般:一些Unsa
我正在Xcode中使用Swift,并且收到以下错误:-类型'Category'(又名'OpaquePointer')的值没有成员'name'-我到处都看过,但找不到解。 有人知道该怎么办吗? 这是屏幕
我是一名优秀的程序员,十分优秀!