我有以下代码来确定不同的操作,具体取决于rvc的类型:
let rvc = UIApplication.sharedApplication().delegate.window?.rootViewController
if rvc?.isKindOfClass(UINavigationController)
{
push the view controller
}
else
{
present the view controller
}
然而,当我使用故事板执行此操作时,初始视图控制器不是UINavigationController,只是UIViewController的后代,那么if语句的第一个分支正在执行。
更新:问题实际上是语法,因为在以下代码中,每个if语句将评估为true:
if rvc?.isKindOfClass(UIViewController)
{
println("UIViewController")
}
if rvc?.isKindOfClass(UINavigationController)
{
println("nav controller")
}
if rvc?.isKindOfClass(NSNotification)
{
println("should not get here")
}
if rvc?.isKindOfClass(put whatever you want here)
{
println("should not get here")
}
因此rvc?.isKindOfClass的语法/语义一定有问题,但是那个不正确呢?
答案 0 :(得分:4)
作为Grimxn答案的附录(以及对if rvc?.isKindOfClass(xxxAnyClassxx) {
和if rvc!.isKindOfClass(...) {
之间差异的回答):
当您使用?.method
(即选项链接)时,该方法的结果将封装在Optional中。这就是重点;如果链中的任何一点导致.Some(the result of the last method in the chain)
,则期权链的最终结果将为nil
或nil
。
如果Optional
包含某些内容(即其值为if
),则在true
语句中测试Optional
的逻辑值将返回.Some(...)
和false
如果它是nil
- 它不会查看Optional
内的值是什么。在这种情况下,它包含您实际想要检查的值。
答案 1 :(得分:0)
语法似乎有效。这适用于游乐场:
class MyNavC: UINavigationController {
}
let v = MyNavC(navigationBarClass: nil, toolbarClass: nil)
let v1 = UIViewController(nibName: nil, bundle: nil)
let b = v.isKindOfClass(UINavigationController) // true
let b1 = v1.isKindOfClass(UINavigationController) // false
......但这些不是选项(也不允许)。
在实际应用中尝试使用 分配所需的选项代码:
let rvc = UIApplication.sharedApplication().delegate.window?.rootViewController
你是对的,
if rvc?.isKindOfClass(xxxAnyClassxx) {
总是评估为真。但是,使用
if rvc!.isKindOfClass(...) {
给出正确的结果。