> On May 30, 2017, at 12:11 PM, old donkey via swift-users > <swift-users@swift.org> wrote: > > Hi All: > > Current bridging from Objective-C to Swift has this behaviour: > > If we define a property in Objective-C, and we don’t say it is nullable or > nonnull, like this: @property (nonatomic, strong, readonly) NSString > *someString; > > When we reference it from Swift, this property will be bridging to String! > (implicitly unwrapped optional) type automatically, and there is no warning > indicate we should check if this is nil first. > > So the result is when some edge cases happen, the App will crash. > > As more and more large projects are trying to use Swift now, this may seems a > problem for more people. > > The documents I can find is: https://developer.apple.com/swift/blog/?id=25 > and > https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html, > it says “Swift cannot distinguish between optional and nonoptional > references, and imports it as an implicitly unwrapped optional.” > > As in Objective-C, the default property is nullable(if you don’t say it is > nonnull), I am curious what’s the reason that the property is not bridging to > optional, for me, feel optional value should be a better fit here.
Importing every unmarked Objective-C object pointer as strict optional makes traditional Objective-C interfaces cumbersome to use from Swift. You end up needing a nil check for every return value, every property access, etc. Such code is hard to read and hard to write. Importing as implicitly-unwrapped optional is a usability compromise. Most Objective-C pointers are never actually nil. If a pointer is nil, and the author didn't check, then the process deliberately halts. This is no worse than the behavior you get when writing Objective-C code. IUO import is intended to be a stopgap. In the long term every Objective-C interface ought to be explicitly annotated so that Swift can import them more precisely. In your own code you can use NS_ASSUME_NONNULL_BEGIN/END in your header files. Every un-annotated object pointer inside those markers is nonnull. -- Greg Parker gpar...@apple.com Runtime Wrangler _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users