Swift 3.0在集合类数据结构上的一些新变化总结

  • Post category:Python

Swift3.0在集合类数据结构上的一些新变化总结

Swift 3.0 在集合类数据结构上做了一些新的变化,本文将会对这些变化进行详细的讲解。

改动1:Sequence to Collection

在 Swift 3.0 中, Sequence 被拆分成了 Sequence 和 Collection 两种不同的协议。这些协议中的属性和方法按照数据结构的不同而有所不同。 Collection 协议包含了 Sequence 协议的所有属性和方法,同时还给定了一些用于访问和修改集合类数据结构的方法。

Collection 可以访问集合类数据结构的元素,Sequence 则不行。 Sequence 协议被用于那些只读数据结构,而 Collection 协议则被用于那些可读可写的数据结构。因此,从 Sequence 切换到 Collection 对于许多集合数据结构来说是一种非常自然的方式。

示例代码:

struct MySequence: Sequence {
    var items: [Int]
    func makeIterator() -> IndexingIterator<[Int]> {
        return items.makeIterator()
    }
}
let sequence = MySequence(items: [1, 2, 3])    // 使用 Sequence
for item in sequence {
    print(item)
}

struct MyCollection: Collection {
    var items: [Int]
    var startIndex: Int { return items.startIndex }
    var endIndex: Int { return items.endIndex }
    subscript(position: Int) -> Int {
        return items[position]
    }
    func index(after i: Int) -> Int {
        return items.index(after: i)
    }
}
let collection = MyCollection(items: [1, 2, 3])    // 使用 Collection
for item in collection {
    print(item)
}

上面的代码中,我们定义了两个结构体: MySequence 和 MyCollection ,一个遵循 Sequence 协议,另一个遵循 Collection 协议。我们可以看到,使用 Sequence 和 Collection 是有区别的。

改动2:函数名称的变更

Swift 3.0 在许多函数名称上进行了修改,这些函数名称的修改主要是为了更好地反映它们的用途。根据新的命名规则,带有 “prefix” 的函数前缀表示这些函数会在传入序列的每一个元素上调用一个闭包,返回一个新的序列。而没有 “prefix” 前缀的函数则只是对序列进行了各种计算,并返回一个单一的值。

示例代码:

let numbers = [1, 2, 3, 4, 5]

// 没有前缀
let sum = numbers.reduce(0, +)    // 15
let max = numbers.max()           // 5
let min = numbers.min()           // 1

// 带有前缀
let sumCollection = numbers.prefix(3).reduce(0, +) // 6
let oddNumbers = numbers.filter {$0 % 2 != 0}       // [1, 3, 5]
let doubleNumbers = numbers.map {$0 * 2}             // [2, 4, 6, 8, 10]

如上面展示的, 没有前缀的函数名称表示这些函数会完成一些常规的计算,例如求和、最大、最小值。而带有前缀的函数名称(如: prefix、drop、filter等)则表示这些函数会返回一个序列,因为它们会在传入序列的每一个元素上调用一个闭包,返回一个新的序列。

总结

Swift 3.0 在集合类数据结构上进行了一些较大的变化,包括将 Sequence 协议拆分为 Sequence 和 Collection 两种协议,以及修改许多函数名称以反映它们的作用。开发人员应该熟悉这些变化,以便更好地开发 Swift 应用程序。