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



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



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 {
448   5  

5 ответов:

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.

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

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

С

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

то же самое относится и к гвардии заявления. То же сообщение об ошибке приведет меня к этому сообщению и ответу (спасибо @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)!")

}

пока я не объявил последние в качестве дополнительного параметра я видел ту же ошибку.

в случае, когда вы используете пользовательский тип ячейки, скажем 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.

привязка условий должна иметь тип 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? {


        }
    }
}

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

Comments

    Ничего не найдено.