使用调用对象" s" self"默认情况下

时间:2017-03-13 18:48:46

标签: swift

我有一个实用程序类,其中包含多个其他类使用的函数。其中之一是警报功能:

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)
    }
}

此功能始终以视图控制器上的self为目标,因此我每次调用此功能时都不必添加target: self,但我不能将其设置为默认值,因为这会导致它返回Utils类。有什么方法可以重写这个以避免这种情况吗?

2 个答案:

答案 0 :(得分:4)

实用程序类完全是出于这个原因的反模式,你真正想要使用的是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)
    }
}

然后您可以直接在所有控制器上调用该方法:

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

通常避免使用实用方法的类。尝试将方法添加到功能实际所属的类型。

答案 1 :(得分:2)

您可以将它放在UIViewController的扩展中,而不是将函数放在Utils类中,如下所示:

    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)
      }