gpt4 book ai didi

ios - 在 swift 中展开多个可选项

转载 作者:行者123 更新时间:2023-11-28 11:11:08 25 4
gpt4 key购买 nike

我想将我的应用程序包中的 PDF 加载到 CGPDFDocument 中。

是否有某种调用函数的方法,如果任何不接受选项的参数的值为 nil,则不调用该函数并返回 nil。

例如:

let pdfPath : String? = NSBundle.mainBundle().pathForResouce("nac_06", ofType:"pdf")
//I want to do this
let data : NSData? = NSData(contentsOfFile:pdfPath)
//I have to do this
let data : NSData? = pdfPath != nil ? NSData(contentsOfFile:pdfPath) : nil
let doc : CGPDFDocumentRef? = CGPDFDocumentCreateWithProvider(CGDataProviderCreateWithCFData(data));
//pageView.pdf is optional, nicely this function accepts the document as an optional
pageView.pdfPage = CGPDFDocumentGetPage(doc, 1);

因为 NSData.init?(contentsOfFile path:String), 没有将 path 定义为可选的,即使它有一个可选的返回值,我必须在之前检查参数是否是零,返回零。 data 赋值(而不是 ?: 运算符)是否有语法糖?

最佳答案

要么使用以逗号分隔的多个可选绑定(bind)

func loadPDF() -> CGPDFDocumentRef? 
{
if let pdfPath = NSBundle.mainBundle().pathForResouce("nac_06", ofType:"pdf"),
data = NSData(contentsOfFile:pdfPath),
doc = GPDFDocumentCreateWithProvider(CGDataProviderCreateWithCFData(data)) {
return doc
} else {
return nil
}
}

或者使用guard语句

func loadPDF() -> CGPDFDocumentRef? 
{
guard let pdfPath = NSBundle.mainBundle().pathForResouce("nac_06", ofType:"pdf") else { return nil }
guard let data = NSData(contentsOfFile:pdfPath) else { return nil }
return GPDFDocumentCreateWithProvider(CGDataProviderCreateWithCFData(data))
}

所有显式类型注释都是语法糖,不需要。

编辑:

在您的特定情况下,您只需要检查文件是否存在,甚至这种情况(文件丢失)在 iOS 中也不太可能发生。另一个好处是能够返回一个非可选的 PDFDocument。

func loadPDF() -> CGPDFDocumentRef
{
guard let pdfPath = NSBundle.mainBundle().pathForResource("nac_06", ofType:"pdf") else {
fatalError("file nac_06.pdf does not exist")
}
let data = NSData(contentsOfFile:pdfPath)
return CGPDFDocumentCreateWithProvider(CGDataProviderCreateWithCFData(data!))!
}

关于ios - 在 swift 中展开多个可选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34991745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com