更新:这是一个用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/

10-13 08:33