ios - 将类型别名作为类类型存储在 NSHashTable 中

标签 ios swift

假设我有一个只有类才能确认的协议(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/

相关文章:

ios - UICollectionViewCell 中的 AVPlayer 播放声音但不显示视频

xcode - Applovin tvOS 库问题

ios - 如何在导航栏 Swift 右侧添加自定义 View ?

ios - Swift 逆向保护问题

ios - 将 Z 格式的服务器日期转换为本地 nsdate

ios - XCode 6 Playground 测量代码性能

ios - 从 Assets 文件夹中打开视频文件并播放

ios - 如何修复架构arm64错误的 undefined symbol ?

ios - 在 UITableView 滚动时更新 MKMapView,从单元格获取坐标

ios - UIImagePickerControler.Camera 上的简单叠加 View