当使用具有可选方法的协议时,偶然发现了swift中的一个奇怪的行为,这些方法具有相同的名称和参数类型但命名参数不同.
如果我在课堂上实现了一个或两个方法,一切都运行正常,但一旦我发表评论,swift就会抱怨:
"方法'myProtocol(foo :)'具有与协议'MyProtocol'('myProtocol(bar :)')所需的参数名称不同的参数名称"
我期望的行为是我可以实现协议方法的任意组合(只有两者之一,两者都没有),因为这两种方法都被定义为可选的.
这是一个演示文件的操场文件,当你取消评论评论或没有实现任何协议方法时,一切编译都很好.
// Playground - noun: a place where people can play
import UIKit
@objc protocol MyProtocol {
optional func myProtocol(foo aString: String!)
optional func myProtocol(bar aString: String!)
}
class Test : MyProtocol {
init() {
}
func myProtocol(foo aString: String!) {
puts("myProtocol(foo aString: String!): \(aString)")
}
// UN-COMMENT THIS AND EVERYTHING COMPILES FINE
/*
func myProtocol(bar aString: String!) {
puts("myProtocol(bar aString: String!): \(aString)")
}
*/
}
let foobar = Test()
foobar.myProtocol(foo: "Hello")
//foobar.myProtocol(bar: "Bye")
Run Code Online (Sandbox Code Playgroud)
有人可以启发我这个吗?
正如我们从 Swift 函数文档中了解到的,foo和bar是参数的外部名称aString。因此从技术上讲,他具有完全相同的函数,只是参数名称不同,这在 Objective-C 中是完全合法的:
id<MyProtocol> myVar;
[myVar myProtocolWithBar:@""];
[myVar myProtocolWithFoo:@""];
Run Code Online (Sandbox Code Playgroud)
我认为这是 Swift 编译器的一个错误!提交报告: http: //bugreport.apple.com
| 归档时间: |
|
| 查看次数: |
931 次 |
| 最近记录: |