Подтвердить что ты не робот

Почему шаблон Swift UITableViewController использует аргументы опций в методе tableView cellForRowAtIndexPath?

Если вы создаете новый класс UITableViewController, вы увидите комментарий для переопределения:

/*
override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? {
    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)

    // Configure the cell...

    return cell
}
*/

Вы можете использовать метод uncomment, и он не будет работать из-за ошибки

'UITableView?' does not have a member named 'dequeueReusableCellWithIdentifier'

Причина такова: tableView определяется как необязательный тип " UITableView?", и перед вызовом метода вам необходимо развернуть таблицуView. Например, например:

let cell = tableView!.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)

Но мы можем сделать их неявно развернутыми опциями и использовать tableView без !

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)
    return cell
}

Вопрос: почему xcode определяет их как опции? Есть ли у него какие-либо причины или рекомендации против неявно развернутых опций? Можем ли мы быть уверенными в том, что этот метод всегда получает значения не-nill?

Также у нас будут другие ошибки

Constant 'cell' inferred to have type 'AnyObject!', which may be unexpected
Type 'AnyObject!' cannot be implicitly downcast to 'UITableViewCell'; did you mean to use 'as' to force downcast?

Мы можем исправить это, добавив как UITableViewCell в конец так:

let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as UITableViewCell

Я понятия не имею, почему шаблон по умолчанию не выглядит так:

/*
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as UITableViewCell //or your custom class

    // Configure the cell...

    return cell
}
*/
4b9b3361

Ответ 1

Да, это странно. Фактически, если вы удалите предоставленные шаблоном методы и начнете вводить каждый из них, автозаполнение Xcode предложит методы с неявно развернутыми необязательными аргументами, такими как

tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!

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

Подробнее о обсуждении см. этот вопрос.

Ответ 2

На самом деле это правильный способ использования метода делегата.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("CELL_ID", forIndexPath: indexPath)
    cell.textLabel.text = "aaaa"
    return cell

}