Lea*_*ing 24 xcode ios swift swift3 xcode8-beta6
在Xcode8 beta6中,以下代码将引发警告:'is'test始终为true.但它不会打印通过.
struct TestStruct {
}
//warning: 'is' test is always true
if TestStruct() is AnyObject {
print("pass")
}
Run Code Online (Sandbox Code Playgroud)
以下代码将引发警告:从'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)")
}
//...
}
Run Code Online (Sandbox Code Playgroud)
警告按预期工作:但是,false返回TestStruct() is AnyObject不会
这个答案的先前版本感知了警告,
'是'测试总是如此
作为错误,并包含一些关于为什么这个感知到的错误警告会表现出来的讨论.这TestStruct() is AnyObject评估,以false在运行时,但是,被认为是预期的行为.
鉴于对OP提交的错误报告的评论(SR-2420),情况似乎相反:从Xcode 8/beta 6开始,is测试应始终评估true,而OP:s帖的错误是事实该TestStruct() is AnyObject计算结果为false运行时.
这是正确的,因为一切都是
AnyObject现在的桥梁....
is/asAnyObject现在总是成功的所有类型.它的行为符合预期.
SwiftValue用于从Swift值转换为Obj-C对象的新框
(有关其他详细信息,请参阅以下评论中的讨论,感谢@MartinR)
看起来似乎没有明确实现的Swift值可以通过例如符合_ObjectiveCBridgeable(例如参见下面的Q&A以获得详细信息_ObjectiveCBridgeable)来桥接到Obj-C对象,而是自动使用新SwiftValue框来允许转换为Obj-C对象.
swift/stdlib/public/runtime/SwiftValue.mm的初始提交消息如下:
运行时:实现一个不透明的'SwiftValue'ObjC类来保存桥接值
如果没有更好的Swift值映射到Objective-C对象以进行桥接,我们可以回退到类中的值.除了
NSObject在Objective-C中进行符合之外,该类没有任何公共接口 ,但是Swift运行时可以识别它,以便可以动态地将其转换回盒装类型.
长话短说.
要检查值是否具有引用类型:
if type(of: value) is AnyClass {
// ...
}
Run Code Online (Sandbox Code Playgroud)
要检查type是否为引用类型:
if SomeType.self is AnyClass {
// ...
}
Run Code Online (Sandbox Code Playgroud)
更有帮助的答案:
| 归档时间: |
|
| 查看次数: |
1781 次 |
| 最近记录: |