目前,我有一系列像这样的对象:
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...
}
我是否缺少任何简写语法或更好的方法?
答案 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.isEmpty) {
action(filtered)
}
}
}
我没有在我面前使用xcode,所以如果我有语法错误,我会道歉。但是,如果您经常使用,可以按如下方式编写
myArr.contains({ $0.name == "Def"}) {
// Do something...
}
我会将其重命名为防止代码混淆。