gpt4 book ai didi

ios - swift 继承协议(protocol)方法重写

转载 作者:行者123 更新时间:2023-11-29 01:11:37 25 4
gpt4 key购买 nike

我希望这会起作用:

protocol Foo : UITableViewDelegate{
}

extension Foo{
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print("ROW:\(indexPath.row)")
}
}

class MyVC : UITableViewController, Foo{
//...
}

不幸的是,该方法没有被调用。我错过了什么,还是这真的不可能?

此外,没有编译器警告/错误,只是没有调用该方法,有些人可能认为这是一个错误。

最佳答案

我认为这是因为您继承自 UITableViewController,它已经实现了 UITableViewDelegate

你可以很容易地测试这个:

class MyVC: UITableViewController {
func tableView(tableView tv: UITableView,
didSelectRowAtIndexPath ip: NSIndexPath) {}
}

这将导致

error: overriding declaration requires an 'override' keyword

编译器假定该方法已经在直接继承链中实现。因此,不会选择协议(protocol)中的默认方法。

话虽如此,下面的变体也不起作用。将 @objc 添加到协议(protocol)中会使我的 swiftc 段错误 ...:

import UIKit

protocol Foo : UITableViewDelegate {
func tableView(tableView: UITableView, didSelectRowAtIndexPath: NSIndexPath)
}

extension Foo {

func tableView(tableView: UITableView,
didSelectRowAtIndexPath _: NSIndexPath)
{
print("abcXXX")
}

}

class ViewController: UIViewController, UITableViewDataSource, Foo {

override func loadView() {
self.view = UITableView(frame: CGRect())
}

var tableView : UITableView { return self.view as! UITableView }

override func viewDidLoad() {
super.viewDidLoad()

self.tableView.delegate = self
self.tableView.dataSource = self
self.tableView.registerClass(UITableViewCell.self,
forCellReuseIdentifier: "MyCell1")
}

func tableView(tableView: UITableView, numberOfRowsInSection _: Int) -> Int {
return 3
}

func tableView(tableView: UITableView, cellForRowAtIndexPath ip: NSIndexPath)
-> UITableViewCell
{
let cell = tableView
.dequeueReusableCellWithIdentifier("MyCell1", forIndexPath: ip)
cell.textLabel?.text = "p[\(ip.row)]"
return cell
}
}

因此我认为我的答案只有 50% 是正确的。大概协议(protocol)扩展只适用于静态绑定(bind)上下文,这不包括 ObjC 协议(protocol)?

更新:这似乎是正确的答案:Protocol-Oriented Programming with UIKit .本质:

What we CAN'T do: Provide default implementations for Objective-C protocols.

关于ios - swift 继承协议(protocol)方法重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35686636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com