我正在构建iOS应用的状态恢复。我目前有
func application(application: UIApplication, viewControllerWithRestorationIdentifierPath identifierComponents: [AnyObject], coder: NSCoder) -> UIViewController? {
guard let controllerIdentifier = identifierComponents.last as? String else {
return nil
}
guard let ctrl = self.window?.rootViewController else {
return nil
}
if controllerIdentifier == "SetupPagesViewController" && ctrl is SetupPagesViewController {
return ctrl
} else if controllerIdentifier == "MainViewController" && ctrl is MainViewController {
return ctrl
}
return nil
}
我发现最后一行有点难看。我可能会有更多的if
s,它们总会返回控制器。我试图找到一个我不会拥有所有if
s的结构。
我尝试过类似的事情:
let checks = [
"SetupPagesViewController": SetupPagesViewController.self,
"MainViewController": MainViewController.self,
]
if let clazz = checks[controllerIdentifier] where ctrl is clazz {
return ctrl
}
但编译器不允许我。我无法找到存储class
类型的方法,以便在if
中重复使用它。
这可能吗?怎么样?感谢
答案 0 :(得分:1)
您可以使用Objective-C运行时(由Foundation公开)的内省工具,即isKindOfClass
的{{1}}方法:
NSObject
请注意,要使其正常工作,这些课程必须从let checks: [String:AnyClass] = [
"SetupPagesViewController": SetupPagesViewController.self,
"MainViewController": MainViewController.self,
]
if let clazz = checks[controllerIdentifier] where ctrl.isKindOfClass(clazz) {
return ctrl
}
继承。
答案 1 :(得分:0)
这个怎么样:
typealias NSViewController = Any
class A : NSViewController {}
class B : NSViewController {}
class C : NSViewController {}
let classes : [AnyClass] = [
A.self,
B.self,
C.self
]
func isValid(ctrl: NSViewController, controllerIdentifier: String) -> NSViewController? {
if classes.contains({ controllerIdentifier == String($0) && ctrl.dynamicType == $0 }) {
return ctrl
} else {
return nil
}
}
(typealias只是为了简化它,无关紧要)。这适用于任何类型,您也不需要为类提供名称,因为String(someClass)
为您提供了名称。我在这里使用了contains
因为我认为你只想检查它是否是一个有效的视图控制器,如果是的话会返回。
答案 2 :(得分:0)
认为这种Swifty方法适合您:
func checkController(controllerIdentifier: String, ctrl: Any) -> UIViewController? {
let objectList: [String:Any.Type] = [
"SetupPagesViewController": SetupPagesViewController.self,
"MainViewController": MainViewController.self
]
let typeOfCtrl: Any.Type = Mirror(reflecting: ctrl).subjectType
if objectList[controllerIdentifier] == typeOfCtrl {
return ctrl as? UIViewController
}
return nil
}