我刚刚遇到了一个在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' ' ...'
它只是提供交换方法的签名到第二个。 虽然如果你实施这两种方法,所有问题都将被抛弃!
有人知道如何解决这个问题吗?提前谢谢!
答案 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
}
}