25

在 Xcode8 beta6 中,以下代码会导致警告:'is' 测试始终为真。但它不会打印通行证。

    struct TestStruct {
    }

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

以下代码将导致警告: Conditional cast from 'T' to 'AnyObject' always succeeds

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)")
    }
    //...
}
4

2 回答 2

9

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

该答案的先前版本感知到警告,

'is' 测试总是正确的

作为错误,并包含一些关于为什么这种感知错误警告会出现的讨论。然而,在运行时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 值可以通过例如一致性桥接到 Obj-C 对象_ObjectiveCBridgeable(有关详细信息,请参见下面的问答_ObjectiveCBridgeable),而是自动使用新SwiftValue框来允许转换为 Obj-C对象。

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

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

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

于 2016-08-19T08:11:40.383 回答
6

长话短说。

检查 value 是否有引用类型:

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

检查 type 是否为引用类型:

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

更有帮助的答案:

于 2016-11-10T23:07:42.283 回答