someConstant?.isKindOfClass(SomeClassType)始终求值为true

时间:2014-07-11 17:17:19

标签: ios swift

我有以下代码来确定不同的操作,具体取决于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的语法/语义一定有问题,但是那个不正确呢?

2 个答案:

答案 0 :(得分:4)

作为Grimxn答案的附录(以及对if rvc?.isKindOfClass(xxxAnyClassxx) {if rvc!.isKindOfClass(...) {之间差异的回答):

当您使用?.method(即选项链接)时,该方法的结果将封装在Optional中。这就是重点;如果链中的任何一点导致.Some(the result of the last method in the chain),则期权链的最终结果将为nilnil

如果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(...) {

给出正确的结果。