2015-08-08 4 views
0

Я пытаюсь использовать переменные CoreData для большей части моего кода приложения, но не смог использовать их для имен пользовательских классов. Вот пример моего кода:Swift: Можно ли использовать переменную для имени пользовательского класса?

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> CREWWorkCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellName) as! CREWWorkCell 

Я хочу использовать строку для CREWWorkCell. Это возможно?

ответ

1

UITableViewController не имеет функции, которая возвращает CREWWorkCell, которую вы можете переопределить. Используйте значение по умолчанию UITableViewCell как возвращаемое значение, и все будет нормально работать с настраиваемыми ячейками.

В классе UITableViewController использовать следующую функцию:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // Note that the return value is UITableViewCell and not CREWWorkCell 

     //get the class name from the database and put it in a variable called myClassName. Then 

     if myClassName == "CREWWorkCell" { 
      let cell : CREWWorkCell = tableView.dequeueReusableCellWithIdentifier("cell identifier 1", forIndexPath: indexPath) as! CREWWorkCell //of course you should cast to your custom class to be able to use it 
      return cell 
     } else if myClassName == "AnotherCellClass" { 
      let cell : AnotherCellClass = tableView.dequeueReusableCellWithIdentifier("cell identifier 2", forIndexPath: indexPath) as! AnotherCellClass 
      return cell 
     } 

     //do the same if you have other custom classes etc... 

     return UITableViewCell() 
    } 

С Swift вы не можете бросить к динамическому типу (посмотрите here). Таким образом, вы не можете бросить к типу, который вы кладете в переменной, используя, например:

var myClassName = CREWWorkCell.self 

или

var myClassName = CREWWorkCell().dynamicType 

потому что myClassName будут оценены во время выполнения, другими словами, это динамический тип. Но оператор литья ожидает своей правой стороны статический тип , тип, который уже известен и не нуждается в оценке во время выполнения. Эта функция позволяет Swift обеспечивать безопасность типов.

Я бы предложил вам переосмыслить способ создания пользовательских ячеек гораздо проще.

+0

Поскольку мне нужно использовать пользовательские классы для ячеек, я не вижу, как это сделать. – PatriciaW

+0

CREWWorkCell уже является подклассом UITableViewCell. он работает просто отлично – Carpsen90

+0

Если у меня есть несколько подклассов, как я могу указать, какой из них использовать? Объекты в каждой ячейке указаны в них. – PatriciaW

Смежные вопросы