在使用Swift进行编程时,我遇到了以下行为:
如果您运行此代码段:
import Foundation
class A : Hashable, Equatable {
var hashValue: Int {
get { return ObjectIdentifier(self).hashValue }
}
}
func ==(a:A, b:A) -> Bool {
return a === b
}
typealias T = A
typealias TCollection = Array<T>
var element:TCollection = [T()]
var array:[AnyObject] = [element]
println(array[0] as? TCollection)
打印:
Optional([SetCrashTest.A])
但是,如果您将TCollection
从Array<T>
更改为Set<T>
,则会因以下错误而崩溃:
Could not cast value of type 'SetCrashTest.A' (0x1001d1530) to 'NSObject' (0x7fff72a9d0f0).
此外,如果我将T
从A
更改为其他类型,例如Int
,String
,CGFloat
等,则会正常运行。
是什么导致这种行为?如何在没有崩溃的情况下进行这种可选的向下转换?
修改
尝试从Set<T>
的{{1}} NSNotification
中读取userInfo
时,我遇到了此次崩溃。只有在此之后,我才构建了上面的例子;所以请不要建议使用[NSObject:AnyObject]
代替[TCollection]
,因为[AnyObject]
由AnyObject
API决定。NSNotification
。