AnyObject不工作在Xcode8 beta6?

在Xcode8 beta6中,下面的代码会导致警告:'是'testing总是如此。 但它不会打印通过。

struct TestStruct { } //warning: 'is' test is always true if TestStruct() is AnyObject { print("pass") } 

下面的代码会引起警告:从'T'到'AnyObject'的条件转换总是成功的

 public static func register<T>(_ protocolType: T.Type, observer: T) { //Warning: Conditional cast from 'T' to 'AnyObject' always succeeds guard let object = observer as? AnyObject else { fatalError("expecting reference type but found value type: \(observer)") } //... } 

警告按预期工作: TestStruct() is AnyObjectfalse返回TestStruct() is AnyObject ,但是,不

此回答的先前版本感受到警告,

“是”testing总是如此

作为错误,并且包含了一些讨论,为什么这个感知错误的警告会体现出来。 TestStruct() is AnyObject在运行时TestStruct() is AnyObject评估为false TestStruct() is AnyObject ,但是被认为是预期的行为。

鉴于对OP(SR-2420)提交的bug报告的评论,似乎情况正好相反:自从Xcode 8 / beta 6以来,testing应该总是评估为true ,而OP:s的post是TestStruct() is AnyObject的事实在运行时计算结果为false

乔·格洛夫写道 :

这是正确的,因为现在一切都连接到AnyObject

is / as AnyObject总是成功的所有types现在。 它的行为如预期。


新的SwiftValue框从Swift值转换为Obj-C对象

(有关更多详细信息,请参阅下面的注释中的讨论,感谢@MartinR)

看起来好像Swift值没有被明确地实现为通过例如符合_ObjectiveCBridgeable (参见例如关于_ObjectiveCBridgeable细节的以下Q&A )被桥接到Obj-C对象,而是将自动地使用新的SwiftValue框来允许转换成Obj-C对象。

swift / stdlib / public / runtime / SwiftValue.mm的初始提交消息是:

运行时:实现一个不透明的“SwiftValue”ObjC类来保存桥接值

如果没有更好的将Swift值映射到Objective-C对象的桥接目的,我们可以回到装箱类中的值。 这个类没有任何超过NSObject公共接口,它在Objective-C中有效,但是被Swift运行时识别,所以它可以被dynamic地转换回盒装types。

长话短说。

要检查值是否有引用types:

 if type(of: value) is AnyClass { // ... } 

检查types是否是引用types:

 if SomeType.self is AnyClass { // ... } 

更有帮助的答案: