如何将OR运算符与可选绑定一起使用?

时间:2015-08-27 18:37:07

标签: ios swift

如果变量可以作为两种类型之一生成,我想要执行一段代码。

if let myOptional = variableToCast as! firstTypeToTryToCastAs || 
   let myOptional = variableToCast as! secondTypeToTryToCastAs {
        //Execute some code
}

但是,Swift(版本2.0)显然不允许这样做。我正在寻找一种方法来做到这一点,而无需创建两个单独的if块。

我的代码只使用超类型,因此处理这两种类型的代码是相同的。但是,我不能将它强制转换为超类型,因为如果variableToCast是同样的超类型派生的许多其他可能类型之一,我不想编写执行代码。

3 个答案:

答案 0 :(得分:2)

根据您的评论:

  

我的代码只使用超类型,因此代码处理两者   类型是一样的。但是,我无法将其转换为超类型,因为   如果variableToCast是其中之一,我不想编写代码来执行   其他可能的类型也派生自相同的超类型。

可选绑定 if let中转换为超类型,然后使用where子句将其限制为您感兴趣的类:

class SuperType {

}

class firstTypeToTryToCastAs: SuperType {

}

class secondTypeToTryToCastAs: SuperType {

}

class thirdTypeToTryToCastAs: SuperType {

}

var variableToCast: AnyObject = firstTypeToTryToCastAs()

if let myOptional = variableToCast as? SuperType where myOptional is firstTypeToTryToCastAs || myOptional is secondTypeToTryToCastAs {
    print("this works")
} else {
    print("not the type we are looking for")
}

答案 1 :(得分:1)

  

我正在寻找一种方法来做到这一点,而无需创建两个单独的if块

为什么?

您无法在if块中使用相同的代码,因为myOptional的类型不同。我会选择

if let myOptional = variableToCast as! firstTypeToTryToCastAs
{
    // code dealing with a firstTypeToTryToCastAs
}
else if let myOptional = variableToCast as! secondTypeToTryToCastAs
{
    // code dealing with a secondTypeToTryToCastAs
}

另一方面,如果您的两种类型具有共同的超类型,则将其强制转换为超类型。

答案 2 :(得分:0)

要添加到JeremyP的答案,如果你实际上并不关心myOptional的价值是什么,但只是想要执行某些代码,如果它是这两种类型中的一种,你可以这样做

if variableToCast is firstTypeToTryToCastAs || variableToCast is secondTypeToTryToCastAs {
    //Code for both cases
}