在Xcode8 beta6中,以下代码会引发警告:'是'测试总是如此。但它不会打印通行证。
interface
以下代码会引发警告:来自' T'到任何对象'总是成功
struct TestStruct {
}
//warning: 'is' test is always true
if TestStruct() is AnyObject {
print("pass")
}
答案 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
的事实。
这是正确的,因为现在所有内容都与
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 {
// ...
}
更有帮助的答案: