2016-10-04 2 views
0

я хочу сделать это с помощью переключателя:Переключение дел с литьем

protocol TestProtocol {} 

class A: TestProtocol {} 
class B: TestProtocol {} 

var randomObject: TestProtocol 

if let classAObj = randomObject as? A { 
} else if let classBObj = randomObject as? B {} 

Я хочу что-то вроде этого:

switch randomObject { 
    case let classAObj = randomObject as? A: 
     ... 
    case let classBObj = randomObject as? B: 
     .... 
    default: 
     fatalError("not implemented") 
} 

ответ

2

Конечно, вы можете:

switch randomObject { 
case let classAObj as A: 
    // Here `classAObj` has type `A`. 
    // ... 
case let classBObj as B: 
    // Here `classBObj` has type `B`. 
    // ... 
default: 
    fatalError("not implemented") 
} 

В образец сопоставив выражение это as, а не as?, и = randomObject не требуется, значение соответствует сразу после ключевого слова switch.

И только для полноты: шаблон сопоставления с case letможет также использоваться, если-заявления (или в то время как/для-заявления):

if case let classAObj as A = randomObject { 

} else if case let classBObj as B = randomObject { 

} 

Однако в этом случае было бы нет причин для этого.

+0

Мне было интересно, если использовать случай A/case is B будет дешевле? – koropok

+2

@ koropok: Я сомневаюсь, что это имеет значение. И, как правило, вам нужен объект вниз, тогда вам нужно «как» в любом случае. –

+0

ahh я вижу, спасибо. – koropok

Смежные вопросы