Как добавить эффект эха в видео в Android?

В подавляющем большинстве случаев вы должны использовать init, а не init!. Есть несколько случаев, когда требуется init!. Наиболее распространенным в моем опыте является то, что инициализатор «должен преуспеть» хочет вызвать неудачный инициализатор. Рассмотрим этот случай:

struct NotEmpty {
    let something: String
    init?(something: String) {
        guard !something.isEmpty else { return nil }
        self.something = something
    }

    init() {
        self.init(something: "unknown")! // <-- This is illegal
    }
}

Мы знаем, что init() будет успешным, потому что мы передаем непустую строку. Но нет способа выразить это стандартным инициализатором (и компилятор не может доказать, что это так или иначе). Вместо этого нам нужно использовать init!:

init!() {
    self.init(something: "unknown")
}

Теперь вызывающий может обрабатывать результат так, как если бы он не был необязательным (на самом деле он), хотя в соответствии с типами он мог провалился. Это будет ошибка программирования, и вы потерпите крах. ! здесь в основном говорит: «Да, я знаю, что это может потерпеть неудачу, но я обещаю, что этого никогда не будет». И в Swift «обещание» означает «или, пожалуйста, проваливайте».

-1
задан Lynx 13 July 2018 в 22:31
поделиться