Условно-обязательным: если допустим ошибку – инициализатора для условной привязки, должны иметь дополнительный тип
Я пытаюсь удалить строку из моего источника данных и следующую строку кода:
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 {
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