在Xcode8 beta6中,下面的代码将导致一个警告:'is'测试总是为真。但是它不会打印pass。
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
返回不
这个答案的前一个版本感知到警告,
'is' test总是true
作为错误,并包含了一些关于为什么这个感知到的错误警告会显示自己的讨论。然而,TestStruct() is AnyObject
在运行时被评估为false
被认为是预期行为。
鉴于OP (SR-2420)提交的错误报告的评论,似乎情况正好相反:因为Xcode 8/beta 6, is
测试应该始终评估到true
,而OP:s post的错误是TestStruct() is AnyObject
在运行时评估到false
的事实。
Joe Groff写道:
这是正确的,因为现在所有的桥接到
AnyObject
。…
is
/as
AnyObject
现在总是成功的所有类型。它的行为。
用于从Swift值转换到Obj-C对象的新SwiftValue
框
(有关更多细节,请参阅下面评论中的讨论,谢谢@MartinR)
似乎Swift值没有显式地实现为可桥接Obj-C对象,例如通过符合_ObjectiveCBridgeable
(参见以下关于_ObjectiveCBridgeable
的详细信息),将自动使用新的SwiftValue
框来允许转换为Obj-C对象。
swift/stdlib/public/runtime/SwiftValue的初始提交消息。mm:
运行时:实现一个不透明的'SwiftValue' ObjC类来保存桥接值
如果没有更好的映射Swift值到Objective-C对象用于桥接的目的,我们可以退回到将值装箱一个类。这个类除了存在之外没有任何公共接口在Objective-C中符合
NSObject
,但被Swift认可
长话短说
检查value是否有引用类型:
if type(of: value) is AnyClass {
// ...
}
检查type是否为引用类型:
if SomeType.self is AnyClass {
// ...
}
更多有用的答案:
- https://stackoverflow.com/a/39185374/746347
- https://stackoverflow.com/a/39546887/746347