我正在使用解析iOS SDK和Swift,我想为Facebook和Twitter分解一些代码。
目前解析SDK中有两个类似的类:PFFacebookUtils
和PFTwitterUtils
,两者都暴露了几乎相同的方法。
我想根据字符串参数调用好类,例如:loginWith("facebook")
和loginWith("twitter")
,因为过程几乎相同。
来自javascript我试图动态调用方法,但没有用。
知道如何快速实现这一目标吗?
var networks: Dictionary<String, AnyObject> = [
"facebook": PFFacebookUtils.self,
"twitter": PFTwitterUtils.self
];
var test = networks[network].isLinkedWithUser(currentUser)
谢谢!
答案 0 :(得分:2)
您可以将任何类方法调用到AnyClass
// ↓
var networks: Dictionary<String, AnyClass> = [
"facebook": PFFacebookUtils.self,
"twitter": PFTwitterUtils.self
];
var flag = networks[network]?.isLinkedWithUser(user)
if flag == nil {
// no such network
}
else if flag! {
// linked
}
else {
// not linked
}
如果您不知道?
的含义,请参阅this document。
如果您确定networks[network]
存在:
var flag = networks[network]!.isLinkedWithUser(user)
if flag {
// linked
}
else {
// not linked
}
增加:
关于unlinkUserInbackground
方法。
起初,我不知道编译器无法找到此方法的确切原因,可能是错误,也可能不是。以下是我找到的解决方法。
unlinkUserInbackground
方法有3种变体
class func unlinkUserInBackground(user: PFUser!) -> BFTask!
class func unlinkUserInBackground(user: PFUser!, block: PFBooleanResultBlock!)
class func unlinkUserInBackground(user: PFUser!, target: AnyObject!, selector: Selector)
我认为,这是相互冲突的。
如果您在Bolts
中导入YourProduct-Bridging-Header.h
框架,请执行以下操作:
#import <ParseFacebookUtils/PFFacebookUtils.h>
#import <Bolts/Bolts.h>
然后,你可以打电话给第一个。
let cls:AnyClass = networks[network]!
let task = cls.unlinkUserInBackground(user)
对于最后2个,我发现的解决方法是......声明这样的协议。
@objc protocol SNSUtils {
class func unlinkUserInBackground(user: PFUser!, block: PFBooleanResultBlock!)
class func unlinkUserInBackground(user: PFUser!, target: AnyObject!, selector: Selector)
}
// ...
let cls:AnyClass = networks[network]!
cls.unlinkUserInBackground(user, block: { (success, err) -> Void in
println("sucess: \(success) err: \(err)")
})
我知道,这很奇怪,但它确实在我的环境中工作。