Objective-C provides a facility to work at compile time with nullability and optionals. While it's not as powerful as Swift optionals, it still provides a decent amount of safety for pure Objective-C programs. Lastly, it can be used to better interoperate with Swift.
Let's first consider this simple Objective-C interface:
@interface AnObject: NSObject
@property (nonatomic, copy) NSString* string;
@end
This is exposed in Swift as the following:
class AnObject: NSObject {
var string: String!
}
As you might notice, the string is a forced unpacked string, but this is unlikely what you would expect. Before Swift 4, the following code was valid but would crash at runtime:
// Swift 3
let object = AnObject()
let string = object.string // String!
string.appendContentsOf("SwiftObject")
// fatal error: unexpectedly found nil while...