这是 Xcode 中的错误还是程序员应该避免的做法?
Is this a bug in Xcode or a practice should be avoid by programmer?
首先,我寻找一种通过为协议函数提供默认参数值来简化编码的方法。我采用了解决方案 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 编译器可能是罪魁祸首。
这看起来是编译器应该接受并执行的有效 Swift 代码。它包含致命的无限递归是程序员的逻辑错误。
我在 IBM Swift 沙箱中没有看到任何表明它比 Xcode.
更好或不同地处理代码的任何内容
你省略了一个非常重要的实现部分。 如果你这样做,你必须在FooImpl
中实现foo
。如果你不实现它,你的代码基本上等同于
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()
两者都是完全有效的 swift 片段,唯一的区别是一个真正有效,另一个会崩溃。但这不是编译器应该担心的。
首先,我寻找一种通过为协议函数提供默认参数值来简化编码的方法。我采用了解决方案 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 编译器可能是罪魁祸首。
这看起来是编译器应该接受并执行的有效 Swift 代码。它包含致命的无限递归是程序员的逻辑错误。
我在 IBM Swift 沙箱中没有看到任何表明它比 Xcode.
更好或不同地处理代码的任何内容你省略了一个非常重要的实现部分。 如果你这样做,你必须在FooImpl
中实现foo
。如果你不实现它,你的代码基本上等同于
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()
两者都是完全有效的 swift 片段,唯一的区别是一个真正有效,另一个会崩溃。但这不是编译器应该担心的。