如果我只有字符串,如何在 Swift 中调用类方法?

Posted

技术标签:

【中文标题】如果我只有字符串,如何在 Swift 中调用类方法?【英文标题】:How can I invoke a class method in Swift if I only have the string? 【发布时间】:2017-02-10 14:46:28 【问题描述】:

我正在为 HealthKit 编写一个 cordova 插件,我的任务是确保我们可以从 HK 动态读取更多或更少的数据。我正在迅速做本机部分。但我主要编写 javascript,所以我有点迷失在 Swift 部分。

我希望能够动态调用只有一个字符串的方法。

let store = HKHealthStore()

    do 
        let bloodType: HKBloodTypeObject = try store.bloodType()
...

这是一个读取血型的例子。我不是 Swift 开发人员,但有什么方法可以动态地做到这一点,就像我在 javascript 中所做的那样:

... // assuming this function receives a string as paramater
let param[0] = try store[param[0]]() // <-- how to do this in Swift?

然后我可以与服务器对话并获取特征列表并从 healthkit 动态加载它们,而无需为每个可能的特征更新我的代码和硬编码。

【问题讨论】:

【参考方案1】:

创建从参数字符串到 API 枚举的映射。

enum API: String 
    case function1 = "function1"
    case function2 = "functionTwo"
    case function3 = "threethreethree"

创建一个中继函数,将 API 枚举映射到 Swift 函数。

func callTheCorrectFunction(_ api: API) 
    switch api 
    case .function1: updateBlood()
    case .function2: spinAround()
    case .function3: jump()
    

使用枚举的 rawValue 初始化器构造函数调用。

let param = fromSomeJsonStrings[0]
let api = API(rawValue: param)
callTheCorrectFunction(api)

或者,您可以以几乎相同的方式使用来自[String: Function] 的字典映射。

typealias Function = () -> ()
let dict = 
    "function1": updateBlood,
    "function2": spinAround,

dict[param[0]]()

【讨论】:

是不是有什么我不明白的地方,或者最后你还在硬编码 updateBlood()、spinAround() 等? 我的意思是......你必须在某些时候对方法进行硬编码。这样你就知道要调用什么方法了。不过,这只是引入了字符串和函数之间的映射。 我明白,但我遇到了同样的问题。问题是,随着苹果扩展 HKHealthStore 我希望能够动态读取新属性而无需修改插件......所以我需要能够做 HKHealthStore['somethingNew']() 不,这可以解决您的问题。假设您想从 JSON 文件中读取字符串“bio”并调用 HKHealthStore 中的 biologicalSex() 函数。在最低级别,您只需要一个函数,它接受一个字符串,执行一个 if 语句(即 if string == "bio"),然后调用biologicalSex()。我给了你一个更安全的版本,但想法是一样的。 啊,我明白了。您正在寻找“反射” - 例如,***.com/questions/24245262/… 我不确定 Swift 的确切功能,但希望这能让您朝着正确的方向前进。

以上是关于如果我只有字符串,如何在 Swift 中调用类方法?的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 测试文件中调用 Objective-C 类

如何在 Swift 中的 AnyClass 上使用 performSelector() 调用类方法?

Swift开发教程--如何在别的类中调用AppDelegate中的方法

Swift 2.0 / Xcode 7B5 - 只有放在某个文件中才能找到类

如果类名作为字符串传递,如何动态调用类的方法

swift 元类构造方法