2015-02-23 5 views
0

Ниже приведен код необязательной строки для имени переменной yourname и yourname2.Разница между дополнительным и принудительным разворачиванием

Практически то, что разница между ними и как вынужденным разворачивания в случае yourname2

var yourname:String? 
yourname = "Paula" 
if yourname != nil { 
    println("Your name is \(yourname)") 
} 

var yourname2:String! 
yourname2 = "John" 
if yourname2 != nil { 
    println("Your name is \(yourname2!)") 
} 

ответ

2

The String? нормальный факультативный. Он может содержать либо String, либо nil.

The String! неявно разворачивается необязательно, когда вы указываете, что он всегда будет иметь значение - после его инициализации.

Ваше имя в вашем случае является необязательным, ваше имя2! нет. В вашем первом заявлении на печать будет выведено что-то вроде «Ваше имя необязательно (« Paula »)»

Ваш второй оператор печати выводит что-то вроде «Ваше имя - Джон». Он напечатает то же самое, если вы удалите восклицательный знак из инструкции.

Кстати, документация Swift доступна как «Язык быстрого программирования» бесплатно на iBooks, а самая последняя - также online here.

2

То, что вы называете «принудительным разворачиванием» известен как "неявно развернутые по желанию. Неявно развернутый необязательный параметр обычно используется в объектах, которые не могут или не будут присваивать значение свойства во время инициализации, но можно ожидать, что он всегда будет возвращать ненулевое значение при его использовании. Использование неявно развернутого необязательно снижает безопасность кода, поскольку его значение не может быть проверено до выполнения, но позволяет пропускать разворачивание свойства каждый раз, когда оно используется. Например:

var a: Int! 
var b: Int? 

var c = a + b //won't compile 
var d = a + b! //will compile, but will throw an error during runtime 
var e = a + a //will compile, but will throw an error during runtime 

a = 1 
b = 2 

var f = a + b //still won't compile 
var g = a + b! //will compile, won't throw an error 
var h = a + a //will compile, won't throw an error 

Вообще говоря, вы всегда должны использовать опции, если вы не присваиваете значение переменной при инициализации. Это уменьшит сбои программ из-за ошибок программиста и сделает ваш код более безопасным.

0

Принудительное развёртывание необязательно, сообщите компилятору, что вы уверены, что опция не будет равна нулю. Но если он будет равен нулю, тогда он выдает ошибку: Неустранимая ошибка: неожиданно найден нуль при развертывании необязательного значения.

Лучший подход к разворачиванию по выбору - Дополнительное связывание. Оператор if-let используется для необязательной привязки: сначала необязательно назначается произвольная константа необязательного типа. Назначение действительно и работает, если опция имеет значение. Если необязательный параметр равен нулю, тогда это можно продолжить с помощью предложения else.