使用objective-c创建FBOpenGraphAction,如:
id<FBOpenGraphAction> action = (id<FBOpenGraphAction>)[FBGraphObject graphObject];
Swift中的等价物是什么?
我原以为它是这样的:
let action = FBGraphObject.graphObject() as FBOpenGraphAction
但这会在运行时产生信号。
另见FBOpenGraphAction runtime error in Swift
非常感谢任何想法。
答案 0 :(得分:1)
好的,这是一个已知问题,你可以在下面找到答案。
简而言之,无法直接在SWIFT中创建操作,您必须通过Objective-C进行间接操作。
Facebook回答:https://developers.facebook.com/bugs/776452979070484/
对于链接不起作用或消失的情况,这里是FB开发人员答案的副本:
iOS SDK v3.x中的Open Graph API实现是鸭子类型,取决于C的弱类型。 Swift中的所有演员都是强类型的。因此,由于NSMutableDictionary和FBGraphObject没有正式符合FBOpenGraphObject,因此Swift转换失败。
您可以创建Objective-C API来执行演员表,例如id<FBOpenGraphObject> FBGraphObjectToFBOpenGraphObject(id<FBGraphObject> o) { return (id<FBOpenGraphObject>)o; }
,作为解决方法。
我已经完成了这项工作并且对我有用。
答案 1 :(得分:1)
好的,这是我昨天对@jeffjv问题的回答。
不,我不是要转换您发布的膳食样本。无论如何,我把它转换成了Swift。
这是swift代码,将其添加到任何swift文件中:
let mealObject = FBGraphObject.openGraphObjectForPostWithType("cooking-app:meal", title: "Lamb Vindaloo", image: "https://example.com/cooking-app/images/Lamb-Vindaloo.png", url: "https://example.com/cooking-app/meal/Lamb-Vindaloo.html", description: "Spicy curry of lamb and potatoes")
let bridge = FacebookBridge()
let cookAction = bridge.graphObject()
cookAction.setObject(mealObject, forKey: "meal")
FBDialogs.presentShareDialogWithOpenGraphAction(cookAction, actionType: "cooking-app:cook", previewPropertyName: "meal", handler: { (call: FBAppCall!, result:[NSObject : AnyObject]!, error: NSError!) -> Void in
if error != nil {
println("Error: \(error.description)")
} else {
println("Success!")
}
})
然后我创建了一个名为FacebookBridge.m的文件,如下所示:
#import <Foundation/Foundation.h>
#import <FacebookSDK/FBOpenGraphAction.h>
#import "FacebookBridge.h"
@implementation FacebookBridge
- (id<FBOpenGraphAction>) graphObject{
return (id<FBOpenGraphAction>)[FBGraphObject graphObject];
}
@end
接下来,我创建了一个名为FacebookBridge.h的文件
#ifndef EventCalendar1_FacebookBridge_h
#define EventCalendar1_FacebookBridge_h
#import <Foundation/Foundation.h>
@interface FacebookBridge : NSObject
- (id<FBOpenGraphAction>) graphObject;
@end
#endif
最后,我将以下语句添加到我的bridging-header文件中,该文件名为YourProject-Bridging-Header.h(YourProject必须是项目的名称)。
#import "FacebookBridge.h"
基本上就是这样。您还必须在AppDelegate.swift文件中添加一些代码,但这在Facebook开发人员页面中已有很好的记录。
答案 2 :(得分:0)
我添加评论,但我没有代表。我稍后会删除它。
@Horowitzathome,你能不能包括你为实现这个目的所做的快速和客观的c内插器?我尝试了很多技巧而没有工作。我假设您正在尝试转换此示例,对吧?
id<FBGraphObject> mealObject =
[FBGraphObject openGraphObjectForPostWithType:@"cooking-app:meal"
title:@"Lamb Vindaloo"
image:@"https://example.com/cooking-app/images/Lamb-Vindaloo.png"
url:@"https://example.com/cooking-app/meal/Lamb-Vindaloo.html"
description:@"Spicy curry of lamb and potatoes"];
id<FBOpenGraphAction> cookAction = (id<FBOpenGraphAction>)[FBGraphObject graphObject];
[cookAction setObject:mealObject forKey:@"meal"];
[FBDialogs presentShareDialogWithOpenGraphAction:cookAction
actionType:@"cooking-app:cook"
previewPropertyName:@"meal"
handler:^(FBAppCall *call, NSDictionary *results, NSError *error) {
if(error) {
NSLog(@"Error: %@", error.description);
} else {
NSLog(@"Success!");
}
}];