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

时间:2015-04-16 15:34:30

标签: 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.")
]

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

let item = myArr.filter { $0.name == "Def" }.first
if item != nil {
  // Do something...
}

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

if myArr.contains { $0.name == "Def" } {
  // Do something...
}

我是否缺少任何简写语法或更好的方法?

2 个答案:

答案 0 :(得分:50)

为什么不使用内置的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

并且第一个将谓词作为参数。

if contains(myArr, { $0.name == "Def" }) {
    println("yes")
}

更新:截至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
}

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

if myArr.contains( { $0.name == "Def" }) {
    print("yes")
}

斯威夫特3:

if myArr.contains(where: { $0.name == "Def" }) {
    print("yes")
}

答案 1 :(得分:2)

恕我直言要实现所需的行为,你必须为数组创建一个扩展类,如下所示:

extension Array {
    func contains(test: (T) -> Bool, action: (T) -> Void) {
        let filtered = self.filter(test)
        if(filtered.is​Empty) {
            action(filtered)
        }
    }
}

我没有在我面前使用xcode,所以如果我有语法错误,我会道歉。但是,如果您经常使用,可以按如下方式编写

myArr.contains({ $0.name == "Def"}) {
   // Do something...
}

我会将其重命名为防止代码混淆。