【发布时间】:2017-01-13 18:57:18
【问题描述】:
简短的解释:
您经常希望在“目标”上进行扩展……而目标通常是Any?。但是您不能在Any 上进行扩展。怎么办?
考虑一下,
extension UIViewController {
func add(tap v:UIView, _ action:Selector) {
let t = UITapGestureRecognizer(target: self, action: action)
v.addGestureRecognizer(t)
}
}
太好了,你现在可以...
self.tap(redButton, #selector(clickedRedButton))
...在任何视图控制器中。
但是你几乎可以对任何目标做同样的事情。
所以,要在 UITableViewCell 上使用扩展,你还必须拥有....
extension UIGestureRecognizerDelegate {
func add(tap v:UIView, _ action:Selector) {
let t = UITapGestureRecognizer(target: self, action: action)
v.addGestureRecognizer(t)
}
}
UITapGestureRecognizer 的目标参数其实是Any?
但是,你不能这样做......
extension Any {
解决办法是什么?如何制作适用于Any? 的扩展,例如在UITapGestureRecognizer 的第一个参数中?
或者正如康纳的评论所暗示的,有没有办法:
extension UIViewController or UIView {
而不是复制粘贴两次?
【问题讨论】:
-
这是非常迂回的。任何只调用其参数函数 (
addGestureRecognizer) 的函数都可以附加到任何扩展上。您希望能够从控制器或视图以外的任何地方添加手势识别器这一事实并不是一个好的设计决策。 -
嗨@ConnorNeville - 当然,正如您所说的控制器或视图。所以,目前我需要有两个扩展——一个用于控制器,一个用于视图。那么,如何概括呢?只有一个分机?
-
这是一个非常简单的想法,您可能希望在“目标”上进行扩展......目标通常是
Any?。怎么做? -
整个概念似乎有点笨拙......那么,为什么你首先需要做这么复杂的事情呢?我的意思是,您希望通过让生活变得更艰难来消除或解决的更大问题是什么?
-
@holex,每一个扩展都是“无用的”——你可以通过写出每一个扩展来消除它。 Swift 的本质是它就是 Swift——你可以“重写”该语言,让它更快。
标签: ios swift extension-methods