AnyObject无法在Xcode8 beta6中运行?

Lea*_*ing 24 xcode ios swift swift3 xcode8-beta6

在Xcode8 beta6中,以下代码将引发警告:'is'test始终为true.但它不会打印通过.

    struct TestStruct {
    }

    //warning: 'is' test is always true
    if TestStruct() is AnyObject {
        print("pass")
    }
Run Code Online (Sandbox Code Playgroud)

以下代码将引发警告:从'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)")
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

dfr*_*fri 9

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

这个答案的先前版本感知了警告,

'是'测试总是如此

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

鉴于对OP提交错误报告的评论(SR-2420),情况似乎相反:从Xcode 8/beta 6开始,is测试始终评估true,而OP:s帖的错误是事实该TestStruct() is AnyObject计算结果为false运行时.

乔格罗夫写道:

这是正确的,因为一切都是AnyObject现在的桥梁.

...

is/ as AnyObject现在总是成功的所有类型.它的行为符合预期.


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

(有关其他详细信息,请参阅以下评论中的讨论,感谢@MartinR)

看起来似乎没有明确实现的Swift值可以通过例如符合_ObjectiveCBridgeable(例如参见下面的Q&A以获得详细信息_ObjectiveCBridgeable)来桥接到Obj-C对象,而是自动使用新SwiftValue框来允许转换为Obj-C对象.

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

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

如果没有更好的Swift值映射到Objective-C对象以进行桥接,我们可以回退到类中的值.除了NSObject在Objective-C中进行符合之外,该类没有任何公共接口 ,但是Swift运行时可以识别它,以便可以动态地将其转换回盒装类型.


mix*_*xel 6

长话短说.

要检查值是否具有引用类型:

if type(of: value) is AnyClass {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

要检查type是否为引用类型:

if SomeType.self is AnyClass {
   // ...
}
Run Code Online (Sandbox Code Playgroud)

更有帮助的答案: