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 AnyObject
的false
返回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 { // ... }
更有帮助的答案: