在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) 在Swift 3中,我无法再检查泛型变量类型是否为class(AnyObject
).以下代码返回true
,isObject
即使特定类型T
和传递的值是struct而不是class.在Swift 2.3和2.2中它按预期工作并且isObject
是false
.
struct Foo<T>
{
var value: Any?
var isObject: Bool = false
init (val: T?)
{
if val != nil
{
// following line shows warnings in Swift 3
// conditional cast from 'T?' to 'AnyObject' always succeeds
// 'is' cast is always true
isObject = val is AnyObject
self.value = val
}
}
}
struct Bar
{
var bar = 0
}
let b = …
Run Code Online (Sandbox Code Playgroud) 我想要一个函数,对于任何给定的函数,它Error
会给我一些描述
protocol CustomError { }
func customDescription(_ error: Error) -> String {
switch error {
case let customError as CustomError:
return "custom error"
case ???:
return "not subclass of NSError"
case let nsError as NSError:
return "subclass of NSError"
}
}
Run Code Online (Sandbox Code Playgroud)
上面不是真正的代码,我不想要String
描述,而是a Dictionary
,但这在问题的上下文中并不重要.
问题是我不知道如何区分Error
s是哪个子类,NSError
哪个不是因为任何快速错误都可以桥接到NSError
.有可能迅速吗?