请问 swift3 中怎么把一个 String 当做函数名来使用

2017-04-13 11:54:18 +08:00
 jamfer

例如

var urls = ["login","register"]

我需要在一个 tableview 中将 urls[indexPath.row] 作为函数名来使用:

let myfuncname = urls[indexPath.row]
let myfunc = myfuncname()

这样肯定是错误的,请问正确的写法是什么?

1617 次点击
所在节点    问与答
10 条回复
jamfer
2017-04-13 11:55:26 +08:00
为何刚发布的主题就沉底了
crashX
2017-04-13 12:13:51 +08:00
let myfunc = Selector(myfuncname),会有警告。
isweal
2017-04-13 13:21:41 +08:00
``` swift
//view.addSubview(imageView)
let name = "addSubview:"
let selector = NSSelectorFromString(name)
view.perform(selector, with: imageView)
```
看得懂吧。
jamfer
2017-04-13 13:36:55 +08:00
@isweal 感谢回复,抱歉我不是很懂
kingcos
2017-04-13 14:21:08 +08:00
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let urls = ["register", "login"]
// let selector = Selector(indexPath.row)
let selector = NSSelectorFromString(indexPath.row)
perform(selector)
}

func register() {
print(#function)
}

func login() {
print(#function)
}

两种都可以吧
kingcos
2017-04-13 14:22:39 +08:00
@kingcos 其实感觉这样并不安全,可能用 extension 或者 enum 之类的更安全吧
jamfer
2017-04-13 14:26:13 +08:00
@kingcos 我用 self.present(selector, animated:true, completion:nil) 还是会报错。这里应该怎么用呢?
ldp940622
2017-04-13 16:01:44 +08:00
这样做危险性太大了,个人觉得用 enum 和路由方式来封装比较合理
kingcos
2017-04-13 21:36:48 +08:00
@jamfer 抱歉,下午上课没有时间看帖。
present 那个放不是跳转控制器的吗… perform 才是调用 Selector 的
jamfer
2017-04-14 09:00:44 +08:00
@kingcos 恩怪我没说清楚,其实我是需要放到 present 里用的 Orz

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/354559

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX