You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何继承AnyObject的协议无法实例化NSHashTable?

问题解决:NSHashTable与仅类可遵循协议的类型不匹配问题

问题原因

你遇到的错误源于NSHashTable是Objective-C集合类,它要求泛型参数必须是Objective-C runtime可识别的类或@objc修饰的协议。尽管你的协议继承了AnyObject(确保仅类可遵循),但默认情况下Swift协议不会自动暴露给Objective-C,因此编译器无法确认它符合NSHashTable的类类型约束。

两种解决方法

方法一:给协议添加@objc修饰

让协议兼容Objective-C,NSHashTable即可正常识别它:

@objc public protocol DayViewStateUpdating: AnyObject {
    func move(from oldDate: Date, to newDate: Date)
}

// 此时实例化不再报错
private var clientsHashTable = NSHashTable<DayViewStateUpdating>.weakObjects()

方法二:使用AnyObject作为泛型参数,配合类型转换

若不想让协议暴露给Objective-C,可将NSHashTable的泛型参数设为AnyObject,在操作元素时做类型转换:

private var clientsHashTable = NSHashTable<AnyObject>.weakObjects()

// 添加客户端
func addClient(_ client: DayViewStateUpdating) {
    clientsHashTable.add(client)
}

// 调用协议方法
func notifyDateChange(from oldDate: Date, to newDate: Date) {
    for client in clientsHashTable.allObjects as! [DayViewStateUpdating] {
        client.move(from: oldDate, to: newDate)
    }
}

内容的提问来源于stack exchange,提问作者Richard Topchii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:38:15