【发布时间】:2016-08-19 07:16:35
【问题描述】:
在 Xcode8 beta6 中,以下代码会导致警告:'is' test is always true。但它不会打印通行证。
struct TestStruct {
}
//warning: 'is' test is always true
if TestStruct() is AnyObject {
print("pass")
}
下面的代码会引发警告:Conditional cast from 'T' to 'AnyObject' always succeeds
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)")
}
//...
}
【问题讨论】:
-
看起来像一个编译器警告系统错误。结构不能符合类协议 AnyObject
-
不错的发现 - 你应该 file a bug report
-
谢谢。错误报告:bugs.swift.org/browse/SR-2420
-
我前段时间看到了您的 SwiftNoficationCenter 并且(未成功)尝试使该运行时检查成为编译时检查:stackoverflow.com/questions/37707450/…。但是现在(据我了解) anything 可以包装到一个对象中(根据您的框架的需要,使用弱引用)。因此,将值注册为观察者应该可以正常工作。
-
@MartinR 感谢您的回复。但它不起作用。一旦 _SwiftValue 被分配给弱引用。弱引用变为 nil。我不知道底层机制发生了什么,但是我不认为可以观察到值类型,因为它是通过副本传递的。
标签: ios swift xcode swift3 xcode8-beta6