斯威夫特:奇怪的向下转换失败
Posted
技术标签:
【中文标题】斯威夫特:奇怪的向下转换失败【英文标题】:Swift: Strange downcasting failure 【发布时间】:2016-03-08 14:02:51 【问题描述】:我有一个非常奇怪的失败案例,我无法理解。
我在两个UITableViewController
s 中有几乎相同的代码。 ProjectTableViewController
显示Project
的列表,其数据源为[Project]
。 NewsfeedsTableViewController
显示Newsfeed
的列表,但Newsfeed
可以包含不同类型的源数据,包括Project
。
根据源数据的类型,NewsfeedsTableViewController
的每个单元格都向下转换为UITableViewCell
的适当子类。
ProjectTableViewCell
是UITableViewCell
的子类,用于ProjectTableViewController
和NewsfeedsTableViewController
。
现在有趣的是,代码在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
我很想了解导致此问题的原因。
【问题讨论】:
***.com/questions/30429269/… 或 ***.com/questions/29812168/… 会帮到你 @ViralSavaj 谢谢!这些链接让我再次查看故事板......问题就在那里! 【参考方案1】:通过将ProjectTableViewCell
的另一个原型单元格添加到NewsfeedsTableViewController
,并使用它以Project
作为源来显示Newsfeed
,解决了这个问题。
这意味着我必须为所有源数据类型添加原型单元,然后在情节提要上配置它们。我不期待这样做。
我以为我可以通过这一切来躲避打字,但我猜 Swift 不是那样工作的。
【讨论】:
以上是关于斯威夫特:奇怪的向下转换失败的主要内容,如果未能解决你的问题,请参考以下文章
如何在字典数组中转换 FIRDataSnapshot?斯威夫特 3
斯威夫特 - UITableViewCell?不能转换为 UITableViewCell
精灵包 |斯威夫特 3 | - 无法将 Void 类型的值(aka'()' 转换为预期的参数类型 'unsafeRawPointer'