Error : 'AnyObject?' is not identical to 'AnyObject'

Error : 'AnyObject?' is not identical to 'AnyObject'

我正在尝试使用 UIActivityViewController 共享联系人 .vcf 文件。但是我得到 'AnyObject?' is not identical to 'AnyObject'

下面是我的代码行:

let dirs : [String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String]
        if ((dirs) != nil) {
            let dir = dirs![0]; //documents directory
            let path = dir.stringByAppendingPathComponent("\(person.name).vcf")
            let text: NSString = person.contact as NSString

            text.writeToFile(path, atomically: false, encoding: NSUTF8StringEncoding, error: nil);

            let objectsToShare = ["Send", NSData.dataWithContentsOfMappedFile(path)]
            let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
            self.presentViewController(activityVC, animated: true, completion: nil)
        }

任何帮助将不胜感激

提前致谢

尝试let objectsToShare = ["Send", NSData.dataWithContentsOfMappedFile(path)!]

字符?是类型修饰符。你从 AnyObject 开始,写 AnyObject? 并且你有一个新的类型 'Optional AnyObject'。这是与 AnyObject 不同的类型。由于 Swift 是强类型的,因此您不能在需要 String 的地方放置 Int,也不能在需要 AnyObject 的地方放置 'Optional AnyObject'。

当然,return 值也有类型。您可能正在调用 return 一个 'optional X' 的函数;如果您尝试在预期 'X' 的地方使用它,您将收到类型错误 - 正如您所描述的那样。

如果错误与 NSData.dataWithContentsOfMappedFile(path) 有关,那么解决方案不是简单地添加 !(用于解包可选值的运算符,但如果值为 nil 则 CRASH)。你应该使用:

["Send", (NSData.dataWithContentsOfMappedFile(path) ?? "default")]

它将使用 NSData 值(如果存在),否则 "default"(您决定使用什么,如果有的话)。