Ios someConstant?.isKindOfClass(SomeClassType)的计算结果始终为true

Ios someConstant?.isKindOfClass(SomeClassType)的计算结果始终为true,ios,swift,Ios,Swift,根据rvc的类型,我有以下代码来确定不同的操作: let rvc = UIApplication.sharedApplication().delegate.window?.rootViewController if rvc?.isKindOfClass(UINavigationController) { push the view controller } else { present the view controller } 但是,当我使用故事板执行此操作

根据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?的语法/语义肯定有问题。它属于类,但它有什么不正确之处?

语法似乎有效。这在操场上起作用:

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
…但这些不是可选的(也不允许)

在实际应用程序中尝试您的代码,并提供分配任务所需的选项:

让rvc=UIApplication.sharedApplication().delegate.window?.rootViewController

你说得对,

如果rvc?.iskindof类(xxxAnyClassxx){

始终计算true。但是,使用

如果rvc!.iskindof类(…){


给出正确的结果。

语法似乎有效。这适用于游乐场:

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
…但这些不是可选的(也不允许)

在实际应用程序中尝试您的代码,并提供分配任务所需的选项:

让rvc=UIApplication.sharedApplication().delegate.window?.rootViewController

你说得对,

如果rvc?.iskindof类(xxxAnyClassxx){

始终计算true。但是,使用

如果rvc!.iskindof类(…){


给出正确的结果。

作为Grimxn答案的附录(并回答
if rvc?.iskindof class(xxxAnyClassxx){
if rvc!。iskindof class(…){
):


当您使用
?.method
(即,选项链接)时,该方法的结果被封装在可选项中。这就是全部要点;选项链的最终结果将是
.Some(链中最后一个方法的结果)
nil
,如果链中的任何点导致
nil


if
语句中测试
Optional
的逻辑值将返回
true
,前提是
Optional
包含某些内容(即,其值为
.Some(…)
),和
false
如果它是
nil
——它不会查看
可选的
中的值是什么。在这种情况下,您实际上要检查的是它包含的值。

作为Grimxn答案的补充(以及回答
如果rvc?)之间的差异问题。是类(xxxAnyClassxx){
如果rvc!.是类的种类(…){
):


当您使用
?.method
(即,选项链接)时,该方法的结果被封装在可选项中。这就是全部要点;选项链的最终结果将是
.Some(链中最后一个方法的结果)
nil
,如果链中的任何点导致
nil



if
语句中测试
Optional
的逻辑值将返回
true
,前提是
Optional
包含某些内容(即,其值为
.Some(…)
),和
false
如果它是
nil
——它不会查看
可选的
中的值是什么。在这种情况下,您实际上要检查的是包含的值。

您确定这是您的语法吗?您的意思是:“如果rvc是导航控制器,请使用rvc作为根构建另一个nativationController”如果rvc是?UINavigationController
这不是rvc的类型,这是一个问题,事实上rvc?是这样的。这类的计算结果总是正确的。请参阅更新的问题。感谢否决Havermous先生。那么,如果你知道的太多,你觉得这值得否决,那么问题是什么?为什么不回答问题。太棒了,不是吗?他也否决了我的意见,但没有给出更好的答案。你确定这是你的语法吗?你说的是:“如果rvc是导航控制器,用rvc作为根构建另一个nativationController”如果rvc是?UINavigationController
这不是rvc的类型,这是一个问题,事实上rvc?是这样的。这类的计算结果总是正确的。请参阅更新的问题。感谢否决Havermous先生。那么,如果你知道的太多,你觉得这值得否决,那么问题是什么?为什么不回答问题。太棒了,不是吗?他也否决了我的意见,但没有给出更好的答案。语法确实有问题,请参阅更新的问题谢谢你的回答,至少我很感激。一定是因为?在if行或let行中?当然是你的不同之处做什么和我做什么都不是我的选择…@Sausages-明白了!使用
rvc!
而不是
rvc?
当你使用
?。方法(即选项链接),该方法的结果封装在一个Optional中。这就是要点。如果Optional包含某些内容,则在if语句中测试Optional的逻辑值将返回true,如果Optional为nil,则返回false——它不会查看Optional中的值是什么。在这种情况下,您实际上要检查的是包含的值ck.语法确实有问题,请参阅更新的问题谢谢你的回答,至少我很感激。一定是因为?在if行或let行中?当然,你正在做的和我正在做的之间的区别是我的不是可选的…@Sausages-明白了!使用
rvc!
相反当您使用
方法(即选项链接)时,该方法的结果