Swift协议方法的奇怪行为

sle*_*led 9 protocols swift

当使用具有可选方法的协议时,偶然发现了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)

有人可以启发我这个吗?

Kee*_*nle 3

正如我们从 Swift 函数文档中了解到的,foobar是参数的外部名称aString。因此从技术上讲,他具有完全相同的函数,只是参数名称不同,这在 Objective-C 中是完全合法的:

id<MyProtocol> myVar;
[myVar myProtocolWithBar:@""];
[myVar myProtocolWithFoo:@""];
Run Code Online (Sandbox Code Playgroud)

我认为这是 Swift 编译器的一个错误!提交报告: http: //bugreport.apple.com

  • 如果我在类中实现这两种协议方法,一切都会正常 - 问题发生在“可选”上:如果我只实现这两种协议方法之一,理论上这应该是合法的,因为它们是可选的。我想我会提交一份报告,谢谢您的链接! (4认同)