【问题标题】:Swift - Ambiguous reference to member '==' errorSwift - 对成员“==”错误的模糊引用
【发布时间】:2020-02-22 02:27:16
【问题描述】:

我进行了一些搜索,但似乎无法为我的以下问题找到解决方案。我对 swift 很陌生,所以要解决一些问题。我有下面的函数,它只是一个包含函数签名和返回值的存根,只是为了让它编译。

测试代码是我得到的,我没有写这个,很遗憾不能改变它。

我的问题是,当我运行它时,它说调用这个函数的测试有一个“对成员'=='的模糊调用”。我无法更改测试代码。无论问题是什么,都必须在我假设的函数签名中,但可以使用一些帮助。

我正在编写的函数(我假设包含问题):

func contains(target: StringOrInt, compare: Character ) -> Bool {                                                                                                
    return false                                                                                                       
} // contains

调用该函数的测试(我不允许编辑它并且没有编写它):

func test_contains_cons_2_strings_3() {
let list1 = MyList.cons("foo", MyList.cons("bar", MyList.empty))
assertEquals(testName: "test_contains_cons_2_strings_3",
         expected: true,
         received: list1.contains(target: "bar", compare: ==))//Error is on this line '=='
} // test_contains_cons_2_strings_3

错误: main.swift:807:67:错误:对成员“==”的模糊引用 收到:list1.contains(目标:“foo”,比较:==))

还要注意,“StringOrInt”是我定义的一个协议,它充当 Int 和 String 的扩展。这样做是因为测试代码(我没有编写也无法编辑)将字符串和整数都传递给了同一个变量和函数。

感谢您的帮助,我真的很感激!

【问题讨论】:

  • StringOrInt的定义是什么?
  • 很明显你来自 Haskell 背景,或者类似的背景,但你知道,这些几乎都不是“传统的 Swift”,因为大多数人会写或认可社区。 Swift 更喜欢 lowerCamelCase 作为函数,而不是 snake_case。它更喜欢在类型上编写实例函数,而不是采用target 参数。它更喜欢数组而不是链表(比如cons,相比之下,它的表现非常糟糕)。
  • 你为什么传递 == 而不是单个字符 "="
  • 我已经更新了代码以提及这一点,StringOrInt 是一个允许将 int 类型和 string 类型都传递给该变量的协议,因为测试代码将这两种类型都传递给同一个变量不同的点。

标签: swift


【解决方案1】:

我认为您想通过传递“==”运算符来比较两个字符串并返回一个布尔值。如果是这样,您可以使用以下方法,

func myList(_ compare:((String, String) -> Bool)) -> Bool {
    return compare("foo","bar")
}

myList(==) 

【讨论】:

  • 是的,我可以肯定地看到测试函数正在创建一个字符串列表,然后它会检查该字符串列表是否对它通过的目标有“==”。一个问题是,在测试代码中,这个包含函数被调用了很多,有时它比较 Ints,有时比较 Strings,所以我必须能够同时处理这两者。我将尝试在上面应用您的思维过程,看看我是否可以取得一些进展。非常感谢您的建议
  • 我想这会对你有所帮助stackoverflow.com/questions/53004623/…
【解决方案2】:

我能够使用下面的方法来解决这个问题。我实现了一个泛型类型的枚举和该枚举的 nan 扩展。然后我在 contains 函数中使用这个泛型类型来表示多种类型,而不是 StringOrInt。感谢大家的cmets和帮助。

枚举实现:

indirect enum my_list<A> {
   case cons(A, my_list<A>)
   case empty
}

然后我在这个枚举“extension my_list”的扩展中实现,并将包含函数放在扩展中。

包含函数签名/存根:

func contains(target: A, compare:((A, A) -> Bool))     
-> Bool {
   return true
}// contains

【讨论】:

    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多