【发布时间】:2015-08-31 10:31:26
【问题描述】:
如何覆盖对象创建(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 并尝试编译项目,但收到令人讨厌的意外消息“alloc() 在 Swift 中不可用:请改用对象初始化器”。好吧,我不介意其他开发人员更喜欢使用不同的方法,但是拥有更多的灵活性总比拥有更少的灵活性好。有人知道如何覆盖类对象的创建并添加自定义逻辑吗?
【问题讨论】:
-
最好将这种Objective-C hacks 保留在Objective-C 中。纯 swift 类型无论如何都不会使用 alloc。
-
@NikolaiRuhe 是的,但无论如何仍然需要一些 hack,例如 Reflection thingies,带有方法调配的 SideMenu 解决方案,依赖注入框架,如 Typhoon。这就是我在使用 Swift 的初始步骤中正在寻找的东西,因为 Objc 具有强大的功能,而不管其奇特的语法如何,因此将大型应用程序解决方案从 Objc 过渡到 Swift 并不像它应该的那样顺利,至少现在是这样:)