【问题标题】:Swift Enum to Cocoa Touch UIButton selector stringSwift Enum 到 Cocoa Touch UIButton 选择器字符串
【发布时间】:2016-02-07 01:46:21
【问题描述】:

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

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

我喜欢.TouchUpInside 与自动补全一起工作的方式,它看起来比我应该用于action: 参数的字符串更简洁、更安全。所以我搜索并发现this tutorial 使用枚举来替换“魔术字符串”。

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

    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 中为我实现这一点吗?

【问题讨论】:

    标签: swift enums uibutton selector addtarget


    【解决方案1】:

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

    为了做你想做的事,我们会像你一样创建一个枚举,但也会为UIControlUIButton 的超类)添加一个扩展,以便我们可以使用ControlSelector addTarget

    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)
    

    希望这会有所帮助!

    【讨论】:

    猜你喜欢
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多