Swift 中的某些东西类似于 C# 中的 LINQ

Is something in Swift like LINQ in C#

我知道 Swift 还比较新,但我想知道 Swift 在 C# 中是否有类似 LINQ 的东西?

对于 LINQ,我指的是所有出色的工具,例如 标准查询运算符 Anonymous types对象初始化程序

我个人会使用 CoreData 或 NSPredicate 来实现某些类似 LINQ 的功能。我确定它与 Swift 相吻合。我只在 Objective-C 中使用过它,但我看到人们用 Swift 实现它的文章。

http://nshipster.com/nspredicate/

Swift 结合了 .net 中作为 LINQ 捆绑在一起的几个功能,尽管可能不是开箱即用的感觉。

匿名类型与 Swift 中具有命名值的元组非常接近。

在 C# 中:

   var person = new { firstName = "John", lastName = "Smith" };
   Console.WriteLine(person.lastName);

Output: Smith

在Swift中:

var person = (firstName: "John", lastName: "Smith")
person.firstName = "Fred"
print(person.lastName)

Output: Smith

LINQ 查询当然非常 powerful/expressive,但您可以在 [=57] 中使用 mapfilterreduce 复制它们所做的大部分工作=].使用 lazy,您可以获得与创建可提前循环的对象相同的功能,并且仅在循环实际发生时才对其求值:

在 C# 中:

var results =
 SomeCollection
    .Where(c => c.SomeProperty < 10)
    .Select(c => new {c.SomeProperty, c.OtherProperty});

foreach (var result in results)
{
    Console.WriteLine(result.ToString());
}

在Swift中:

// just so you can try this out in a playground...
let someCollection = [(someProperty: 8, otherProperty: "hello", thirdProperty: "foo")]

let results =
  someCollection.lazy
    .filter { c in c.someProperty < 10 }
    // or instead of "c in", you can use [=13=]:
    .map { ([=13=].someProperty, [=13=].otherProperty) }

for result in results {
    print(result)
}

Swift 泛型使类似于现有 LINQ 功能的编写操作变得非常简单。例如,来自 LINQ wikipedia article:

Count The Count operator counts the number of elements in the given collection. An overload taking a predicate, counts the number of elements matching the predicate.

在Swift中可以这样写(2.0协议扩展语法):

extension SequenceType {
    // overload for count that takes a predicate
    func count(match: Generator.Element -> Bool) -> Int {
        return reduce(0) { n, elem in match(elem) ? n + 1 : n }
    }
}

// example usage
let isEven = { [=14=] % 2 == 0 }

[1,1,2,4].count(isEven)  // returns 2

如果元素符合 Equatable:

,您也可以重载它以获取特定元素进行计数
extension SequenceType where Generator.Element: Equatable {
    // overload for count that takes a predicate
    func count(element: Generator.Element) -> Int {
        return count { [=15=] == element }
    }
}

[1,1,2,4].count(1)

默认情况下,结构具有类似对象初始化程序的语法:

struct Person { let name: String; let age: Int; }

let person = Person(name: "Fred Bloggs", age: 37)

并且通过 ArrayLiteralConvertible,任何集合类型都可以具有与集合初始值设定项语法相似的语法:

let list: MyListImplementation = [1,2,3,4]

另请参阅:

https://github.com/slazyk/SINQ

虽然它有点过时了,因为 Swift 现在包含原生的 lazy() 功能。