2015-03-31 4 views
1
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{ 
    if (segue.identifier == "segueone") 
    { 
     let cellIndexPath = self.tableView!.indexPathForCell(sender as UITableViewCell) 
     if let unwrappedCellindexPath = cellIndexPath 
     { 
      var nextVC = (segue.destinationViewController as TableTwo) 
      nextVC.items = items[unwrappedCellindexPath.row] 
     } 
    } 
} 

С помощью этого фрагмента кода у меня есть несколько вопросов относительно опций. Недавно я прочитал веб-документ разработчика Apple, а также несколько личных объяснений опций, но у меня все еще есть вопрос.Как лучше понять варианты

В любом случае,

  1. в линии

    let cellIndexPath = self.tableView!.indexPathForCell(sender as UITableViewCell) 
    

    Является ли это утверждение только считается необязательным, поскольку пользователь не может выбрать одну из ячеек в моей таблице? И с этим, так как я знаю, что, пока пользователь хочет продолжить через приложение, они должны выбрать ячейку, я могу разместить восклицательный знак, чтобы уведомить компилятор, что эта ячейка делает на деле, имеет значение (путь индекса) ?

  2. Почему восклицательный знак идти после того, как «self.tableview», а не после того, как «отправителем как UITableView) в скобках?

  3. Если мой предполагая правильно, я могу использовать синтаксис if let, потому что у меня есть опциональный в предыдущей строке кода?

ответ

0
let cellIndexPath = self.tableView!.indexPathForCell(sender as UITableViewCell) 

Использование восклицательного знака после tableView, потому что self.tableView! не могут быть установлены (это может быть nil).

Это необязательно, поскольку он имеет вариант иметь значение, и он также имеет вариант быть nil. Переменные, которые не являются необязательными, не могут быть nil, они должны иметь значение.

Восклицательный знак отправляется после tableView, потому что это необязательный вариант, который может быть nil. Если он пошел после .indexPathForCell(sender as UITableViewCell), это означает, что возвращаемое значение может быть равно нулю.

Вы можете использовать синтаксис if let из-за этого необязательно. Это вернет true, если значение может быть присвоено переменной. Например:

var myNilValue: String? 
if(let nonNilValue = myNilValue){ 
    //this will not be called 
} 

if let вернет ложь, но:

var myNonNilValue: String? = "Hello, World!" 
if(let nonNilValue = myNilValue){ 
    //this will be called 
} 

Вернется правда.

Знаки вопроса ? используются после объявлений переменных, чтобы определить, что переменная может не иметь значения, и она может никогда не иметь значения. Их нужно развернуть с помощью восклицательного знака ! после имени переменной. Это можно использовать для получения результатов из базы данных, если нет результата.

Восклицательные ! используются после объявления переменных, чтобы определить, что переменная не может иметь значение, , но это будет иметь значение, когда вам нужно получить к нему доступ. Их не нужно разворачивать, но компилятор выдает ошибку, если переменная nil во время ее доступа. Это обычно используется в @IBOutlets или @IBActions, которые не определены до тех пор, пока программа не компилирует

0
  1. Оба self.tableView и indexPathForCell() являются опциями. ударяя один, у вас есть только один дополнительный разыменовать в результате. отправитель также является необязательным и indexPa thForCell() не берет опционально, поэтому, вероятно, он тоже нуждается в ударе, но я не скомпилировал его, поэтому не могу точно сказать, что сделает компилятор.

  2. self.tableView является ссылкой на свойство, которое может быть не установлено (например, оно равно нулю), поэтому оно является необязательным. Вы можете объявить его, например, @IBOutlet с помощью! в конце, если вы знаете, что ВСЕГДА будет определено, например, из раскадровки, а затем вам не нужно будет разыгрывать его позже.

Обычной вещь, чтобы сделать:

@IBOutlet var tableView : UITableView! 

Это неявно развернутым необязательным, и выдаст ошибку, если она ссылается когда ноль. Но вам не нужно использовать! к разыменованию.

  1. Исправить. Результат строки будет необязательным, что вы можете проверить с, если позволить
+0

только для уточнения, a! помещается после самой ранней части кода, которая может считаться необязательной? –

+0

тоже, извините, если бы я включил IBOulet, о котором вы упомянули, мне бы не пришлось включать! in let cellIndexPath = self.tableView! .indexPathForCell (отправитель как UITableViewCell) –

+0

@JonGi Когда вы * объявляете * переменную, вы можете сделать ее необязательной, добавив суффикс '?'. Тогда это может быть nil, и к нему нужно получить доступ через! * если * вы используете оператор 'let', альтернативно, вы можете добавить'! ', что означает * неявно развернутые параметры *. Это тоже необязательно, что означает, что Swift допускает значение, равное нулю, но вам не нужно явно разворачивать его позже, однако, если он равен нулю при * доступе *, программа выйдет из строя. Вы объявляете неявно развернутые опционы, когда знаете, что они будут не-нильны, когда вы * получите * их значение. @IBOutlet - всего лишь один пример. – clearlight

Смежные вопросы