在 Swift 中找不到接受类型为“(Array<String!>, String)”的参数列表的 'contains' 的重载

Cannot find an overload for 'contains' that accepts an argument list of type '(Array<String!>, String)' in Swift

我正在尝试使用 contains 确定 Array 是否包含某个字符串值。数组定义如下:

var myArray: Array<String!> = []

这是一个单独的文件(因为它在许多不同的地方被操纵),到我试图在其中执行以下操作的文件:

var searchString: String! = "Search"

if contains(myArray, searchString) {
     println("Exists")
}
else {
     println("Doesn't Exist")
}

每次我尝试 运行 上述代码时,我都会收到一条错误消息:

Cannot find an overload for 'contains' that accepts an argument list of type '(Array<String!>, String)'

我尝试了以下方法:

if myArray.contains(searchString) {
...

但是我收到一条错误消息:

'Array<String!>' does not have a member named contains

如何使用 contains 而不会 Swift 返回错误?

问题是隐式可选类型Array<String!>。删除感叹号,代码编译正常。 你真的需要可选类型吗?在许多情况下,您可以使用空字符串作为 "no string" 值。

contains() 函数有两种变体:

// 1
func contains<S : SequenceType, L : BooleanType>(seq: S, predicate: @noescape (S.Generator.Element) -> L) -> Bool
// 2
func contains<S : SequenceType where S.Generator.Element : Equatable>(seq: S, x: S.Generator.Element) -> Bool

您的代码调用第二个,这需要序列 元素符合 Equatable 协议。这是这种情况 String,但不适用于(隐式展开可选)String!

String 替换为 String! 将解决问题:

var myArray: Array<String> = []

如果这不可能,那么您可以使用第一个变体 contains() 使用 谓词 作为第二个参数:

// Swift 1.2:
if contains(myArray, { [=12=] == searchString } ) { ... }

// Swift 2:
if myArray.contains( { [=12=] == searchString } ) { ... }

在 swift 中定义一个字符串数组在这种情况下不应该是通用的,这对你有用

var myArray: [String] = []

var searchString: String! = "Search"

if contains(myArray, searchString) {
     println("Exists")
}
else {
     println("Doesn't Exist")
}

我认为您的问题与 myArray 的类型有关。为什么需要使用 String!?

这适用于 Swift 1.2

var myArray: Array<String> = []

var searchString: String = "Search"

if contains(myArray, searchString) {
    println("Exists")
}
else {
    println("Doesn't Exist")
}

这在 Swift 2.0 中(从 Xcode 7 Beta 3 开始)

var myArray: Array<String> = []

var searchString: String = "Search"

if myArray.contains(searchString) {
    print("Exists")
}
else {
    print("Doesn't Exist")
}