首先,我通过为协议功能提供默认参数值来寻找简化编码的方法。我采用了解决方案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编译器可能会受到责备。
答案 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()
两者都是完全有效的快速片段,唯一的区别是一个实际上有效,另一个会崩溃。但这并不是编译器应该担心的。