Ios someConstant?.isKindOfClass(SomeClassType)的计算结果始终为true
根据rvc的类型,我有以下代码来确定不同的操作: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 } 但是,当我使用故事板执行此操作
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!
相反当您使用方法(即选项链接)时,该方法的结果