如果我只有字符串,如何在 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 中的 AnyClass 上使用 performSelector() 调用类方法?
Swift开发教程--如何在别的类中调用AppDelegate中的方法