gpt4 book ai didi

swift - 似乎无法避免在 Swift 中强制展开

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

更新:这是关于在 Xcode 中使用基于文档的应用程序模板创建的 Mac 应用程序,我正在覆盖

override func readFromFileWrapper(fileWrapper: NSFileWrapper, ofType typeName: String, error outError: NSErrorPointer) -> Bool

我正在尝试从 NSFileWrapper 中读取一个文件,似乎我无法避免其中至少有一个 !

首先,我尝试过

if let rtfData = files["textFile.rtf"]?.regularFileContents,
newString = NSMutableAttributedString(data: rtfData, options: [NSDocumentTypeDocumentAttribute : NSRTFTextDocumentType], documentAttributes: nil, error: nil) {
text = newString
return true
}

所以我得到这个错误

Value of optional type 'NSData?' not unwrapped; did you mean to use '!' or '?'?

而且我必须将 regularFileContents 转换为 NSData! 或者我必须在 NSMutableAttributedString 的初始化程序(data:rtfData!)中强制解包它。


然后我尝试了

let rtfData = files["textFile.rtf"]?.regularFileContents

if (rtfData != nil) {
if let newString = NSMutableAttributedString(data: rtfData, options: [NSDocumentTypeDocumentAttribute : NSRTFTextDocumentType], documentAttributes: nil, error: nil) {
text = newString
return true
}
}

结果是

Cannot find an initializer for type 'NSMutableAttributedString' that accepts an argument list of type '(data: NSData??, options: [String : String], documentAttributes: nil, error: nil)'"

所以我必须将初始化程序更改为 data: rtfData!!,我什至不确定这是什么意思

或者,我可以将 regularFileContents 转换为 NSData?,然后我只能在初始化程序中使用一个 !

更新:这是自发布以来我尝试过的另一件事。我认为 NSData?? 中的双 ? 可能是由于我有选择地展开 NSFileWrapper (files["textFile.rtf"]?)所以我尝试了这个:

if let rtfWrapper = files["textFile.rtf"],
rtfData = rtfWrapper.regularFileContents,
newString = NSMutableAttributedString(data: rtfData, options: [NSDocumentTypeDocumentAttribute : NSRTFTextDocumentType], documentAttributes: nil, error: nil) {
text = newString
return true
}

编译器仍然要我强制解包 NSData。


我很困惑。

什么是 NSData??,为什么它是“双重”可选的,为什么它是 .regularFileContents 的结果,我怎样才能安全地,不用 ! -ing 一路获取 NSData 并将其传递给 NSMutableAttributedString 的初始化器?


另一个更新

我认为 files 常量可能是另一个可选包装的来源:

let files = fileWrapper.fileWrappers

但是编译器不会让我 if let 它。例如,如果我尝试,

if let files = fileWrapper.fileWrappers {
if let rtfFile = files["textFile.rtf"] {
if let rtfData = rtfFile.regularFileContents {
if let newString = NSMutableAttributedString(data: rtfData, options: [NSDocumentTypeDocumentAttribute : NSRTFTextDocumentType], documentAttributes: nil, error: nil) {
text = newString
return true
}
}
}
}

编译器报错:

Bound value in a conditional binding must be of Optional type

关于 fileWrapper.fileWrappers

fileWrapper变量是方法的一个参数,即

override func readFromFileWrapper(fileWrapper: NSFileWrapper, ofType typeName: String, error outError: NSErrorPointer) -> Bool

最佳答案

您可以先对文件使用可选绑定(bind),然后再从那里继续:

if let file = files["textFile.rtf"],
contents = file.regularFileContents,
newString = NSMutableAttributedString(data: contents, options: [NSDocumentTypeDocumentAttribute : NSRTFTextDocumentType], documentAttributes: nil, error: nil) {
text = newString
return true
}

如果您正在使用 fileWrappers 字典([NSObject : AnyObject]),您必须进行一些额外的转换。这个例子使用的是我碰巧在那个文件包装器中的文件,但希望它能说明这个想法:

var text: NSString!

func someMethod(fileWrapper: NSFileWrapper) {
let files = fileWrapper.fileWrappers

if let file = files["test.json"] as? NSFileWrapper,
contents = file.regularFileContents,
newString = NSString(data: contents, encoding: NSUTF8StringEncoding) {
text = newString
println(text)
}
}

关于swift - 似乎无法避免在 Swift 中强制展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30560167/

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