Swiftはまだ比較的新しいことを知っていますが、Swiftが [〜#〜] linq [〜 #〜] C#で?
LINQとは、Standard Query Operators、 Anonymous types 、Object Initializerなど.
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でmap
、filter
、reduce
を使用すると、クエリの大部分を複製できます。 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]
個人的には、LINQのような機能にCoreDataまたはNSPredicateを使用します。これはSwiftと一致します。確かに。Objective-Cでのみ使用しましたが、Swiftで実装する人の記事を目にしました。