The warning works as intended: the false
return of TestStruct() is AnyObject
, however, does not
The prior version of this answer perceived the warning,
'is' test is always true
as the bug, and contained some discussion as to why this perceived buggy warning would manifest itself. That TestStruct() is AnyObject
evaluated to false
at runtime, however, was perceived as expected behaviour.
Given the comments to the bug report filed by the OP (SR-2420), it seems the situation is the reverse: since Xcode 8/beta 6, the is
test should always evaluate to true
, and the bug the OP:s post is the fact that TestStruct() is AnyObject
evaluates to false
during runtime.
Joe Groff writes:
This is correct, because everything bridges to AnyObject
now.
...
is
/as
AnyObject
always succeed for all types now. It's behaving
as intended.
The new SwiftValue
box for conversion from Swift values to Obj-C objects
(for additional details, see discussion in the comments below, thanks @MartinR)
It seems as if Swift values that are not explicitly implemented to be bridgeable to Obj-C objects via e.g. conformance to _ObjectiveCBridgeable
(see e.g. the following Q&A for details regarding _ObjectiveCBridgeable
), will instead automatically make use of the new SwiftValue
box to allow conversion to Obj-C objects.
The initial commit message for swift/stdlib/public/runtime/SwiftValue.mm reads:
Runtime: Implement an opaque 'SwiftValue' ObjC class to hold bridged values
If there's no better mapping for a Swift value into an Objective-C
object for bridging purposes, we can fall back to boxing the value in
a class. This class doesn't have any public interface beyond being
NSObject
-conforming in Objective-C, but is recognized by the Swift
runtime so that it can be dynamically cast back to the boxed type.
weak var weakRef = observer as AnyObject; guard let object = weakRef else { ... }
. – It is a horrible workaround though, and I don't know if it is reliable. – Disaffirmfunc register<T>(_ protocolType: T.Type, observer: AnyObject)
, and check the protocol conformance at runtime, e.g.guard observer is T else { fatalError() }
. – Disaffirm