2015-08-27 2 views
1

У меня есть часть кода, которую я хотел бы выполнить, если переменную можно отличить как один из двух типов.Как я могу использовать оператор OR с дополнительной привязкой?

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

Однако, Swift (начиная с версии 2.0), по-видимому, этого не допускает. Я ищу способ сделать это, не создавая два отдельных блока if.

В моем коде используется только супер-тип, поэтому код, относящийся к обоим типам, одинаковый. Однако я не могу использовать его для супер-типа, потому что я не хочу, чтобы код выполнялся, если переменнаяToCast является одним из многих других возможных типов, которые также получены из одного и того же супер-типа.

ответ

2

Основываясь на ваш комментарий:

Мой код использует только супер тип, поэтому код работы с обоими типами одинаковы. Тем не менее, я не могу отличить его от супер-типа, потому что Я не хочу, чтобы код выполнялся, если переменнаяToCast является одним из многих возможных типов, которые также производятся от одного и того же супер-типа.

В ваших опции связывание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") 
} 
+0

Очень хороший ответ. – JeremyP

1

Я ищу способ сделать это без необходимости создания двух отдельных блоков, если

Почему?

Вы все равно не можете использовать тот же код в блоке 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 
} 

С другой стороны, если ваши два типа имеют общий супер-тип, нанесите его на этот супер-тип.

+0

Моим код использует только супер типа, поэтому код, относящийся к обоим типам, одинаковый. Однако я не могу отнести его к супер-типу, потому что я не хочу, чтобы код выполнялся, если 'variableToCast' является одним из многих других возможных типов, которые также получены из одного и того же супер-типа. –

+0

@FarhadYusufali вышеприведенный комментарий является довольно важной частью вопроса. Вы должны рассмотреть возможность редактирования вопроса для размещения в нем той же информации. Это поможет людям в будущем иметь аналогичную проблему для вас. – JeremyP

+1

@JeremyP, это было хорошее предложение. Я пошел вперед и уточнил вопрос с комментарием Фархада, если он не обходил его некоторое время. – vacawama

0

Чтобы добавить на ответ JeremyP, в если вы на самом деле не волнует, что значение myOptional есть, но просто хочу, чтобы выполнить код, если это один из этих двух типов, вы могли бы сделать это вместо

if variableToCast is firstTypeToTryToCastAs || variableToCast is secondTypeToTryToCastAs { 
    //Code for both cases 
} 
Смежные вопросы