¿Cuál es la mejor manera de reutilizar los attributes de un UIButton en Swift

Tengo un montón de botones que estoy agregando a una UIToolbar cuando se UITextField un UITextField usando inputAccessoryView . Todos estos botones son idénticos excepto por el título y lo que me gustaría poder hacer es reutilizar los attributes de la interfaz de usuario como titleColor , frame , etc.

¿Cuál sería la forma más eficiente de lograr lo que describí anteriormente?

Aquí está el código …

  // code for first button let button1 = UIButton(); button1.backgroundColor = UIColor.orangeColor() button1.setTitle("button1", forState: .Normal) button1.setTitleColor(UIColor.whiteColor(), forState: .Normal) button1.setTitleColor(UIColor.orangeColor(), forState: .Highlighted) button1.frame = CGRect(x:0, y:0, width:35, height:35) button1.addTarget(self, action: #selector(myFunction), forControlEvents: UIControlEvents.TouchUpInside) // code for second button which is identical to the first button let button2 = UIButton(); button2.backgroundColor = UIColor.orangeColor() button2.setTitle("button2", forState: .Normal) button2.setTitleColor(UIColor.whiteColor(), forState: .Normal) button2.setTitleColor(UIColor.orangeColor(), forState: .Highlighted) button2.frame = CGRect(x:0, y:0, width:35, height:35) button2.addTarget(self, action: #selector(myFunction), forControlEvents: UIControlEvents.TouchUpInside) let barButton = UIBarButtonItem() barButton.customView = button let barButton2 = UIBarButtonItem() barButton2.customView = button2 let toolBar = UIToolbar() toolBar.items = [ barButton, barButton2] toolBar.sizeToFit() myTextField.inputAccessoryView = toolBar 

Refactorice el código duplicado en una sola function local.

 func configure(_ button:UIButton) { button.backgroundColor = UIColor.orangeColor() button.setTitleColor(UIColor.whiteColor(), forState: .Normal) button.setTitleColor(UIColor.orangeColor(), forState: .Highlighted) button.frame = CGRect(x:0, y:0, width:35, height:35) button.addTarget(self, action: #selector(myFunction), forControlEvents: UIControlEvents.TouchUpInside) } // code for first button let button1 = UIButton() button1.setTitle("button1", forState: .Normal) configure(button1) // code for second button which is identical to the first button let button2 = UIButton() button2.setTitle("button2", forState: .Normal) configure(button2) 

Algo como la respuesta de @ matt, pero en mi humilde opinión:

 // code for first button let button1 = UIButton().configure("button1", frame: CGRect(x: 0, y: 0, width: 35, height: 35), target: self, action: #selector(myFunction)) // code for second button which is probably not exactly identical to the first button. They should at minimum have different titles, different frames and activate different functions. let button2 = UIButton().configure("button2", frame: CGRect(x: 0, y: 0, width: 35, height: 35), target: self, action: #selector(myFunction)) 

En otro lugar de su código porque probablemente lo usará en varios controlleres de vista:

 extension UIButton { func configure(title: String, frame: CGRect, target: AnyObject, action: Selector) -> UIButton { self.backgroundColor = UIColor.orangeColor() self.setTitle(title, forState: .Normal) self.setTitleColor(UIColor.whiteColor(), forState: .Normal) self.setTitleColor(UIColor.orangeColor(), forState: .Highlighted) self.frame = frame self.addTarget(target, action: action, forControlEvents: UIControlEvents.TouchUpInside) return self } }