只有类方法和委托的Swift类?

时间:2015-07-09 19:05:52

标签: ios swift

我想要一个包含所有类方法的类。我想使用委托,所以我的视图控制器(符合协议)可以调用AlertFactory.passwordResetSucess()并显示警报。

  1. 有没有办法让这个工作?一种使用此类委托的方法吗?

  2. 这是不好的做法吗?形式不好?为什么呢?

  3. 实现这一目标的好方法是什么?在几个视图中将使用其他类方法。

  4. 谢谢!

        protocol AlertFactoryDelegate 
        {
            func showAlert(alert: UIAlertController)
        }
    
        class AlertFactory: NSObject {
    
         let delegate: AlertFactoryDelegate!
    
         class func passwordResetSuccess() 
         {
             var alert = UIAlertController(title: "Success!", message: "Yay", preferredStyle: UIAlertControllerStyle.Alert)
             alert.addAction(UIAlertAction(title: "Continue", style: UIAlertActionStyle.Default, handler: nil))
             delegate.showAlert(alert)
         }
        }
    

3 个答案:

答案 0 :(得分:6)

您可以将delegate设为static,然后使用AlertFactory.delegate

进行访问
class AlertFactory: NSObject {
    static weak var delegate: AlertFactoryDelegate?

    class func passwordResetSuccess() {
        ...
        self.delegate?.showAlert(alert)
    }
}

创建委托:

class SomeClass: AlertFactoryDelegate {
    ... // Implement everything the protocol requires
}

// Asssing a delegate
AlertFactory.delegate = SomeClass()

答案 1 :(得分:0)

  1. 您可以使用SINGLETON命令模式,这是一种非常常见的做法。你应该阅读它,但基本上意味着它只有1个实例,你可以在需要时调用它的方法(或根据需要发送它)。常见示例是EventSystem对象或GlobalObserver对象,Factories和ContextManagers。
  2. 以下是有关它的信息: https://sourcemaking.com/design_patterns/singleton

    1. 使用SINGLETON需要权衡,但在许多情况下都非常有用。这对您的问题来说似乎是一个很好的模式。

    2. 您需要在应用启动时初始化delegate。从那时起,当另一个视图控制器需要设置该委托时,您可以为其分配:(这假定您将委托设为公共,并且它是一个单一的)

    3. _myViewController.actionThatRequiresDelegate = AlertFactory.delegate

      正如其他一个答案中所提到的,使用Swifts尾随语法闭包系统是一种使用匿名函数的好方法,你可以在那里做你的逻辑,或者在那里与你的代表沟通。

      <强> 更新

      在AppDelegate.swift中初始化:

      override init()
      {
          AlertFactory.init()
      }
      

      然后在你的AlertFactory

      public static AlertFactoryDelegate myDelegate
      
      public static func init()
      {
          myDelegate = new AlertFactoryDelegate()
      }
      

答案 2 :(得分:0)

如果不首先实例化类,则无法在类上设置实例变量。您是否有理由想要实例化该类,而只是想使用类方法?如果您觉得您有充分的理由在实例方法上使用类方法,那么您有两个可能的选择:

  1. 将委托作为参数传递给类方法。
  2. 使用完成块而不是委托。 Here's a decent example in swift.
  3. 根据我的个人经验,我发现街区更受欢迎。

    编辑:我最近没有使用过Swift,但正如@Skrundz所指出的,你确实可以在Swift中的类上使用静态变量。