避免过度!在Swift函数中使用(cellForRowAtIndexPath)

时间:2016-05-04 14:04:26

标签: swift

简单地说:我如何避免在下面的Swift代码中为每一行编写!?我考虑了guard,但UITableViewCell初始化 可以返回nil,但另一方面cellForRowAtIndexPath 必须返回非零,这似乎是矛盾本身。希望有一种短暂而甜蜜的方式。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier)
    if cell == nil {
        cell = UITableViewCell(style: .Default, reuseIdentifier: reuseIdentifier)
    }
    cell!.textLabel?.text = ...
    cell!.textLabel?.textColor = ...
    cell!.detailTextLabel?.textColor = ...
    cell!.detailTextLabel?.textColor = ...
    return cell!
}

3 个答案:

答案 0 :(得分:5)

??运算符理解如果rhs不是可选的,那么结果不是可选的:

let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier)
    ?? UITableViewCell(style: .Default, reuseIdentifier: reuseIdentifier)
cell.textLabel?.text = ...  // No ! needed

更好的是,如果您注册了您的单元格标识符(在故事板中或使用registerNib / registerClass方法),那么您可以使用更新的dequeueReusableCellWithIdentifier形式返回一个可选的:

let cell = tableView.dequeueReusableCellWithIdentifier("repo", forIndexPath: indexPath)
cell.textLabel?.text = ...  // No ! needed

答案 1 :(得分:2)

让我直接从UITableView公共API粘贴一些内容:

    public func dequeueReusableCellWithIdentifier(identifier: String, forIndexPath indexPath: NSIndexPath) -> UITableViewCell 
// newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered

查看上面的方法,它保证返回正确的单元格,因此返回类型不是可选的,可以避免强行展开。

答案 2 :(得分:-1)

您也可以这样编码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier)! 
    cell.textLabel?.text = ...
    cell.textLabel?.textColor = ...
    cell.detailTextLabel?.textColor = ...
    cell.detailTextLabel?.textColor = ...
    return cell
}