2016-12-11 2 views
2

У меня проблема с моим кодом, я думаю, что проблемы появились после того, как я изменил синтаксис на новую быструю версию.Значение дополнительного типа 'NSIndexPath?' не разворачивается; вы хотели использовать '!' или '?'?

import UIKit 

class FirstTableViewController: UITableViewController { 

    var FirstTableArray = [String]() 
    var passThisArray = [String]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // This array will display on your tableviewcell. 
     FirstTableArray = [lib1] 

     //You can pass element of this array 
     passThisArray = ["1. Fi "] 

    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return FirstTableArray.count 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 


     let Cell = self.tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 

     Cell.textLabel?.text = passThisArray[(indexPath as NSIndexPath).row] 

     return Cell 

    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if(segue.identifier == "detailView") { 
      let vc = segue.destination as! ViewController 

      //Get the Index of selected Cell 
      let indexPath : IndexPath = self.tableView.indexPathForSelectedRow! 

      //assign string to next view controller instance from selected cell. 
      vc.FirstString = FirstTableArray[(indexPath as NSIndexPath).row] 
     } 
    } 
} 

На этой линии он дает мне 2 ошибки: '? NSIndexPath'

let indexPath : IndexPath = self.tableView.indexPathForSelectedRow! 

1.Value дополнительного типа не разворачивается; вы хотели использовать '!' или '?'? 2. Неправильное использование '()' для вызова значения нефункционного типа 'NSIndexPath?'

Thankyou.

ответ

1

Проблема заключается в том, что нет гарантии, что пользователь выбрал строку, поэтому ваш вызов indexPathForSelectedRow является необязательным (может иметь или не иметь значения).

Способ улучшения этого метода состоит в том, чтобы использовать инструкцию охраны для безопасного разворачивания двух необязательных значений, которые у вас есть в этом методе. В случае, если один из них не установлен (ноль), метод безопасно выйдет без сбоя вашего приложения.

Одним из преимуществ использования охраны над подходом if let ... является то, что вы можете избежать пирамиды обречения. Используя ваш пример, для выполнения конечной команды, где вы назначаете строку, потребуется три отступа, что затрудняет чтение вашего кода. В заявлении охраны явно говорится: «Если это значение терпит неудачу, защитите от сбоев».

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if(segue.identifier == "detailView") { 
     guard let vc = segue.destination as? ViewController else { 
      return 
     } 

     //Get the Index of selected Cell 
     guard let indexPath = self.tableView.indexPathForSelectedRow else { 
      return 
     } 

     //assign string to next view controller instance from selected cell. 
     vc.FirstString = FirstTableArray[(indexPath as NSIndexPath).row] 
    } 
} 

Кроме того, два небольших размышления код стиля:

  • Вам не нужно использовать: NSIndexPath при назначении на indexPath. Компилятор может определить тип для вас
  • При объявлении переменных, IOS конвенции является использование верблюжьего, поэтому в то время как переменная indexPath хорошо, вы должны изменить FirstString к firstString
+0

большое спасибо, да охранник утверждение было решением. –

+0

Также большое спасибо за рекомендации, да, я знаю о camelCase, но в этом случае я думаю, что я следовал учебнику. –

+0

@BeSar Нет проблем, рад, что теперь он работает – CodeBender

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

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