web-dev-qa-db-fra.com

La classe n'a pas d'initialiseurs: Swift Error

J'ai un problème avec mon ViewController.

Mon code contient une erreur sur les initialiseurs et je ne comprends pas pourquoi.

S'il vous plaît, prenez un moment pour regarder mon code:

import UIKit

class ViewController: UIViewController, UITableViewDataSource {

let sectionsTableIdentifier = "SectionsTableIdentifier"

var names: [String: [String]]!
var keys: [String]!

@IBOutlet weak var tableView: UITableView!

var searchController: UISearchController

//methods
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: sectionsTableIdentifier)

    let path = NSBundle.mainBundle().pathForResource("sortednames", ofType: "plist")

    let namesDict = NSDictionary(contentsOfFile: path!)
    names = namesDict as! [String: [String]]
    keys = namesDict!.allKeys as! [String]
    keys = keys.sort()

    let resultsController = SearchResultsController()

    resultsController.names = names
    resultsController.keys = keys
    searchController = UISearchController(searchResultsController: resultsController)

    let searchBar = searchController.searchBar
    searchBar.scopeButtonTitles = ["All", "Short", "Long"]
    searchBar.placeholder = "Enter a search term"

    searchBar.sizeToFit()
    tableView.tableHeaderView = searchBar
    searchController.searchResultsUpdater = resultsController

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return keys.count
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let key = keys[section]
    let nameSection = names[key]!
    return nameSection.count
}

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return keys[section]
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(sectionsTableIdentifier, forIndexPath: indexPath) as UITableViewCell

    let key = keys[indexPath.section]
    let nameSection = names[key]!
    cell.textLabel!.text = nameSection[indexPath.row]

    return cell
}

func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {


       return keys
    }

}

Quel est le problème? L'erreur est que la classe n'a pas d'initialiseur. Je n'ai aucune variable sans valeur.

17
iGermanos

La ligne problématique est

var searchController: UISearchController

Changez-le en

var searchController: UISearchController!

ou si vous ne l'initialisez pas dans les cycles de vie d'affichage, utilisez facultatif pour éviter les plantages:

var searchController: UISearchController?
36
Sahil Kapoor

Votre ligne qui détecte l'erreur est:

var searchController: UISearchController

car vous n'avez jamais lancé searchController dans un fonction init LifeCycle à partir de votre UIViewController. Je vous conseille pour ne pas forcer le déballage le var (comme Sahil l'a dit ci-dessus) mais pour l'initier correctement dans une fonction init comme ceci:

override init(frame: CGRect) {
    super.init(frame: frame)

    setUp()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    setUp()
}

func setUp() {
    searchController = UISearchController() //Or any init you can use to perform some custom initialization
}

Dans Swift, vous devez toujours éviter de forcer le déballage d'objet comme ci-dessus, pour éviter un plantage dans votre application, ou utiliser le modèle if-Let/Guard-Let

Vive la France

2
jlngdt