【问题标题】:NSMapTable "Generic parameter 'KeyType' could not be inferred" [duplicate]NSMapTable“无法推断通用参数'KeyType'” [重复]
【发布时间】:2016-09-28 22:40:27
【问题描述】:

以下行给了我编译器错误“无法推断通用参数'KeyType'”:

fileprivate var delegatesMap = NSMapTable.strongToWeakObjects()

我试着更明确地说:

fileprivate var delegatesMap:MapTable<Key,Value> = NSMapTable.strongToWeakObjects()

但我随后 Xcode 不识别“Key”

我该如何解决这个问题?

编辑:我希望我的 Key 是 String 类型,我的 Value 是 MenuActionDelegate(class protocol) 类型

【问题讨论】:

  • 不光是Swift,我也一样,没看到你想用什么KeyType。您想将哪些类型用作 NSMapTable 的 KeyType 和 ValueType?
  • 我想使用字符串作为键和协议“MenuActionDelegate”作为值
  • 您最好将此类信息包含在您的问题中。我会写一个简短的答案。

标签: swift xcode generics swift3


【解决方案1】:

你可能需要这样写:

fileprivate var delegatesMap = NSMapTable<NSString, MenuActionDelegate>.strongToWeakObjects()

泛型参数KeyTypeValueType 需要是AnyObject,所以你不能直接把String 放在那里,你还需要一些显式转换as NSString

而值类型MenuActionDelegate 需要一个@objc 协议。 否则你可能需要这样写:

var delegatesMap = NSMapTable<NSString, AnyObject>.strongToWeakObjects()

并将其用作:

let theDelegate = delegatesMap.object(forKey: "delegateName" as NSString) as! MenuActionDelegate

【讨论】:

  • 这是一个类协议,但我收到一条错误消息,提示“MenuActionDelegate 作为与协议‘AnyObject’相对的具体类型不受支持”
  • @FaisalSyed,对不起,我错过了检查课程协议。你能把它改成@objc-protocol吗?
  • 我做不到。我将如何添加一些显式转换为 NSString?我尝试了几种方法,但都无法正确完成
  • 当我用括号中的 AnyObject 替换 MenuActionDelegate 时,它​​希望我将所有 String 对象转换为 NSString,并且第二行不编译
  • 第二行给出编译器错误:"Cannot use instance member "delegatesMap" within property initializer; property initializers run before 'self' is available
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
相关资源
最近更新 更多