有没有办法重载协议中的方法?
Is there a way to overload a method in a protocol?
我想扩展我一直用来接受两种不同类型作为第二个参数的委托的功能。当我尝试添加重载方法时,出现两个错误:
所以我的问题是,有没有办法重载 swift 协议中的方法以允许不同的参数?
错误 1
Type 'ViewController' does not conform to protocol 'myCellDelegate'
错误 2
Cannot assign a value of type 'ViewController' to a value of type 'myCellDelegate?'
myCellDelegate.swift
protocol myCellDelegate {
func didChangeState(# sender: SettingCell, isOn: Bool)
func didChangeState(# sender: SettingCell, time: Int) // error
}
(在ViewController.Swift)
class ViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate, myCellDelegate {
cellForRowAtIndexPath
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("CustomSettingCell") as! SettingCell
let section = sectionNames[0]
let logItem = logItems[indexPath.row]
cell.settingsLabel?.text = logItem.settingLabel
cell.settingsSwitch.on = logItem.switchState
cell.cellDelegate = self
return cell
}
用法
func didChangeState(#sender: SettingCell, isOn: Bool) {
...
}
直接的答案是 是 有一种方法可以重载协议中的方法,如果我只听错误消息,我几乎就在那里。
我只是忘了在 ViewController 中实现该方法。虽然现在对我来说很明显,但当时对我来说并不明显,因为方法名称相同。
所以最终的代码应该是这样的:
myCellDelegate.swift
protocol myCellDelegate {
func didChangeState(# sender: SettingCell, isOn: Bool)
func didChangeState(# sender: SettingCell, time: Int)
}
ViewController.swift
class ViewController: UITableViewController, UITableViewDelegate, myCellDelegate {
func didChangeState(#sender: SettingCell, isOn: Bool) {
...
}
func didChangeState(#sender: SettingCell, time: Int) {
...
}
}
正如@woodstock 在 OP 中建议的那样,现在可能是使用泛型类型而不是重载方法的好时机。
我想扩展我一直用来接受两种不同类型作为第二个参数的委托的功能。当我尝试添加重载方法时,出现两个错误:
所以我的问题是,有没有办法重载 swift 协议中的方法以允许不同的参数?
错误 1
Type 'ViewController' does not conform to protocol 'myCellDelegate'
错误 2
Cannot assign a value of type 'ViewController' to a value of type 'myCellDelegate?'
myCellDelegate.swift
protocol myCellDelegate {
func didChangeState(# sender: SettingCell, isOn: Bool)
func didChangeState(# sender: SettingCell, time: Int) // error
}
(在ViewController.Swift)
class ViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate, myCellDelegate {
cellForRowAtIndexPath
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("CustomSettingCell") as! SettingCell
let section = sectionNames[0]
let logItem = logItems[indexPath.row]
cell.settingsLabel?.text = logItem.settingLabel
cell.settingsSwitch.on = logItem.switchState
cell.cellDelegate = self
return cell
}
用法
func didChangeState(#sender: SettingCell, isOn: Bool) {
...
}
直接的答案是 是 有一种方法可以重载协议中的方法,如果我只听错误消息,我几乎就在那里。
我只是忘了在 ViewController 中实现该方法。虽然现在对我来说很明显,但当时对我来说并不明显,因为方法名称相同。
所以最终的代码应该是这样的:
myCellDelegate.swift
protocol myCellDelegate {
func didChangeState(# sender: SettingCell, isOn: Bool)
func didChangeState(# sender: SettingCell, time: Int)
}
ViewController.swift
class ViewController: UITableViewController, UITableViewDelegate, myCellDelegate {
func didChangeState(#sender: SettingCell, isOn: Bool) {
...
}
func didChangeState(#sender: SettingCell, time: Int) {
...
}
}
正如@woodstock 在 OP 中建议的那样,现在可能是使用泛型类型而不是重载方法的好时机。