更新:这是一个用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
}
所以我得到了这个错误
可选类型“NSData?”的值没有打开包装;你是不是想用'!'或'?'?
我要么强制转换
regularFileContents as 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
}
}
结果是
找不到接受类型(data:NSData)的参数列表的类型“NSMutableAttributedString”的初始值设定项??,选项:[String:String],文档属性:nil,错误:nil)'
所以我必须将初始值设定项改为
data: rtfData!!
,我甚至不知道这意味着什么。或者,我可以强制转换
regularFileContents as NSData?
,然后我只能在初始值设定项中使用一个!
。更新:这是我发帖后尝试过的另一件事。我认为
?
中的doubleNSData??
可能是由于我有选择地打开了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
的结果,并且我如何安全地,在没有!
的情况下,获取NSData并将其传递给NSMutableAttributedString的初始化器?另一个更新
我想
files
常数可能是另一个可选包装的来源:let files = fileWrapper.fileWrappers
但是编译器不会让我这么做的。例如,如果我尝试,
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
}
}
}
}
编译器给出以下错误:
条件绑定中的绑定值必须是可选类型
关于
if let
fileWrapper.fileWrappers
变量是方法的一个参数,它是override func readFromFileWrapper(fileWrapper: NSFileWrapper, ofType typeName: String, error outError: NSErrorPointer) -> Bool
最佳答案
您可以先对文件使用可选绑定,然后从中继续:
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
字典(a[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/