2015-10-22 5 views
0

Я пытаюсь преобразовать Swift 1.2 до 2.0, но у меня возникли проблемы, назначить tablviewCell форму dequeueReusableCellWithIdentifier:Необязательные ошибки Swift 1,2 до 2,0

var cell:UITableViewCell? = tableview!.dequeueReusableCellWithIdentifier(identifier as String) as? UITableViewCell; 

if (cell == nil) 
{ 
    cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: identifier as String) 
    cell?.backgroundColor = UIColor.clearColor() 
} 

Ошибка:

Downcast form UITableViewCell to UITableViewcell only unwraps optionals, did you mean to use '!'?

Я верю функ dequeueReusableCellWithIdentifier не возврат необязательно, поэтому я пробовал:

var cell:UITableViewCell = tableview.dequeueReusableCellWithIdentifier(identifier as String)  
if (cell == nil){ 
    ... 

И я получаю два Ошибки:

value of optional type tableview not unwrapped, did you mean to use! Binary operator can not be applied to operands of type UITableViewCEll and Niliretalconversion.

Любой вклад оценили

ответ

1

dequeueReusableCellWithIdentifier возвращает UITableViewCell?. Вы пытаетесь перевести его на необязательный (as? UITableViewCell), но затем назначьте это обратно на опцию (cell:UITableViewCell?). Вы не получите никакой информации из этой дополнительной работы и могли бы использовать более простое эквивалентное выражение. Ваши первоначальные предупреждения, похоже, являются результатом запутанного игнорируемого актера.

var cell:UITableViewCell? = tableview!.dequeueReusableCellWithIdentifier(identifier as String) 

Мы знаем, что тип cell здесь, так как он совпадает с типом возвращаемого dequeueReusableCellWithIdentifier, чтобы мы могли написать:

var cell = tableview!.dequeueReusableCellWithIdentifier(identifier as String) 

Я не могу сказать, что тип identifier является но as предлагает это всегда может быть успешно приведен к String, так что вы, вероятно, может дополнительно упростить:

var cell = tableview!.dequeueReusableCellWithIdentifier(identifier) 

Все это условное условие, вероятно, может быть дополнительно упрощено с помощью назначения if let или guard, но это трудно сказать точно, не зная, в каком большем контексте он называется.

1

Если вы уверены, что отливка правильно, то вы можете сделать это:

var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(identifer as String) as UITableViewCell!; 

     if (cell == nil) 
     { 
      cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: identifer as String) 
      cell?.backgroundColor = UIColor.clearColor() 
     } 

Если вы не уверены в том, что отливка будет абсолютно не ноль, вы можете сделать это:

var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(identifer as String) as? UITableViewCell?; 

Обратите внимание: не следует явно указывать тип cell в этом случае, так как Swift выведет его автоматически.

+0

Спасибо, все еще немного запутались с опциями! – dancingbush

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