AnyObject无法在Xcode8 beta6中运行?

时间:2016-08-19 07:16:35

标签: ios swift xcode swift3 xcode8-beta6

在Xcode8 beta6中,以下代码会引发警告:'是'测试总是如此。但它不会打印通行证。

interface

以下代码会引发警告:来自' T'到任何对象'总是成功

    struct TestStruct {
    }

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

2 个答案:

答案 0 :(得分:7)

警告按预期正常工作:false TestStruct() is AnyObject返回<{1}}但

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

  

&#39;是&#39;测试永远是真的

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

鉴于对bug report filed by the OP (SR-2420)的评论,情况似乎相反:从Xcode 8 / beta 6开始,is测试 应始终评估为{{1 OP:s帖子的错误是true在运行时评估为TestStruct() is AnyObject的事实。

Joe Groff writes

  

这是正确的,因为现在所有内容都与false相连。

     

...

     

AnyObject / is as现在所有类型都会成功。它表现得很好   如预期的那样。

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

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

似乎没有明确实现的Swift值可以通过例如可以桥接到Obj-C对象。符合SwiftValue(请参阅例如the following Q&A for details regarding _ObjectiveCBridgeable),将自动使用新的_ObjectiveCBridgeable框以允许转换为Obj-C对象。

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

  

运行时:实施不透明的SwiftValue&#39;用于保存桥接值的ObjC类

     

如果没有更好的Swift值映射到Objective-C   对于桥接目的,我们可以回到拳击中的值   一类。除了之外,这个类没有任何公共接口   SwiftValue - 符合Objective-C,但被Swift认可   运行时,以便它可以动态地回送到盒装类型。

答案 1 :(得分:6)

长话短说。

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

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

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

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

更有帮助的答案: