Зачем использовать опциональные неявные в Swift?

Хорошо, читая Язык программирования Swift - основы Я нашел предмет optionals, то, что я уже взял за руку, но пока не совсем. Вопрос в следующем:

Зачем использовать implicit optional вместо нормальной переменной?

Если в конце концов мне придется быть осторожным с этой переменной кроме nil при использовании с !.

Если неявно развернутый необязательный параметр равен nil и вы пытаетесь получить доступ к его упакованному значению, вы вызовете ошибку времени выполнения. Результат точно такой же, как если бы вы поместили восклицательный знак после обычного необязательного, который не содержит значения.

Пример кода:

let possibleString: String? = "An optional string."
let forcedString: String = possibleString!
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString

В этом случае, если какая-либо переменная равна nil, и я делаю развертывание (неявное или явное), я бы дал ошибку. .. Как мне использовать неявное необязательное?

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

1
задан 20.03.2016, 03:29
1 ответ

Они очень полезные одновременно, что важные. В твоих примерах, есть ошибочный какой-либо.

let possibleString: String? = "An optional string."

Это не имеет смысл, так как, если ты распределяешь ему стоимость, объявив переменную, эта уже не Optional. А именно, правильная форма была бы:

let possibleString = "An optional string."

(он помнит, что типы следуют, и нужно пробовать предотвращать explicitarlos, если возможно)

Чтобы подтверждать примерами важность / утилиту Optionals сосредоточись на следующем случае. Представь, что у тебя есть менеджер, чтобы загружать такие контакты как которая, останься:

class ContactsManager: NSObject {

    // MARK: - Remote
    class func downloadLastContacts(date: NSDate, completion:(results: NSArray?, error: NSError?) -> ()) {

        // Código de descarga de los contactos

    }

}

Хорошо, с другой стороны, у тебя есть один UIViewController где ты хочешь показать эти контакты. В instanciarlo, ты загружаешь новые контакты начиная с данной даты. Код был бы:

class ContactsViewController: UIViewController {

    var contacts: NSArray?
    var currentDate: NSDate

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {

        // Asignamos fecha actual en el init
        // y por tanto NO es optional
        self.currentDate = NSDate()

        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        downloadContacts()

    }

    func downloadContacts() {

        // Descargamos "contacts" utilizando una fecha que NO es optional
        // y por tanto no hace falta hacer unwrapping
        ContactsManager.downloadLastContacts(currentDate) { (results, error) -> () in

            // Si contacts sigue siendo nil
            // mostramos la pantalla de "No hay contactos"
            // Para verificarlo, hacemos lo siguiente
            if let r = results {

                // Hay resultadmos, los guardamos
                self.contacts = r

            } else {

                // No hay resultados, mostramos
                // pantalla de "No hay contactos"
                // o un error en caso necesario

            }

        }

    }

}

Хорошо, если ты обращаешь внимание, у меня есть два свойства, одна Optional и другая не. В случае даты, мы инициализируем ее в init и следовательно всегда у него будет стоимость. Также мы можем инициализировать прямо таково, который я схватил, но это вопрос предпочтений:

var currentDate = NSDate()

С другой стороны, у нас есть свойство contacts что Optional. Это позволяет нам обеспечивать себе, что есть контакты, чтобы показывать. Войдя в UIViewController мы звоним в функцию разряда контактов, если эта функция не находит никакого контакта на сервере, он возвращает мне один Optional и следовательно я могу действовать последовательно (в этом случае я показываю сообщение или ошибку). Если бы он возвратил какой-то результат, он бы это сохранял в переменной contacts и он использовал бы ее ниже.

Начиная со здесь, говорится о том, чтобы играть с if let или guard else чтобы уверять, что есть какая-то стоимость, и предотвращать ошибки во время выполнения.

1
ответ дан 24.11.2019, 14:42