【发布时间】:2016-01-19 17:33:36
【问题描述】:
我试图通过用单个 switch 语句替换典型的长字符串嵌套 if/else 语句来提高我的 KVO observeValueForKeyPath 实现的易读性。
到目前为止,唯一真正起作用的是:
private let application = UIApplication.sharedApplication()
switch (object!, keyPath!) {
case let (object, "delegate") where object as? UIApplication === application:
appDelegate = application.delegate
break
...
default:
super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
}
如果有的话,这比阅读更难:
if object as? UIApplication === application && keyPath! == "delegate" {
}
else {
}
有没有人有一个在observeValueForKeyPath(和类似方法)中使用switch的好模型
编辑:与下面@critik 的问题相关,这里有更多代码来演示仅使用switch (object as! NSObject, keyPath!) { 的问题:
private let application = UIApplication.sharedApplication()
private var appDelegate : UIApplicationDelegate?
private var rootWindow : UIWindow?
public override func observeValueForKeyPath(
keyPath: String?,
ofObject object: AnyObject?,
change: [String : AnyObject]?,
context: UnsafeMutablePointer<Void>) {
switch (object as! NSObject, keyPath!) {
case (application, "delegate"):
appDelegate = application.delegate
(appDelegate as? NSObject)?.addObserver(self, forKeyPath: "window", options: [.Initial], context: nil)
break
case (appDelegate, "window"):
rootWindow = appDelegate?.window?.flatMap { $0 }
break
case (rootWindow, "rootViewController"):
rebuildViewControllerList(rootWindow?.rootViewController)
break
default:
super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
}
}
【问题讨论】:
-
你真正想说的是整个 KVO 架构很糟糕。这是真的,但这不是新消息。我们在这条路上走来走去很多次。有许多明显的变通方法,但最终很难避免一个巨大的瓶颈,即一切都通过这种方法,而大规模切换是处理它的标准方法。
-
@matt 现在对我来说更烦人的是它在 iOS 上的实现不完全,或者可能不完全使用)。系统对象上有许多属性无法有效观察,例如
UIViewController.presentedViewController。 -
心存感激。你知道 KVO 是如何工作的吗?它直接进入您的对象并混合它,用另一个对象代替您的对象!这是魔鬼的工作。事实上,我们有时不得不使用它是问题所在。
-
是的,我从一开始就一直在使用 KVO。从概念上讲,它是一种非常强大的机制,尤其是在 MacOS 上,您可以将视图直接绑定到属性。我经常感叹在 iOS 上能够做到这一点,以至于我已经组合了一些解决方案,让我至少可以在几个场合做到这一点:)
-
“您可以将视图直接绑定到属性” 当然,我知道。我有严重依赖于此的应用程序。但我当然无法弄清楚它们是如何工作的。 :)
标签: swift switch-statement key-value-observing