Swift 将 .net 中作为 LINQ 捆绑在一起的几个功能结合在一起,尽管可能不是开箱即用的意义。
匿名类型非常接近 Swift 中具有命名值的元组。
在 C# 中:
var person = new { firstName = "John", lastName = "Smith" };
Console.WriteLine(person.lastName);
输出:Smith
在斯威夫特中:
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());
}
在斯威夫特中:
// 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 wikipedia article:
计数
Count 运算符计算给定集合中元素的数量。采用谓词的重载,计算与谓词匹配的元素数。
可以像这样用 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]