为何继承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
相关产品推荐
相关产品推荐

