【问题标题】:dynamic class names with swift快速的动态类名
【发布时间】:2014-11-03 14:40:24
【问题描述】:

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

目前 parse SDK 中有 2 个类似的类:PFFacebookUtilsPFTwitterUtils,它们都公开了几乎相同的方法。

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

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

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

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

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

谢谢!

【问题讨论】:

  • 我猜你能做到吗?而不是返回类返回函数。我知道如何思考,但不知道如何在 Swift 中编写代码,这就是为什么我没有写答案但给我一点,我可以找到如何去做。
  • 我有很多方法调用,所以我更喜欢动态地定位类。我也不是一个快速的专家:)

标签: ios swift parse-platform


【解决方案1】:

你可以调用任何类方法到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)

我认为,它相互冲突。

如果你像这样在YourProduct-Bridging-Header.h 中导入Bolts 框架:

#import <ParseFacebookUtils/PFFacebookUtils.h>
#import <Bolts/Bolts.h>

然后,你可以调用第一个。

 let cls:AnyClass = networks[network]!
 let task = cls.unlinkUserInBackground(user)

对于最后两个,我发现的解决方法是...声明这样的协议。

@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)")
    })

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

【讨论】:

  • 谢谢老兄,太棒了!使用 var networkCls = networks[network]!; 时我仍然收到警告。这给出了:“变量 networkCls 推断为 AnyClass 类型,这可能是意外的”。有什么办法可以说它只能是这两种类型之一?
  • 你不能限制它只能是这两种类型中的一种。但是,在你的情况下,var networkCls:AnyClass = networks[network]! 应该没问题。
  • 谢谢。也当使用“networkCls”的其他方法时。我得到一个错误:“AnyClass没有一个名为'unlinkUserInbackground'的成员”。是参数问题吗?与真实的类名配合得很好
  • 添加到答案中。对不起我的英语不好。我希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 2019-05-20
  • 2023-03-27
  • 2013-09-14
  • 2015-02-27
  • 2014-12-09
相关资源
最近更新 更多