Swift - 正确使用 AnyObject

Swift - Proper usage of AnyObject

我是 swift 的新手。我正在使用 storyboard 并且根据登录信息,我正在更改 UIViewController 以加载。下面是片段。

class func viewControllerWithName(name: String) -> UIViewController?
    {
        let storyboard = mainStoryboard()
        let viewController: AnyObject! = storyboard.instantiateViewControllerWithIdentifier(name)
        return viewController as? UIViewController
    }

func setUpController {
        let viewController: AnyObject!
        if self.user() == "admin" {
            viewController:AdminViewController = self.viewControllerWithName("admin") !as! AdminViewController
        } else {
            viewController:UserViewController = self.viewControllerWithName("user") !as! UserViewController
        }
        self.addChildViewController(viewController)
        viewController.view.frame = container.frame
        self.view.addSubview(viewController.view)
        viewController.didMoveToParentViewController(self)
    }

我尝试了很多方法,但是,我无法进行类型转换viewController。我得到错误,说

Cannot invoke 'addChildViewController' with an argument list of type '(AnyObject!)'

实现此目的的正确格式是什么?

当你知道它将成为一个视图控制器时,为什么你将它声明为 AnyObject?将其声明为 UIViewController,您提到的错误应该会消失。

您不需要在 if-else 部分执行 viewController:AdminViewController。无论如何,您都在强制转换 viewControllerWithName 方法的输出。

在这种情况下,您表示 viewController 是 AnyObject 类型:

let viewController: AnyObject!

要将 UIVIewController 传递给 addChildViewController,您可以尝试类似的操作:

let viewController = self.viewControllerWithName("admin") as! AdminViewController

self.addChildViewController(viewController)

在 swift 中,您无法在运行时更改 let 或 var 类型

更新您的代码并将 AnyObject 更改为 UIViewController:

class func viewControllerWithName(name: String) -> UIViewController?
    {
        let storyboard = mainStoryboard()
        let viewController = storyboard.instantiateViewControllerWithIdentifier(name) as? UIViewController
        return viewController 
    }

func setUpController {
        let viewController: UIViewController!
        if self.user() == "admin" {
            viewController = self.viewControllerWithName("admin")!
        } else {
            viewController = self.viewControllerWithName("user")! 
        }
        self.addChildViewController(viewController)
        viewController.view.frame = container.frame
        self.view.addSubview(viewController.view)
        viewController.didMoveToParentViewController(self)
    }