Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用非女性化指针<;不透明指针>;斯威夫特? 如何在某个核心基础框架中使用Swift?为什么有一个不可配置的指针_Swift_Macos - Fatal编程技术网

如何使用非女性化指针<;不透明指针>;斯威夫特? 如何在某个核心基础框架中使用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, &currentPrinter);

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, &currentPrinter);

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)
}