将UITableViewCell转换为其子类的Swifty方法是什么?

时间:2016-09-23 15:35:23

标签: swift

我正在尝试在调用dequeueReusableCellWithIdentifier时将UITableViewCell强制转换为其子类。这就是我现在怎么做的:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let dogs = DBManager.getAllDogs()
    let dog = dogs[indexPath.row]

    let cell = tableView.dequeueReusableCellWithIdentifier(Constants.dogViewCellReuseIdentifier,
                                                           forIndexPath: indexPath) as! DogViewCell

    cell.configureWithDog(dog)

    return cell
}

然而,这种方法使用了丑陋的强制演员。所以我提出了这种方法,而不是Swifty:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let dogs = DBManager.getAllDogs()
    let dog = dogs[indexPath.row]

    if let cell = tableView.dequeueReusableCellWithIdentifier(Constants.dogViewCellReuseIdentifier,
                                                              forIndexPath: indexPath) as? DogViewCell {

        cell.configureWithDog(dog)
        return cell
    } else {
        return tableView.dequeueReusableCellWithIdentifier(Constants.dogViewCellReuseIdentifier,
                                                           forIndexPath: indexPath)
    }

}

我不喜欢这种方法,因为我正在编写更多代码以避免使用'!'强制展开可选演员。

这样做的正确和优雅方式是什么?

1 个答案:

答案 0 :(得分:2)

问问自己:你是否宁愿在开发过程中崩溃,在确切的线路上告诉你问题在哪里,或者有些奇怪的行为,看起来有些奇怪,但你还不清楚为什么。

在您的问题中,如果您错误地配置了单元格或情节提要,那么您只会崩溃。这不是用户或Web服务会为您搞砸的事情。

使用!,进行一些测试,以便您知道自己没有搞砸配置。当你搞砸了开发过程中的崩溃是有用的