Условное связывание: если ошибка - инициализатор для условного привязки должен иметь необязательный тип

Я пытаюсь удалить строку из моего источника данных и следующую строку кода:

if let tv = tableView {

вызывает следующую ошибку:

Инициализатор условной привязки должен иметь необязательный тип, а не UITableView

Вот полный код:

// Override to support editing the table view.
func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {

        // Delete the row from the data source

    if let tv = tableView {

            myData.removeAtIndex(indexPath.row)

            tv.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

Как мне исправить следующее?

 if let tv = tableView {

Ответ 1

if let/if var необязательная привязка работает только тогда, когда результат правой части выражения является необязательным. Если результат правой стороны не является необязательным, вы не можете использовать эту необязательную привязку. Точкой этого необязательного связывания является проверка на nil и использование этой переменной только в том случае, если она не nil.

В вашем случае параметр tableView объявляется как необязательный тип UITableView. Он никогда не будет nil. Поэтому необязательное связывание здесь не требуется.

func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        // Delete the row from the data source
        myData.removeAtIndex(indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

Все, что нам нужно сделать, это избавиться от if let и изменить любые вхождения tv внутри него только на tableView.

Ответ 2

для моей конкретной проблемы я должен был заменить

if let count = 1
    {
        // do something ...
    }

С

let count = 1
if(count > 0)
    {
        // do something ...
    }

Ответ 3

То же самое относится к операторам guard. Такое же сообщение об ошибке привело меня к этому сообщению и ответу (спасибо @nhgrif).

Код: печать фамилии лица только в том случае, если среднее имя меньше четырех символов.

func greetByMiddleName(name: (first: String, middle: String?, last: String?)) {
guard let Name = name.last where name.middle?.characters.count < 4 else {
    print("Hi there)")
    return
}
print("Hey \(Name)!")

}

Пока я не объявлял last как необязательный параметр, я видел ту же ошибку.

Ответ 4

обязательная привязка должна иметь тип optinal, который означает, что вы можете связывать только необязательные значения, если оператор let

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {

        // Delete the row from the data source

        if let tv = tableView as UITableView? {


        }
    }
}

Это будет работать нормально, но убедитесь, что, когда вы используете, если он должен иметь оптический тип "?"

Ответ 5

В случае, когда вы используете пользовательский тип ячейки, скажем, ArticleCell, вы можете получить сообщение об ошибке:

    Initializer for conditional binding must have Optional type, not 'ArticleCell'

Вы получите эту ошибку, если ваша строка кода выглядит примерно так:

    if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as! ArticleCell 

Вы можете исправить эту ошибку, выполнив следующие действия:

    if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as ArticleCell?

Если вы проверите вышеописанное, вы увидите, что последний использует опциональное литье для ячейки типа ArticleCell.