2015-03-24 3 views

ответ

4

Используя var contacts: [Person]!, вы фактически не инициализируете массив Person.

var contacts: [Person]! // contacts still nil 
var contacts = [Person]() // Person array with 0 objects 

Если вы используете () вместо инициализации пустого Person массива.

0

Оператор: не объявляя, его просто сказать, какой тип переменной является

Оператор = как в любом другом языке декларантом оператора, который в этом случае сопровождаемый(), который в этом случае объявлен новый массив Person.

+0

«Оператор = это ... оператор объявления». '=' Ничего не объявляет. Он присваивает значение lhs. Это 'var', который объявляет. –

+0

Это правда, мне нужно практиковать мою терминологию – Arbitur

1

Объявления переменных в Swift принимает следующий вид:

var name: Type = initialValue 

То есть, вы объявляете переменную name некоторых Type, и установить его в initialValue.

Существует много сокращенных форм, поэтому вы увидите различные альтернативы. Тот, который вы видите чаще всего, покидает часть Type. Если да, то тип name «выведен» из initialValue.

Это то, что происходит с var contacts = [Person](). Тип: Array от Person. () вызывает инициализатор (т. Е. Создает массив).

В качестве альтернативы вы можете объявить переменную с типом, но не дать ей начальное значение. Но компилятор не позволит вам использовать его, пока вам не будет гарантировано установить его с начальным значением. Например, вы можете написать var contacts: [Person], а затем contacts = [Person]().

Когда вы пишете var contacts: [Person]! с !, вы объявляете переменную типа Optional<[Person]> - то есть тип, который может быть либо nil или содержать массив. В отличие от обычных массивов, опции массивов имеют значение по умолчанию, если вы не инициализируете их. Значение по умолчанию: nil - то есть, что необязательно не содержит массив.

Но ! (вместо более распространенного ?) означает, что он объявлен как особый вид необязательного, называемый «неявно-разворачиваемый необязательный», то есть необязательный, когда вы используете его определенным образом , будет действовать так, как если бы он не является опционально. Большой недостаток этого в том, что он позволит вам использовать его, как если бы он не был необязательным. Но если вы это сделаете, и это nil, то ваша программа потерпит крах. Поэтому, прежде чем кто-либо будет использовать contacts, его необходимо будет инициализировать (например, с помощью contacts = [Person]() или назначить ему какой-либо существующий массив)

По этой причине лучше не использовать эти неявно-развернутые дополнительные опции, за исключением особых обстоятельств. Иногда им кажется, что они удобны, но они, как правило, не самый лучший вариант, поскольку они опасны.

0

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

var contacts: [Person]! //implicitly unwrapped optional. #1 
var contacts = [Person]() //array initialization. #2 

Я использую # 1, когда создаю переменную, которая не будет инициализирована собственным классом. Эта ситуация возникает, когда я реализую подробное представление, которое принимает информацию, передаваемую другим контроллером.

Для # 2 используйте, если вы хотите инициализировать новый пустой массив.