这是Xcode中的错误还是程序员应该避免练习?

时间:2017-05-13 08:06:58

标签: swift xcode protocol-extension

首先,我通过为协议功能提供默认参数值来寻找简化编码的方法。我采用了解决方案here,然后发现了它可能带来的一些致命的后果:

protocol Foo {
    func foo(_ a: Int)
}

extension Foo {
    func foo(_ a: Int = 4) {
        foo(a)
    }
}

struct FooImpl: Foo {
    // empty implementation
}

FooImpl().foo() // will go recursively forever and finally reach the stack limit

我还发现这段代码无法在IBM Swift Sandbox中编译,因此假设xcode编译器可能会受到责备。

2 个答案:

答案 0 :(得分:4)

这看起来是编译器应该接受和执行的有效Swift代码。它包含致命的无限递归是程序员的一个逻辑错误。

我没有看到IBM Swift Sandbox中的任何内容表明它比Xcode更好或不同地处理代码。

答案 1 :(得分:0)

您省略了实施的一个非常重要的部分。 如果您执行此操作,则必须在foo中实施FooImpl。如果你没有实现它,你的代码基本上等同于

protocol Foo {
}

extension Foo {
    func foo(_ a: Int = 4) {
        foo(a)
    }
}

struct FooImpl: Foo {
}

FooImpl().foo()

显然会产生无限循环。如果您正确实施foo,您将看到预期的行为:

protocol Foo {
    func foo(_ a: Int)
}

extension Foo {
    func foo(_ a: Int = 4) {
        foo(a)
    }
}

struct FooImpl: Foo {
    func foo(_ a: Int) {
        print(a)
    }
}

FooImpl().foo()

两者都是完全有效的快速片段,唯一的区别是一个实际上有效,另一个会崩溃。但这并不是编译器应该担心的。