我有一个协议
protocol AttibuteValueCellProtocol {
func set(attribute: String, value: String)
}
在我的tableView的数据源方法中,我希望我的单元格能够确认此协议。在objective-c中,我可以这样做,但在SWIFT中,当我尝试使用as? UITableViewCell<AttibuteValueCellProtocol>
时,它会出错。在Objective-C中,如果我这样做((UITableViewCell<AttibuteValueCellProtocol> *)cell
)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? UITableViewCell<AttibuteValueCellProtocol>
}
我可以用什么替换它?
P.S。 错误看起来像http://take.ms/OHRA3
我不需要扩展,因为当我deque cell时,它将是CustomCell(和CustomCell符合协议),但是这个类可以使用不同的单元格标识符,所以这个类不应该&# 39;了解单元类名称并不是每个单元都符合AttibuteValueCellProtocol,这个类必须知道我们有符合协议的单元格AttibuteValueCellProtocol
我是Objective-C我可以做到并且它会编译(我知道它不会起作用,因为view1不符合协议,但它很容易创建正确的视图,它会工作,这里我举一个例子):
#import "TestViewController.h"
@interface TestViewController ()
@end
@protocol TestProtocol <NSObject>
- (void)testMethod;
@end
@implementation TestViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
UIView *view1 = [[UIView alloc] init];
UIView *viewForProtocolJustToShow = (UIView<TestProtocol> *)view1;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
答案 0 :(得分:2)
问题
如错误所示,UITableViewCell
不是通用类型。使用此语法,您将使用设置通用对象的类型来混淆符合协议。
解决方案1:扩展程序
要获得符合UITableViewCell
的{{1}},您可以使用扩展程序:
AttibuteValueCellProtocol
你必须实现extension UITableViewCell: AttibuteValueCellProtocol {
// implementation of AttibuteValueCellProtocol requirements goes here
}
方法,因为Swift(和Objective-C)无法知道如何定义它们。
解决方案2:子类
如果你不总是想要那些额外的方法,扩展整个AttibuteValueCellProtocol
类可能会产生一些奇怪的副作用。您也可以将UITableViewCell
子类化并在那里实现UITableViewCell
协议:
AttibuteValueCellProtocol
然后,你可以这样做:
class MyTableViewCell: UITableViewCell, AttibuteValueCellProtocol {
// implementation of AttibuteValueCellProtocol requirements goes here
}
解决方案3:协议
您还可以检查返回的func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? MyTableViewCell
}
是否符合特定协议:
UITableViewCell
请注意,如果单元格不符合,则会将单元格设置为nil。