Swift中的方法签名处理

时间:2014-12-14 19:11:31

标签: swift ios8

我刚刚遇到了一个在Swift中使用协议的非常奇怪的问题。问题在于处理方法的签名。我们说我们有2种方法'在我们的协议中声明,然后它们两者可能最终是相同的。为了避免存在2个相同的方法或它们的声明,Swift编译器在编译程序时将其检出,但它的工作原理很奇怪。

现在让我们来看看代码。 我的协议。

@objc
protocol MyProtocol {
    optional func MyProtocol(data: Data, numberOfDays calendar: Calendar) -> Int
    optional func MyProtocol(data: Data, numberOfWeeks calendar: Calendar) -> Int
}

现在因为这两种方法都是可选的,所以我们只实现其中一种方法。

class CalendarView: UIView, MyProtocol {
    func MyProtocol(data: Data, numberOfDays calendar: Calendar) -> Int {
        return 31
    }
}

它应该有效,但事实上并非如此。编译说:

  

方法' ...'具有不同的参数名称   protocol' MyProtocol' ' ...'

它只是提供交换方法的签名到第二个。 虽然如果你实施这两种方法,所有问题都将被抛弃!

有人知道如何解决这个问题吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果您停止调用MyProtocol函数,问题就会消失。

(您的数据或日历类型存在问题或错误。)

我用真实类型的NSData和NSCalendar替换了你的数据和日历类型,用你的f替换了古怪的MyProtocol函数名,它编译得很好:

@objc
protocol MyProtocol {
    optional func f(data: NSData, numberOfDays calendar: NSCalendar) -> Int
    optional func f(data: NSData, numberOfWeeks calendar: NSCalendar) -> Int
}

class CalendarView: UIView, MyProtocol {
    func f(data: NSData, numberOfDays calendar: NSCalendar) -> Int {
        return 31
    }
}