Проблема в том, что вы пытаетесь принудительно привести объект, инициализированный через родительский класс, в дочерний класс, это невозможно, и вы можете убедиться, что у вас есть условные операторы для всех случаев, т.е.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if(tableview == a){
//This is a conditional statement
}
else if(tableview == b){
//This is a conditional statement
}
else{
//This is a conditional statement
}
//no need to return anything here as your conditional operators are handling all return //cases
}
и в каждом условном операторе объявите и инициализируйте свой уникальный тип ячейки и верните его, например.
let cell : CellType = tableView.dequeueReusableCell(withIdentifier: "CellType", for: indexPath) as! CellType;
return cell;