Swift 2 Array包含对象?

时间:2016-02-16 21:25:44

标签: arrays swift contains

为什么这不起作用?我可以在String上使用array.contains()但它不适用于Object。

var array = ["A", "B", "C"]

array.contains("A") // True

class Dog {
    var age = 1
}

var dogs = [Dog(), Dog(), Dog()]
var sparky = Dog()
dogs.contains(sparky) // Error Cannot convert value of type 'Dog' to expected argument type '@noescape (Dog) throws -> Bool

4 个答案:

答案 0 :(得分:13)

您的Dog需要实施Equatable

class Dog: Equatable {

   var age = 1

}

func == (lhs: Dog, rhs: Dog) -> Bool {
      return lhs.age == rhs.age
}

答案 1 :(得分:10)

要真实地解释那里发生的事情,首先我们必须了解contains上有两种Array方法(或者更好地说,SequenceType)。

func contains(_ element: Self.Generator.Element) -> Bool

有约束

Generator.Element : Equatable

func contains(@noescape _ predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool

第一个基本上使用==在数组中搜索给定元素。第二个使用闭包返回Bool来搜索元素。

第一种方法无法使用,因为Dog没有采用Equatable。编译器尝试使用第二种方法,但是有一个闭包作为参数,因此你看到了错误。

解决方案:为Equatable实施Dog

如果您正在寻找对象引用比较,可以使用简单的闭包:

let result = dogs.contains({ $0 === sparky })

答案 2 :(得分:2)

夫特

如果您没有使用对象,则可以使用此代码进行包含。

let elements = [ 10, 20, 30, 40, 50]

if elements.contains(50) {

    print("true")

}

如果你在swift中使用NSObject类。这个变量是根据我的要求。你可以修改你的要求。

var cliectScreenList = [ATModelLeadInfo]()
var cliectScreenSelectedObject: ATModelLeadInfo!

这是针对相同的数据类型。

{ $0.user_id == cliectScreenSelectedObject.user_id }

如果您想要AnyObject类型。

{ "\($0.user_id)" == "\(cliectScreenSelectedObject.user_id)" }

完整条件

if cliectScreenSelected.contains( { $0.user_id == cliectScreenSelectedObject.user_id } ) == false {

cliectScreenSelected.append(cliectScreenSelectedObject)

print("Object Added")

} else {

print("Object already exists")

}

答案 3 :(得分:0)

此答案与OP的问题无关,但可能对遇到Swift错误消息的其他人有帮助

  

无法调用'包含'使用类型'(无论)'

的参数列表

但首先是快速测验:你能在这里发现问题吗?

internal class FrameworkAdminConnections {

   private var _localConnectionKeys = [Int]()

   ... other code omitted

   public func isLocalConnection(_ connectionKey : Int) {
      return _localConnectionKeys.contains(connectionKey)
   }
}   

Swift一直告诉我,我无法使用类型(Int)的参数列表调用contains(),这是一个非常无用的错误消息,我不敢承认我花了多长时间终于明白了。

真正的问题是Swift的推理引擎无法弄清楚contains()方法的结果应该 - 因为我愚蠢地没有指定" - >布尔"在isLocalConnection()方法签名!