如何在Swift中启用类类型?

3

I have the following code:

class Base {}
class A: Base {}
class B: Base {}
class C: Base {}

func next(obj: Base) -> Base {
    if obj is A { return B() }
    else if obj is B { return C() }
    else if obj is C { return A() }
    else { return A() }
}

如何将嵌套的if语句转换为单个switch语句?

3个回答

6
extension Base {

    func next() -> Base {
        switch self {
        case is A: return B()
        case is B: return C()
        case is C: return A()
        default: return A()
        }
    }

}

顺便提一下,如果您有一个class X: B并在其实例上调用next,它将返回C,而不是default情况下的A - Iulian Onofrei

3

令人惊讶的是,这正是你所想但不希望能够成功的内容:

switch obj {
case (is A):
    // do something
case (is B):
    // do something
case (is C):
    // do something
default:
    // do something
}

请注意,括号并不是必需的,我只是为了可读性而喜欢它们。

2
理想情况下,在这种情况下,您可以通过使用多态性来避免使用if语句。
例如,在基类中,您定义一个方法X(),并在每个子类中重写它以返回B()、C()、A()等。
然后在您的下一个方法中,只需返回obj.X()。
有关此主题的更多信息,请单击此处。权威人士(Martin Fowler)的必要权威诉求请单击此处

1
不,这样做不行。我想要将每个对象与其对其他对象的了解分开。 - user1002430
如果他可以更改原始类定义,则此方法有效。如果不能更改,则无法使用此方法。您无法使用扩展完成此操作,因为从Swift 2.1开始,编译器会报告“错误:扩展中的声明尚不支持覆盖”。 - rob mayoff
我看到你和其他人已经按照问题所要求的回答了,这是完全合理的,但是当我在生产代码中看到这种条件方法被使用时,通常并不是正确的方法,可以按照我所描述的进行重构。 - Julian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接