如何在Swift中覆盖和使用alloc?

时间:2015-08-31 10:31:27

标签: ios swift alloc

如何覆盖对象创建(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;。好吧,我不介意其他开发者喜欢使用不同的方法,但是拥有更多的灵活性比拥有更少的灵活性更好。有没有人知道如何覆盖类对象的创建并添加自定义逻辑?

2 个答案:

答案 0 :(得分:1)

据Swift的开发人员Chris Lattner所说,

Alloc being callable was an oversight

您将不得不迁移到对象初始值设定项。

答案 1 :(得分:1)

您描述的行为不适用于纯Swift类型。在Swift中做类似的事情没有适当的Swift概念(至少没有我知道的)。

当使用Objective-C运行时欺骗时,在Objective-C中实现这些技巧似乎没问题。