我正在尝试使用UIActivityViewController共享联系人.vcf文件。但我得到的是AnyObject?'与' 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)
}
任何帮助将不胜感激
提前致谢
答案 0 :(得分:3)
字符?
是一种类型修饰符。您从AnyObject
开始,写AnyObject?
并且您有一个新类型的' Optional AnyObject'。这是与AnyObject
不同的类型。由于Swift是强类型的,因此您无法将Int
放在期望String
的位置,也不能放置一个' Optional AnyObject'预计会有AnyObject
。
当然,返回值也有类型。您可能正在调用一个返回'可选X'的函数。如果你试图使用那个' X'如您所述,您会遇到类型错误。
如果错误是NSData.dataWithContentsOfMappedFile(path)
,那么解决方案不是简单地添加!
(运算符来解包可选值,但如果值为nil
则为CRASH)。你应该使用:
["Send", (NSData.dataWithContentsOfMappedFile(path) ?? "default")]
如果存在,将使用NSData
值,否则"default"
(您决定使用什么,如果有的话)。
答案 1 :(得分:0)
尝试let objectsToShare = ["Send", NSData.dataWithContentsOfMappedFile(path)!]