Ios 任何对象在Xcode8 beta6中不工作?

Ios 任何对象在Xcode8 beta6中不工作?,ios,swift,xcode,swift3,xcode8-beta6,Ios,Swift,Xcode,Swift3,Xcode8 Beta6,在Xcode8 beta6中,以下代码将导致警告:“is”测试始终为真。但它不会打印通行证 struct TestStruct { } //warning: 'is' test is always true if TestStruct() is AnyObject { print("pass") } 下面的代码将导致警告:从“T”到“AnyObject”的条件转换始终成功 public static func register<T

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

    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)")
    }
    //...
}
publicstaticfunc寄存器(protocolType:T.Type,observer:T){
//警告:从“T”到“AnyObject”的条件强制转换始终成功
guard let object=观察者作为其他任何对象{
fatalError(“应为引用类型,但找到值类型:\(观察者)”)
}
//...
}
警告按预期工作:返回的
TestStruct()是AnyObject
,但不返回
false

这个答案的前一个版本感知到了警告

“是”测试总是正确的

作为bug,并包含了一些关于为什么会出现这种感知到的bug警告的讨论。然而,
TestStruct()是运行时计算为
false
的任何对象,这被视为预期行为

给出了对的注释,情况似乎正好相反:由于Xcode 8/beta 6,
is
测试应该总是计算为
true
,而OP:s post的错误在于
TestStruct()是AnyObject
在运行时计算为
false

:

这是正确的,因为现在一切都连接到
AnyObject

/
因为
任何对象
现在对所有类型都始终成功。它的行为 如预期的那样


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

(有关更多详细信息,请参阅下面评论中的讨论,谢谢@MartinR)

似乎没有明确实现的Swift值可以通过符合
\u objectivebridgeable
(参见例如)桥接到Obj-C对象,而是会自动使用新的
SwiftValue
框来允许转换到Obj-C对象

的初始提交消息将读取:

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

如果没有更好的方法将Swift值映射到Objective-C中 对象进行桥接时,我们可以退回到将值装箱到 一节课。这个类没有任何公共接口
NSObject
-符合Objective-C,但被Swift识别 运行时,以便可以动态地将其转换回装箱类型

长话短说

要检查值是否具有引用类型,请执行以下操作:

if type(of: value) is AnyClass {
    // ...
}
if SomeType.self is AnyClass {
   // ...
}
要检查类型是否为引用类型,请执行以下操作:

if type(of: value) is AnyClass {
    // ...
}
if SomeType.self is AnyClass {
   // ...
}
更有用的答案:


看起来像是编译器警告系统错误。结构不能符合类协议AnyObjectNice find–您应该感谢。错误报告:我不久前看到了您的SwiftNoficationCenter,并且(未成功)尝试将该运行时检查设置为编译时检查:。但现在(据我所知),任何东西都可以包装到对象中(根据框架中的需要,使用弱引用)。所以,将值注册为观察者应该就行了。@MartinR谢谢您的回复。但它不起作用。一旦将_SwiftValue指定给弱引用。弱引用变为零。我不知道底层机制中发生了什么,但我认为无法观察到值类型,因为它是通过副本传递的。谢谢您的回复。我提交了一份bug报告:。我不使用AnyObject约束t的原因是我为一对多通信创建了一个框架。用户将传递Protocol.Type作为参数。神奇之处似乎就在这里。是的,我上面的注释将纯Swift值转换为AnyObject成功,并且
Type(of:o)
prints“\u SwiftValue”。我就是这样找到那个源文件的。所以,似乎任意值被装箱为任意对象。@Martiner啊,beta 6中的新魔术,不知道这一点。刚才注意到OP提交的bug报告有一些活动,主要是链接到、提交到您上面链接到的SwiftValue源(说明:“对于任意源类型,动态强制转换到AnyObject应该成功,因为我们总是可以生成SwiftValue。”)。看来OPs问题中的警告不是bug,而是
在运行时测试失败的事实。@MartinR谢谢。最后一点,它似乎仍将作为细节实现的隐式转换而存在,而如果前面的选项不可用(对于某些给定类型),则将使用
\u SwiftValue
框。