假设我有一个只有类才能确认的协议(protocol),使用它我创建 typealias
并结合一些类类型。
protocol Foo: class {}
typealias FooView = UIView & Foo
我想将符合此协议(protocol)的 UIView
实例存储在弱哈希表中。所以我这样做:
let hashtable = NSHashTable<FooView>.weakObjects()
但我收到以下错误:
'NSHashTable' requires that 'FooView' (aka 'Foo & UIView') be a class type
我知道 NSHashTable
只适用于引用类型,但我没有得到什么,因为 UIView
是引用类型而 Foo
协议(protocol)是也是类类型,恕我直言,它应该是一个有效的声明。
我明白,我可以创建一个如下所示的类:
class FooView: UIView, Foo {}
虽然它可能会起作用,但是,这不是一个可能的解决方案。其他人是否有其他想法如何使用 typealias
并将其存储在 HashTable
中?
最佳答案
NSHashTable 的(简化)定义如下所示:
class NSHashTable<ObjectType> : NSObject where ObjectType : AnyObject
并且 Foo
组件不符合 AnyObject
要求(请参阅 Protocol doesn't conform to itself? 了解协议(protocol)不符合其他协议(protocol)的更多详细信息)。
解决此限制的方法是使用包装器类:
class FooViewWrapper {
let view: FooView
init(view: FooView) {
self.view = view
}
}
let hashtable = NSHashTable<FooViewWrapper>.weakObjects()
或通过泛型:
class Ref<T>{
let value: T
init(_ value: T) {
self.value = value
}
}
let hashtable = NSHashTable<Ref<FooView>>.weakObjects()
包装和展开此类 View 会添加一些额外的代码,但可以很好地与哈希表配合使用。
关于ios - 将类型别名作为类类型存储在 NSHashTable 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54403315/