使用Swift创建一个Facebook Open Graph对象

3

我正在使用Facebook iOS SDK创建一个自定义故事,该应用程序使用Swift编写。 我的代码基于他们的文档示例https://developers.facebook.com/docs/ios/open-graph#createobject

一切顺利进行,直到我必须创建FBGraphObject。

NSMutableDictionary<FBOpenGraphObject> *object = [FBGraphObject openGraphObjectForPost];

在 Swift 中,我已经重写了这一块:

var object = FBGraphObject.openGraphActionForPost()

// specify that this Open Graph object will be posted to Facebook
object.setObject(true, forKey: "provisionedForPost")

// for og:title
object.setObject(description["title"]!, forKey: "title")

// for og:type, this corresponds to the Namespace you've set for your app and the object type name
object.setObject("bppridereport:ride", forKey: "type")

// for og:description
object.setObject(description["description"]!, forKey: "description")

FBRequestConnection.startForPostOpenGraphObject(object, completionHandler: { (connection:FBRequestConnection!, result:AnyObject!, error:NSError!) -> Void in

    if error == nil {
        let objectId = result["id"]

      } else {
          NSLog("Error posting the Open Graph object to the Object API:", error);
      }

  })

这给我报错:NSMutableDictionary 与 FBOpenGraphObject 并不相同,读文档时可以理解,FBOpenGraphObject 只是一个装饰过的 NSMutableDictionary,所以将对象强制转换为 FBOpenGraphObject 就可以解决错误。
var object = FBGraphObject.openGraphActionForPost() as FBOpenGraphObject

问题是,当我现在编译并运行应用程序时,它会在这一行崩溃...我很困惑。几乎没有关于Swift实现Facebook SDK的资料。有任何想法为什么会发生这种情况吗?


当它崩溃时,错误信息是什么? - Mike Taverne
@Mike Taverne 看起来是这样的 ->线程1:对象var = FBGraphObject.openGraphActionForPost() as FBOpenGraphObject上出现了信号SIGABRT错误截图swift_dynamicCastObjCProtocolUnconditional错误截图 - Dan Nisbet
有什么想法,@MikeTaverne? - Dan Nisbet
2个回答

0

我没有使用过Facebook API,所以这只是最好的猜测:

 var object = FBGraphObject.openGraphActionForPost() as NSMutableDictionary<FBOpenGraphObject>

非常感谢 @Mike 的回复。我明白那样做是有道理的,但是,我遇到了一个“无法专门化非泛型类型‘NSMutable Dictionary’”的错误 [错误截图] (https://dl.dropboxusercontent.com/u/2325675/stackoverflow/Social_swift_generics.png)。 - Dan Nisbet
抱歉,丹,这就是我猜测的结果。今天我又仔细看了一下,但我没有找到在Swift中实现他们想要你在ObjC中做的等效方法。 - Mike Taverne
你不能这样做,因为在Swift中<>代表完全不同的含义。在Objective C中:NSMutableDictionary<FBOpenGraphObject>会使字典符合FBOpenGraphObject协议。 在Swift中,它表示创建一个包含一组FBOpenGraphObjects的NSMutableDictionary。 - Chris Harrison
@ChrisHarrison 感谢您的澄清。我没有意识到 < > 的含义差异。 - Mike Taverne

0

在调用Facebook时,我将类型转换为FBGraphObject。

我使用不同的调用方法来调用与您示例中的不同,因为我已经设置了包含元数据的HTML页面,但是您的示例可以进行重构,如下所示:

var object = FBGraphObject.openGraphActionForPost()

// Code to create object metadata omitted //

FBRequestConnection.startForPostOpenGraphObject(object as FBGraphObject, completionHandler: {
(connection:FBRequestConnection!, result:AnyObject!, error:NSError!) in
    if error == nil {
        let objectId = result["id"]
    } else {
       NSLog("Error posting the Open Graph object to the Object API:", error)
   }
})

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接