2017-03-13 4 views
2

Ich habe eine Dienstprogrammklasse mit Funktionen, die von mehreren anderen Klassen verwendet werden. Eine davon ist eine Alarmfunktion:Methode, die das "self" des aufrufenden Objekts standardmäßig verwendet

class Utils { 
    func doAlert (title: String, message: String, target: UIViewController) { 
     let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) 
     alert.addAction(UIAlertAction(title: "Close", style: .cancel, handler: nil)) 
     target.present(alert, animated: true, completion: nil) 
    } 
} 

Diese Funktion wird self auf dem View-Controller immer Ziel, so möchte ich nicht target: self jedes Mal, wenn ich die Funktion aufrufen, hinzufügen haben, aber ich kann nicht einfach Setzen Sie es als Standardwert, da dies dazu führt, dass es sich auf die Klasse Utils bezieht. Kann ich das irgendwie umschreiben, um das zu vermeiden?

Antwort

4

Utility-Klassen ein Antipattern sind genau aus diesem Grund, was Sie auch wirklich nutzen wollen, ist ein extension:

extension UIViewController { 
    func doAlert(title: String, message: String) { 
     let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) 
     alert.addAction(UIAlertAction(title: "Close", style: .cancel, handler: nil)) 
     self.present(alert, animated: true, completion: nil) 
    } 
} 

und dann können Sie die Methode aufrufen, direkt auf alle Steuerungen:

self.doAlert(title: "title", message: "message") 

Vermeiden Sie generell Klassen mit Utility-Methoden. Versuchen Sie Methoden zu den Typen hinzuzufügen, zu denen die Funktionalität tatsächlich gehört.

2

Statt die Funktion in Ihrem Utils Klasse setzen, können Sie es in einer Erweiterung UIViewController, so:

extension UIViewController { 
     func doAlert (title: String, message: String) { 
      let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) 
      alert.addAction(UIAlertAction(title: "Close", style: .cancel, handler: nil)) 
      target.present(alert, animated: true, completion: nil) 
     } 
Verwandte Themen