为啥我不能用字符串为 Dictionary<String, Int> 下标?
Posted
技术标签:
【中文标题】为啥我不能用字符串为 Dictionary<String, Int> 下标?【英文标题】:Why can't I subscript a Dictionary<String, Int> with a String?为什么我不能用字符串为 Dictionary<String, Int> 下标? 【发布时间】:2015-07-24 19:47:46 【问题描述】:我有一本Dictionary<String, Int>
类型的字典,我正在尝试用String
为其下标。我得到错误
Cannot subscript a value of type 'Dictionary<String, Int>' with an index of type 'String'
这是整个方法。我正在运行 Swift 1.2 (Xcode 6.4),但我也尝试过,同样的错误发生在 Swift 2.0 (Xcode 7b4) 中。
这是整个方法:
override func isSatisfied<String, Int>(assignment: Dictionary<String, Int>) -> Bool
// if all variables have been assigned, check if it adds up correctly
if assignment.count == variables.count
if let s = assignment["S"], e = assignment["E"], n = assignment["N"], d = assignment["D"], m = assignment["M"], o = assignment["O"], r = assignment["R"], y = assignment["Y"]
let send: Int = s * Int(1000) + e * Int(100) + n * Int(10) + d
let more: Int = m * Int(1000) + o * Int(100) + r * Int(10) + e
let money: Int = m * 10000 + o * 1000 + n * 100 + e * 10 + y
if (send + more) == money
return true;
else
return false;
else
return false
// until we have all of the variables assigned, the assignment is valid
return true
问题在于 if let s = assignment["S"]
这里还有源代码存储库: https://github.com/davecom/SwiftCSP
这是具体的文件: https://github.com/davecom/SwiftCSP/blob/master/SwiftCSP/SwiftCSPTests/SendMoreMoneyTests.swift
【问题讨论】:
【参考方案1】:问题出在这里:
func isSatisfied<String, Int>(assignment: Dictionary<String, Int>) -> Bool
^=== ^===
您已将此函数定义为通用函数,其中有两个占位符String
和Int
。这些将掩盖常规类型。删除它们,因为这可能不是您想要的。
当发生这种奇怪的事情时,通常更容易将案例简化为仅显示问题。直到我尝试将您的功能缩减到基本上这样,我才发现出了什么问题:
(p.s. [String:Int]
是 Dictionary<String,Int>
的简写)
【讨论】:
多么愚蠢的疏忽,谢谢您的回复。有没有办法用特定类型覆盖泛型方法? 不要这么认为——如果你考虑一下这意味着什么,你并没有真正重写方法——如果一个函数接受一个泛型参数(比如说,一个完全不受约束的参数),那么你就是在子类的覆盖中说“这只需要字符串”,那么您并没有创建可以调用的函数版本,而不是基类型的函数。如果调用者传入一个整数怎么办? 这很有意义。我需要找到一种新的设计模式。我发现 Swift 的泛型严重阻碍了我之前在 Python 和 Dart 中构建的约束满足框架的移植。也许我只是不够了解它们!以上是关于为啥我不能用字符串为 Dictionary<String, Int> 下标?的主要内容,如果未能解决你的问题,请参考以下文章
为啥不能使用 null 作为 Dictionary<bool?, string> 的键?