web-dev-qa-db-ja.com

SwiftにあるものはC#のLINQに似ています

Swiftはまだ比較的新しいことを知っていますが、Swiftが [〜#〜] linq [〜 #〜] C#で?

LINQとは、Standard Query OperatorsAnonymous typesObject Initializerなど.

22
Victor Sigler

Swiftには、LINQとして.netにバンドルされているいくつかの機能が組み込まれていますが、非常に独創的な意味ではない可能性があります。

匿名型は、Swiftの名前付き値を持つタプルに非常に近いものです。

C#の場合:

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

出力:Smith

Swiftの場合:

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

出力:Smith

LINQクエリはもちろん非常に強力で表現力がありますが、Swiftで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 $0:
    .map { ($0.someProperty, $0.otherProperty) }

for result in results {
    print(result)
}

Swiftジェネリックは、既存のLINQ機能に似た書き込み操作を非常に簡単にします。たとえば、 LINQウィキペディアの記事 から:

CountCount演算子は、指定されたコレクション内の要素の数をカウントします。述語を取るオーバーロードは、述語に一致する要素の数をカウントします。

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 = { $0 % 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 { $0 == 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]
55

以下も参照してください。

https://github.com/slazyk/SINQ

Swiftにはネイティブのlazy()機能が含まれるようになったため、少し時代遅れですが。

2
Teejay

個人的には、LINQのような機能にCoreDataまたはNSPredicateを使用します。これはSwiftと一致します。確かに。Objective-Cでのみ使用しましたが、Swiftで実装する人の記事を目にしました。

http://nshipster.com/nspredicate/

2
Apollo SOFTWARE