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)
}
我是 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)
}