swift UITableViewCell,协议问题

时间:2017-04-19 06:04:21

标签: ios iphone swift uitableview swift-protocols

我有一个协议

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

1 个答案:

答案 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。