Swift Enum to Cocoa Touch UIButton selector string



我正在为我的letterTapped()函数向UIButton添加一个目标,如下所示:

button.addTarget(self, action: "letterTapped:", forControlEvents: .TouchUpInside)

我喜欢.TouchUpInside自动完成的工作方式,它看起来更整洁,似乎比我应该用于action:参数的字符串更安全。所以我搜索并找到了这个教程,它使用枚举来代替"魔术字符串"。

我创建了一个这样的枚举:

    enum functionForAction: Selector {
    case clearTapped = "clearTapped:"
    case submitTapped = "submitTapped:"
    case letterTapped = "letterTapped:"
}

然后我像这样使用它:

 button.addTarget(self, action: functionForAction.letterTapped.rawValue, forControlEvents: .TouchUpInside)

得到了代码完成,我从来没有尝试调用拼写错误的选择器。感觉好多了。但是有可能改进它吗?我真的只想输入这个:

 button.addTarget(self, action: .letterTapped, forControlEvents: .TouchUpInside)

枚举可以在 Swift 中为我做到这一点吗?

有两种方法可以做到这一点,虽然可以获得你想要的语法,但我认为第二种方法很可能是更好的方法。

为了做你想做的事,我们将像你一样创建一个枚举,但也要添加一个扩展给UIControl(UIButton的超类(,以便我们可以添加一个ControlSelector

enum ControlSelector: Selector {
    case ClearTapped = "clearTapped:"
    case SubmitTapped = "submitTapped:"
    case LetterTapped = "letterTapped:"
}
extension UIControl {
    func addTarget(target: AnyObject?, action: ControlSelector, forControlEvents controlEvents: UIControlEvents) {
        addTarget(target, action: action.rawValue, forControlEvents: controlEvents)
    }
}

现在我们可以使用您喜欢的语法调用addTarget

button.addTarget(self, action: .ClearTapped, forControlEvents: .TouchUpInside)

(顺便说一下,按照惯例,枚举通常具有大写字母的第一个字母,这就是为什么我从您的代码中稍微更改了它的原因。

但是,这可能会变得混乱,除非您希望在所有代码之间共享ControlSelector枚举(现在,使选择器更清晰有什么意义(?要使这在所有代码中工作,您必须保持两个公共的访问级别,或者在要以这种方式编写内容的每个文件中编写UIControl扩展名。

我建议改用私有类来保持选择器清晰。

private class ControlSelector {
    static var clearTapped: Selector = "clearTapped:"
    static var submitTapped: Selector = "submitTapped:"
    static var letterTapped: Selector = "letterTapped:"
}

然后,您将不再需要协议扩展,而是以这种方式调用addTarget方法:

button.addTarget(self, action: ControlSelector.clearTapped, forControlEvents: .TouchUpInside)

希望这有帮助!

相关内容

  • 没有找到相关文章

最新更新