在Swift 2

时间:2015-08-28 15:22:24

标签: ios swift swift2

我正在构建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中重复使用它。

这可能吗?怎么样?感谢

3 个答案:

答案 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
}