如何覆盖对象创建(alloc)和添加自定义逻辑?原因是我总是为每个模块(屏幕)使用3个类构建我的通用应用程序,例如
1. LoginViewController // this inherits from BaseViewController and holds common code for both ipad and iphone
2. LoginViewController_iphone // custom logic for iphone only
3. LoginViewController_ipad // custom logic for ipad only
很酷的部分是我在代码周围使用没有后缀的控制器,因为它们都是从BaseViewController扩展而且它有覆盖alloc方法,它执行智能逻辑并在调用VC alloc / init时自动选择正确的类。
现在,由于我们都开始慢慢转换到Swift,我设法在Swift 1.2中覆盖并实现了alloc方法。这是实施:
class BaseViewController: UIViewController {
override class func alloc() -> BaseViewController {
var viewControllerClassName : String = NSStringFromClass(self)
if ((viewControllerClassName.lowercaseString.rangeOfString("ipad") == nil) && (viewControllerClassName.lowercaseString.rangeOfString("iphone") == nil)) {
switch (UIDevice.currentDevice().userInterfaceIdiom) {
case .Pad:
viewControllerClassName += "_ipad";
case .Phone:
viewControllerClassName += "_iphone";
default:
viewControllerClassName += "";
}
let viewControllerClass : AnyClass = NSClassFromString(viewControllerClassName)
return viewControllerClass.alloc() as! BaseViewController
} else {
return super.alloc() as! BaseViewController
}
}
今天,我使用Swift 2下载了Xcode 7 beta 6并试图编译该项目,但是得到了令人讨厌的惊喜消息"在Swift中无法使用alloc():使用对象初始化器而不是#34;。好吧,我不介意其他开发者喜欢使用不同的方法,但是拥有更多的灵活性比拥有更少的灵活性更好。有没有人知道如何覆盖类对象的创建并添加自定义逻辑?
答案 0 :(得分:1)
Alloc being callable was an oversight。
您将不得不迁移到对象初始值设定项。
答案 1 :(得分:1)
您描述的行为不适用于纯Swift类型。在Swift中做类似的事情没有适当的Swift概念(至少没有我知道的)。
当使用Objective-C运行时欺骗时,在Objective-C中实现这些技巧似乎没问题。