你可以在Swift中创build匿名内部类吗?

我厌倦了将整个类声明为能够通过扩展UIAlertViewDelegate来处理UIAlertView点击。 当我有多个可能的UIAlertView时,它开始感到混乱和错误,并且必须区分处理程序中被点击的内容。

我真正想要的是创build一个实现UIAlertViewDelegate协议的对象,并在显示时将这个一次性对象赋予我的UIAlertView

我想要这样的东西:

 let confirmDelegate = UIAlertViewDelegate() { func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) { // Handle the click for my alertView } } 

然后在显示警报时使用它:

 let alertView = UIAlertView(title: "Confirm", message: "Are you sure?", delegate: confirmDelegate, cancelButtonTitle: "No", otherButtonTitles: "Yes") alertView.show() 

这可能没有声明一个新的类?

我知道我可以做这样的事情:

 class ConfirmDelegate: UIAlertViewDelegate { func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) { // ... } } 

然后实例化一个ConfirmDelegate() ,但我只是想知道这是否可能作为单线类声明和实例化。

正如@ChrisWagner在他的评论中指出的那样,你不需要在iOS8中做任何这样的事情,至less对于UIAlertView因为有一个新的UIAlertViewController使用没有任何委托的闭包。 但从学术angular度来看,这种模式仍然很有趣。

我根本不会使用匿名类。 我只是创build一个可以作为委托分配的类,并接受闭包在发生事件时执行。

你甚至可以升级这个接受每一种行动的closures: onDismissonCancel等等。或者你甚至可以让这个类产生警戒视图,把自己设置为委托。

 import UIKit class AlertViewHandler: NSObject, UIAlertViewDelegate { typealias ButtonCallback = (buttonIndex: Int)->() var onClick: ButtonCallback? init(onClick: ButtonCallback?) { super.init() self.onClick = onClick } func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) { onClick?(buttonIndex: buttonIndex) } } class ViewController: UIViewController { // apparently, UIAlertView does NOT retain it's delegate. // So we have to keep it around with this instance var // It'll be nice when all of UIKit is properly Swift-ified :( var alertHandler: AlertViewHandler? func doSoemthing() { alertHandler = AlertViewHandler({ (clickedIndex: Int) in println("clicked button \(clickedIndex)") }) let alertView = UIAlertView( title: "Test", message: "OK", delegate: alertHandler!, cancelButtonTitle: "Cancel" ) } } 

通过closures应该可以减轻对匿名课程的需求。 至less在最常见的情况下。

不幸的是据我所知,不,你不能有效地创build匿名内部类。 你build议的语法将是非常好的国际海事组织虽然。

这是我想要得到的东西接近你想要的东西,但是没有接近干净的地方。

 import UIKit class AlertViewDelegate: NSObject, UIAlertViewDelegate { func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) { } func alertView(alertView: UIAlertView!, didDismissWithButtonIndex buttonIndex: Int) { } func alertView(alertView: UIAlertView!, willDismissWithButtonIndex buttonIndex: Int) { } func alertViewCancel(alertView: UIAlertView!) { } func alertViewShouldEnableFirstOtherButton(alertView: UIAlertView!) -> Bool { return true } } class ViewController: UIViewController { var confirmDelegate: AlertViewDelegate? func doSoemthing() { confirmDelegate = { class ConfirmDelegate: AlertViewDelegate { override func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) { println("clicked button \(buttonIndex)") } } return ConfirmDelegate() }() let alertView = UIAlertView(title: "Test", message: "OK", delegate: confirmDelegate, cancelButtonTitle: "Cancel") } } 
Interesting Posts