【问题标题】:Swift: Strange downcasting failure斯威夫特:奇怪的向下转换失败
【发布时间】:2016-03-08 14:02:51
【问题描述】:

我有一个非常奇怪的失败案例,我无法理解。

我在两个UITableViewControllers 中有几乎相同的代码。 ProjectTableViewController显示Project的列表,其数据源为[Project]NewsfeedsTableViewController 显示Newsfeed 的列表,但Newsfeed 可以包含不同类型的源数据,包括Project

根据源数据的类型,NewsfeedsTableViewController 的每个单元格都向下转换为UITableViewCell 的适当子类。

ProjectTableViewCellUITableViewCell 的子类,用于ProjectTableViewControllerNewsfeedsTableViewController

现在有趣的是,代码在ProjectTableViewController 中没有问题,但在NewsfeedsTableViewController 中崩溃,并给出以下错误消息:

Could not cast value of type 'UITableViewCell' (0x102e68128) to 'sample_app.ProjectTableViewCell' (0x1010ce6d0).

我在每个班级都有以下代码:

ProjectTableViewController.swift

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let project = projects[indexPath.row]
    let cell = tableView.dequeueReusableCellWithIdentifier("ProjectTableViewCell") as! ProjectTableViewCell

    cell.projectTitle.text = project.title
    cell.projectKeywords.text = project.keywords

    return cell
}


NewsfeedsTableViewController.swift

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let newsfeed = self.newsfeeds[indexPath.row]
    switch newsfeed.newsfeedableType {
    case "Project":
        let cell = tableView.dequeueReusableCellWithIdentifier("NewsfeedTableViewCell") as! ProjectTableViewCell
        let source = newsfeed.newsfeedable as! Project
        cell.projectTitle.text = source.title
        cell.projectKeywords.text = source.keywords
        return cell

    default:
        let cell = tableView.dequeueReusableCellWithIdentifier("NewsfeedTableViewCell")!
        cell.textLabel!.text = newsfeed.newsfeedableType + String(newsfeed.id)
        return cell
    }
}

我很想了解导致此问题的原因。

【问题讨论】:

标签: ios swift


【解决方案1】:

通过将ProjectTableViewCell 的另一个原型单元格添加到NewsfeedsTableViewController,并使用它以Project 作为源来显示Newsfeed,解决了这个问题。

这意味着我必须为所有源数据类型添加原型单元,然后在情节提要上配置它们。我不期待这样做。

我以为我可以通过这一切来躲避打字,但我猜 Swift 不是那样工作的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多