В чем отличие объявления переменных таким образом?Какая разница при объявлении этих переменных при быстром использовании! или()
var contacts: [Person]!
var contacts = [Person]()
В чем отличие объявления переменных таким образом?Какая разница при объявлении этих переменных при быстром использовании! или()
var contacts: [Person]!
var contacts = [Person]()
Используя var contacts: [Person]!
, вы фактически не инициализируете массив Person.
var contacts: [Person]! // contacts still nil
var contacts = [Person]() // Person array with 0 objects
Если вы используете ()
вместо инициализации пустого Person
массива.
Оператор: не объявляя, его просто сказать, какой тип переменной является
Оператор = как в любом другом языке декларантом оператора, который в этом случае сопровождаемый(), который в этом случае объявлен новый массив Person.
Объявления переменных в 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]()
или назначить ему какой-либо существующий массив)
По этой причине лучше не использовать эти неявно-развернутые дополнительные опции, за исключением особых обстоятельств. Иногда им кажется, что они удобны, но они, как правило, не самый лучший вариант, поскольку они опасны.
Другие люди предоставили различия, я дам вам сценарии того, когда они должны использоваться.
var contacts: [Person]! //implicitly unwrapped optional. #1
var contacts = [Person]() //array initialization. #2
Я использую # 1, когда создаю переменную, которая не будет инициализирована собственным классом. Эта ситуация возникает, когда я реализую подробное представление, которое принимает информацию, передаваемую другим контроллером.
Для # 2 используйте, если вы хотите инициализировать новый пустой массив.
«Оператор = это ... оператор объявления». '=' Ничего не объявляет. Он присваивает значение lhs. Это 'var', который объявляет. –
Это правда, мне нужно практиковать мою терминологию – Arbitur