Swift协议方法的奇怪行为

时间:2014-08-14 13:17:55

标签: swift protocols

当使用具有相同名称和参数类型但命名参数不同的可选方法的协议时,偶然发现了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")

有人可以就此启发我吗?

1 个答案:

答案 0 :(得分:3)

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

id<MyProtocol> myVar;
[myVar myProtocolWithBar:@""];
[myVar myProtocolWithFoo:@""];

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