传递选择器(函数名称)以在swift中运行

Wor*_*ing 9 func swift

我想将函数的选择器传递给另一个函数.现在我只是传递字符串并执行几个if语句.如果我可以将实际的函数选择器传递给函数,我可以删除所有的if语句.

我目前的职能:

func getBtn(i: String, f: String) -> UIBarButtonItem
{
    let btn: UIButton = UIButton();
    btn.frame=CGRectMake(0,0,30,30)
    btn.setBackgroundImage(UIImage(named:i), forState: UIControlState.Normal)
    if f == "funcOne"{ btn.addTarget(self, action: #selector(self.funcOne), forControlEvents:.TouchUpInside) }
    else if f == "funcTwo"{ btn.addTarget(self, action: #selector(self.funcTwo), forControlEvents:.TouchUpInside) }
    else if f == "funcThree"{ btn.addTarget(self, action: #selector(self.funcThree), forControlEvents:.TouchUpInside) }
    else if f == "funcFour"{ btn.addTarget(self, action: #selector(self.funcFour), forControlEvents:.TouchUpInside) }
    // etc.
    let barBtn = UIBarButtonItem(customView: btn)
    return barBtn;
}
Run Code Online (Sandbox Code Playgroud)

用法:

items.append(self.getBtn("checkmark",f:"funcOne"));
Run Code Online (Sandbox Code Playgroud)

我希望能做什么:

func getBtn(i: String, f: SOME_TYPE_OF_THING) -> UIBarButtonItem
{
    let btn: UIButton = UIButton();
    btn.frame=CGRectMake(0,0,30,30)
    btn.setBackgroundImage(UIImage(named:i), forState: UIControlState.Normal)
    btn.addTarget(self, action: #selector(f), forControlEvents:.TouchUpInside)
    let barBtn = UIBarButtonItem(customView: btn)
    return barBtn;
}
Run Code Online (Sandbox Code Playgroud)

用法:

items.append(self.getBtn("checkmark",f:self.funcOne));
Run Code Online (Sandbox Code Playgroud)

mat*_*att 14

#selector()语法的目的是为了避免因必须将选择器编写为文字字符串而容易出错,这很容易出错.不过,您可以自由编写Selector(f)而不是使用#selector()语法.

但是,如果f它本身被键入Selector 会更好:

func getBtn(i: String, f: Selector) -> UIBarButtonItem
Run Code Online (Sandbox Code Playgroud)

这样,你可以继续使用,#selector但在通话中这样做:

items.append(self.getBtn("checkmark",f:#selector(funcOne)))
Run Code Online (Sandbox Code Playgroud)

getBtn你那么就通过f直接的按钮动作.