Как не необязательное значение получает значение nil?

Документация Apple TN2151 говорит об этом для возможной причины EXC_BREAKPOINT/SIGTRAP:

необязательный тип с нулевым значением

Но такой код не будет компилироваться:

var x = "hello"
x = nil

Итак, при каких обстоятельствах невращаемый может получить значение nil?

Ответы

Ответ 1

Рассмотрим что-то вроде этого в Objective-C, соединенном с Swift:

- (NSObject * _Nonnull)someObject {
    return nil;
}

Функция аннотируется как _Nonnull, но возвращает nil. Это связано с нештатным объектом для Swift и сбой.

Ответ 2

Препятствовано, но возможно:

class C {}

let x: C? = nil
let y: C = unsafeBitCast(x, to: C.self)

print(y) // boom

Ответ 3

Случается при взаимодействии с Objective C. objc-метод может быть аннотирован как nonnull, но ничто не мешает ему возвращать nil. Компилятор улавливает только самые очевидные случаи, и даже тогда он выдает предупреждения (например, когда вы внятно return nil; в методе, который указан как не возвращающий нуль.)

Ответ 4

Я не знаю точно, но, возможно, это произойдет, если вы принудительно-разворачиваете (!) необязательно в переменную Non-Optional следующим образом:

let a : String? = nil
var x = "hello"
x = a!

Но это просто догадка...