我想要一个包含所有类方法的类。我想使用委托,所以我的视图控制器(符合协议)可以调用AlertFactory.passwordResetSucess()
并显示警报。
有没有办法让这个工作?一种使用此类委托的方法吗?
这是不好的做法吗?形式不好?为什么呢?
实现这一目标的好方法是什么?在几个视图中将使用其他类方法。
谢谢!
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)
}
}
答案 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)
SINGLETON
命令模式,这是一种非常常见的做法。你应该阅读它,但基本上意味着它只有1个实例,你可以在需要时调用它的方法(或根据需要发送它)。常见示例是EventSystem对象或GlobalObserver对象,Factories和ContextManagers。以下是有关它的信息: https://sourcemaking.com/design_patterns/singleton
使用SINGLETON需要权衡,但在许多情况下都非常有用。这对您的问题来说似乎是一个很好的模式。
您需要在应用启动时初始化delegate
。从那时起,当另一个视图控制器需要设置该委托时,您可以为其分配:(这假定您将委托设为公共,并且它是一个单一的)
_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)
如果不首先实例化类,则无法在类上设置实例变量。您是否有理由想要实例化该类,而只是想使用类方法?如果您觉得您有充分的理由在实例方法上使用类方法,那么您有两个可能的选择:
根据我的个人经验,我发现街区更受欢迎。
编辑:我最近没有使用过Swift,但正如@Skrundz所指出的,你确实可以在Swift中的类上使用静态变量。