swift的动态类名

时间:2014-11-03 14:40:25

标签: ios swift parse-platform

我正在使用解析iOS SDK和Swift,我想为Facebook和Twitter分解一些代码。

目前解析SDK中有两个类似的类:PFFacebookUtilsPFTwitterUtils,两者都暴露了几乎相同的方法。

我想根据字符串参数调用好类,例如:loginWith("facebook")loginWith("twitter"),因为过程几乎相同。

来自javascript我试图动态调用方法,但没有用。

知道如何快速实现这一目标吗?

var networks: Dictionary<String, AnyObject> = [
    "facebook": PFFacebookUtils.self,
    "twitter": PFTwitterUtils.self
];

var test = networks[network].isLinkedWithUser(currentUser)

谢谢!

1 个答案:

答案 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)")
    })

我知道,这很奇怪,但它确实在我的环境中工作。