AnyObject在Xcode8 beta6中不起作用?

发布于 2021-01-31 23:55:30

在Xcode8 beta6中,以下代码将引发警告:’is’测试始终为true。但是它不会打印通行证。

    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)")
    }
    //...
}
关注者
0
被浏览
74
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    该警告按预期起作用: 但是,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)

    似乎未明确实现为可通过_ObjectiveCBridgeable(例如)遵循_ObjectiveCBridgeable
    Swift值可与Obj-C对象桥接(取而代之的是,),而是自动使用新SwiftValue框来允许转换为Obj-
    C对象。

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

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

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看