【问题标题】:Why can't I substitute a generic with types specified for a generic without in a method call?为什么我不能在没有方法调用的情况下用为泛型指定的类型替换泛型?
【发布时间】:2015-10-15 15:47:47
【问题描述】:

我有一堂课Constraint

public class Constraint <V: Hashable, D>

我有一个结构 CSP

public struct CSP <V: Hashable, D>

它有一组约束

var constraints = Dictionary<V, [Constraint<V, D>]>()

使用方法 addConstraint

public mutating func addConstraint(constraint: Constraint<V, D>)

我有一个字符串和整数的 CSP。我想添加一个 String 和 Int 类型的约束。它是 Constraint 的子类型(也是子类型的子类型):

class SendMoreMoneyConstraint<V, D>: ListConstraint <String, Int>

这不起作用。

csp = CSP<String, Int>(variables: variables, domains: domains)
let smmc = SendMoreMoneyConstraint<String, Int>(variables: variables)
csp.addConstraint(smmc)

最后一行导致Cannot invoke 'addConstraint' with an argument list of type '(SendMoreMoneyConstraint&lt;String, Int&gt;)'类型的错误

完整来源: https://github.com/davecom/SwiftCSP/blob/master/SwiftCSP/SwiftCSPTests/SendMoreMoneyTests.swift

感谢您提供正确方向的任何指示。这是在 Xcode 6.4 (Swift 1.2) 下,但我已经尝试过 Xcode 7b4 (Swift 2.0) 中的代码并看到相同的错误。

【问题讨论】:

  • 你在使用 Swift 2 吗?
  • 不,这是在 Swift 1.2 下。我已经尝试了 2.0 下的代码,但看到了同样的错误。
  • 编译器错误很有可能实际上与潜在问题无关。但除此之外,源代码本身并没有任何意义。具有泛型参数的类是具有泛型参数的类的子类?我强烈建议您退后一步,评估您的问题的哪一部分实际上会从泛型中受益。
  • Swift 1.2 不允许泛型类的非泛型子类(Swift 2 允许),因此 SendMoreMoneyConstraint 具有泛型约束的原因。

标签: ios macos swift


【解决方案1】:

无论是从答案还是从错误中,错误都不清楚,但是在复制代码后就很清楚了:

你这样调用方法:

let smmc = SendMoreMoneyConstraint<String, Int>(variables: variables)
csp.addConstraint(smmc)

csp 被声明为CSP&lt;String, Int&gt;?,因此您只需添加一个? 即可使其工作:

csp?.addConstraint(smmc)

很遗憾,编译器没有给出有用的错误信息。

【讨论】:

  • 谢谢,真棒!如此愚蠢的错误和可怕的错误信息:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 2019-04-08
相关资源
最近更新 更多