用于测试Swift数组中是否存在对象的简写?

Tru*_*an1 22 arrays swift

目前,我有一个像这样的对象数组:

var myArr = [
  MyObject(name: "Abc", description: "Lorem ipsum 1."),
  MyObject(name: "Def", description: "Lorem ipsum 2."),
  MyObject(name: "Xyz", description: "Lorem ipsum 3.")
]
Run Code Online (Sandbox Code Playgroud)

我正在测试一个对象是否存在,然后继续这样做:

let item = myArr.filter { $0.name == "Def" }.first
if item != nil {
  // Do something...
}
Run Code Online (Sandbox Code Playgroud)

但我正在寻找一种更短的方法,因为我做了很多.我想做这样的事情,但它是无效的:

if myArr.contains { $0.name == "Def" } {
  // Do something...
}
Run Code Online (Sandbox Code Playgroud)

有没有我缺少的简写语法或更好的方法吗?

Mar*_*n R 53

为什么不使用内置contains()功能?它有两种口味

func contains<S : SequenceType, L : BooleanType>(seq: S, predicate: @noescape (S.Generator.Element) -> L) -> Bool
func contains<S : SequenceType where S.Generator.Element : Equatable>(seq: S, x: S.Generator.Element) -> Bool
Run Code Online (Sandbox Code Playgroud)

第一个将谓词作为参数.

if contains(myArr, { $0.name == "Def" }) {
    println("yes")
}
Run Code Online (Sandbox Code Playgroud)

更新:从Swift 2开始,两个全局contains()函数都被协议扩展方法取代:

extension SequenceType where Generator.Element : Equatable {
    func contains(element: Self.Generator.Element) -> Bool
}

extension SequenceType {
    func contains(@noescape predicate: (Self.Generator.Element) -> Bool) -> Bool
}
Run Code Online (Sandbox Code Playgroud)

并且第一个(基于谓词)用作:

if myArr.contains( { $0.name == "Def" }) {
    print("yes")
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特3:

if myArr.contains(where: { $0.name == "Def" }) {
    print("yes")
}
Run Code Online (Sandbox Code Playgroud)