为啥我不能用字符串为 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&lt;String, Int&gt; 类型的字典,我正在尝试用String 为其下标。我得到错误 Cannot subscript a value of type 'Dictionary&lt;String, Int&gt;' 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 
                 ^===    ^===

您已将此函数定义为通用函数,其中有两个占位符StringInt。这些将掩盖常规类型。删除它们,因为这可能不是您想要的。

当发生这种奇怪的事情时,通常更容易将案例简化为仅显示问题。直到我尝试将您的功能缩减到基本上这样,我才发现出了什么问题:

(p.s. [String:Int]Dictionary&lt;String,Int&gt; 的简写)

【讨论】:

多么愚蠢的疏忽,谢谢您的回复。有没有办法用特定类型覆盖泛型方法? 不要这么认为——如果你考虑一下这意味着什么,你并没有真正重写方法——如果一个函数接受一个泛型参数(比如说,一个完全不受约束的参数),那么你就是在子类的覆盖中说“这只需要字符串”,那么您并没有创建可以调用的函数版本,而不是基类型的函数。如果调用者传入一个整数怎么办? 这很有意义。我需要找到一种新的设计模式。我发现 Swift 的泛型严重阻碍了我之前在 Python 和 Dart 中构建的约束满足框架的移植。也许我只是不够了解它们!

以上是关于为啥我不能用字符串为 Dictionary<String, Int> 下标?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能使用 null 作为 Dictionary<bool?, string> 的键?

为啥 Dictionary<TKey, TValue> 上的这个 Linq 查询不能作为数据源工作

为啥 Swift Dictionary 不可桥接?

为啥我不能在c中将字符串转换为int

python字符串为啥不能用int处理?

为啥我不能将带有破折号的字符串转换为 wstring?