您可以通过特定功能将Swift 3 String的内容转换为类型吗?我将举一个例子:
我已经声明了多个UITableViewCell类,如下所示:
class ScrollFeedCell : UITableViewCell {...}
class AdCell : UITableViewCell {...}
class MovieCell : UITableViewCell {...}
我想在视图控制器中声明转换函数,如下所示:
func convert(String) -> Any {}
然后我想使用以下内容:
class TableView : UITableViewController {
let typeArray = [String]
override func viewDidLoad() {
//add a huge ton of strings into the typeArray
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = UITableViewCell()
let c = typeArray[indexPath.section]
if c == "ScrollFeddCell" || c == "AdCell" || c == "MovieCell" {
cell = tableView.dequeueReusableCell(withIdentifier: content[indexPath.section], for: indexPath) as! convert(c)
} else {
cell = tableView.dequeueReusableCell(withIdentifier: "CategoryScrollFeed_Cell", for: indexPath)
}
return cell
}
}
答案 0 :(得分:3)
我不认为这是可能的。即使它在某种程度上是可能的,我认为这将涉及许多肮脏的伎俩,在这种情况下并不值得。
事实上,您使用虚构convert
方法的唯一地方就是:
cell = tableView.dequeueReusableCell(withIdentifier:
content[indexPath.section], for: indexPath) as! convert(c)
^^^^^^^^^^
为什么要将其转换为正确的类型?由于这是非常动态的,编译器无法知道convert
返回的类型的成员。基本上,太有活力了。在这里将它强制转换为正确的类型是没有用的。
封闭方法无论如何都会返回UITableViewCell
,因此您可以在没有编译器抱怨的情况下返回dequeueResuableCell
的返回值。
“但我希望在将它出列后将其配置为......”你可能会说。
那么,您将以与ScrollFeedCell
不同的方式配置MovieCell
,对吧?因此,您不能只在此行之后编写所有配置代码:
cell = tableView.dequeueReusableCell(withIdentifier:
content[indexPath.section], for: indexPath) as! convert(c)
您仍然需要编写if语句并检查该单元格是MovieCell
,ScrollFeedCell
还是AdCell
。那么为什么不删除上面的行而是这样做:
if c == "ScrollFeedCell" {
let scrollFeedCell = tableView.dequeueReusableCell(withIdentifier:
content[indexPath.section], for: indexPath) as! ScrollFeedCell
// configure cell here
cell = scrollFeedCell
} else if c == "AdCell" {
let adCell = tableView.dequeueReusableCell(withIdentifier:
content[indexPath.section], for: indexPath) as! AdCell
// configure cell here
cell = adCell
} else if c == "MovieCell" {
let movieCell = tableView.dequeueReusableCell(withIdentifier:
content[indexPath.section], for: indexPath) as! MovieCell
// configure cell here
cell = movieCell
} else {
cell = tableView.dequeueReusableCell(withIdentifier: "CategoryScrollFeed_Cell", for: indexPath)
}
编辑:
试试这个:
if c == "ScrollFeedCell" {
let scrollFeedCell = tableView.dequeueReusableCell(withIdentifier:
content[indexPath.section], for: indexPath) as! ScrollFeedCell
scrollFeedCell.delegate = self
cell = scrollFeedCell
} else if c == "AdCell" || c == "MovieCell" { // add your other cell types here.
cell = tableView.dequeueReusableCell(withIdentifier:
content[indexPath.section], for: indexPath)
} else {
cell = tableView.dequeueReusableCell(withIdentifier: "CategoryScrollFeed_Cell", for: indexPath)
}
答案 1 :(得分:0)
请考虑您要做的事情是否必要。为什么要将它们转换为特定的细胞类型?只需将单元格保存为UITableViewCell并将其返回即可。如果您对不同的单元格有特定的操作,则应将if
个案分开:
if c == "ScrollFeddCell" {
cell = tableView.dequeueReusableCell(withIdentifier: c, for: indexPath) as! ScrollFeddCell
//cell.doSomethingForScorll()
}
else {
cell = tableView.dequeueReusableCell(withIdentifier: c, for: indexPath)
//do nothing for common cells.
}
//....
答案 2 :(得分:0)
有点晚了,但是对于那些寻找答案的人来说
我知道您想要什么,我同意您的需要。 在我的情况下,我需要这样做,因为在我的应用程序中,我不仅从服务器接收数据,而且还要在单元内布置此类数据的布局。到目前为止,我还没有找到解决方案。就您而言,这似乎容易一些:
// 1. Create a protocol with the configuring method
protocol configureCellProtocol
{
func configure(cell:MyData)
}
// 2. Add this protocol to the 8 classes derived from UITableViewCell that define your cells
// 3. Cast the reusable cell to this protocol: (note that you have to do a double cast,
// both to configureCellProtocol and UITableViewCell, (that's what the & is for) otherwise,
// you won't be able to return the configured cell
let thisCell=tableView.dequeReusableCell(
withReuseIdentifier: cellClass, for: indexPath) as! UITableViewCell & configureCellProtocol
// 4. then you can call the method like this:
thisCell.configure(cell:configurationData)
// which in turn will call the specific method in each class. Then you have to define the configure
// method in each class, otherwise you'll get a crash at runtime. Do what you need to configure
// your cells in each class in this method
//
在步骤3中,cellClass是一个String,这又是您注册的类名称。对于您而言,您必须根据使每个单元格不同的条件从数组中选择它