Generator
Swift中,Generator是任何实现了GeneratorType协议的类或者结构体。Generator可以理解为一个序列生成器。GeneratorType协议要求定义一个名为Element
的别名,并实现一个next
方法。
GeneratorType协议实现如下:
protocol GeneratorType{
typealias Element
mutating func next()->Element?}
语句typealias Element
要求实现这个协议的类必须定义一个名为Element的别名,这样一定程度上实现了泛型协议。协议同时要求实现next
函数,其返回值是别名中定义的Element
类型,next函数代表生成器要生成的下一个元素。
下面代码实现了一个菲波那契数列生成器:
classFibonacciGenerator:GeneratorType{var current =0, nextValue =1
typealias Element=Int
func next()->Element?{let ret = current
current = nextValue
nextValue = nextValue + ret
return ret
}}
下面代码打印出10个菲波那契数列,以显示如何使用生成器:
var n =10var generator =FibonacciGenerator()while n-->0{
println(generator.next()!)}
Generator是Sequence和Collection的基础。
Sequence
Sequence是任何实现了SequenceType协议的类或者结构体。Sequence可以理解为一个序列。SequenceType协议要求定义一个名为Generator,类型为GeneratorType的别名,并要求实现一个返回生成器Generator的函数。
SequenceType协议如下:
protocol SequenceType:_Sequence_Type{
typealias Generator:GeneratorType
func generate()->Generator}
类似于GeneratorType协议,typealias Generator : GeneratorType
要求实现这个协议的类必须定义一个名为Generator类型为GeneratorType的别名。协议同时要求实现一个名为generate
的函数,其返回值为别名Generator
定义的类型,这个类型应该实现了上文提到的GeneratorType协议。也就是说Sequence其实是包含一个生成Generator的函数的类。
下面代码使用上文中提到的菲波那契数列生成器,实现了一个菲波那契数列:
classFibonacciSequence:SequenceType{
typealias GeneratorType=FibonacciGenerator
func generate()->FibonacciGenerator{returnFibonacciGenerator()}}
下面代码打印了10个菲波那契数列,以显示如何使用该序列:
let fib =FibonacciSequence().generate()for _ in1..<10{
println(fib.next()!)}
符合SequenceType的序列有可能成为惰性序列。成为惰性序列的方法是对其显示的调用lazy函数:
let r = lazy(stride(from:1, to:8,by:2))
函数stride返回一个结构体StrideTo
,这个结构体是Sequence。所以,lazy函数返回一个lazySequence
对象。
Collection
Collection是实现了CollectionType协议的协议的类或者结构体。CollectionType协议继承了SequenceType协议。所以,Collection也都实现了SequenceType,它同时也是Sequence。
CollectionType协议如下:
protocol _CollectionType:_SequenceType{
typealias Index:ForwardIndexTypevar startIndex:Index{get}var endIndex:Index{get}
typealias _Element
subscript (_i:Index)->_Element{get}}
protocol CollectionType:_CollectionType,SequenceType{
subscript (position:Self.Index)->Self.Generator.Element{get}}
所以,CollectionType协议首先实现了SequenceType协议,并要求实现一个subscript
方法以获取序列中每个位置的元素值。
Swift中,大量内置类如Dictionary,Array,Range,String都实现了CollectionType协议。所以,Swift大部分容器类都可以变为惰性序列。
// a will be a LazyRandomAccessCollection// since arrays are random accesslet a = lazy([1,2,3,4])// s will be a LazyBidirectionalCollectionlet s = lazy("hello")
总结
Swift里的集合数据结构默认是严格求值的。但是,Swift也提供了惰性语法,在需要惰性时,你需要显式声明。这为开发者在Swift中使用惰性提供了条件。
demo:
import Foundation // 先定义一个实现了 GeneratorType protocol 的类型 // GeneratorType 需要指定一个 typealias Element // 以及提供一个返回 Element? 的方法 next() class ReverseGenerator: GeneratorType { typealias Element = Int var counter: Element init<T>(array: [T]) { self.counter = array.count - 1 } init(start: Int) { self.counter = start } func next() -> Element? { return self.counter < 0 ? nil : counter-- } } // 然后我们来定义 SequenceType // 和 GeneratorType 很类似,不过换成指定一个 typealias Generator // 以及提供一个返回 Generator? 的方法 generate() struct ReverseSequence<T>: SequenceType { var array: [T] init (array: [T]) { self.array = array } typealias Generator = ReverseGenerator func generate() -> Generator { return ReverseGenerator(array: array) } } let arr = [0,1,2,3,4] /* 对 SequenceType 可以使用 for...in 来循环访问.。 for...in其实做了: var g = array.generate() while let obj = g.next() { print(obj) } */ for i in ReverseSequence(array: arr) { print("Index \(i) is \(arr[i])") } /* 像map , filter reduce这些方法也可以使用 因为SequenceType接口扩展(protocol extension)已经实现了他们: extension SequenceType { func map<T>(@noescape transform: (Self.Generator.Element) -> T) -> [T] func filter(@noescape includeElement: (Self.Generator.Element) -> Bool) -> [Self.Generator.Element] @noescape combine: (T, Self.Generator.Element) -> T) -> T */ let aaa = ReverseSequence(array: arr) aaa.map { (Int) -> Int in return 1 }
thx:http://ju.outofmemory.cn/entry/127998
相关推荐
基于SystemGenerator/Simulink的FPGA联合开发方案.pdf
phantom.zip,幻象DSL
序列生成器(文件 ID #24620)已重命名为 CORE - 约束随机化环境。 本手册解释了 v0.91 的接口和代码结构。 ############ 当前的发展集中在这些主题上: - 性能相关问题- 错误修复(3 个已知问题) - 改进了约束...
mybatis-generator扩展,增加了批量插入和分页查询,附带说明文档
Mybatis-generator整合spring+PageHelper等技术的一个demo,仅供初学者使用参考
mybatisGenerator,包括自己写的bat和xml,配置xml然后运行bat即可
mybatis generator 是 eclipse代码生成插件,本资源可以在这 https://dl.bintray.com/mybatis/mybatis-generator/找到
mybatis-generator-config_1_0.dtd文件存在于mybatis-generator-core-1.3.2.jar包中,路径如下org/mybatis/generator/config/xml/mybatis-generator-config_1_0.dtd 可以设置开发工具的dtd配置,配置...
mybatis 的generator一个增删改查示例,generator先安装,我安装的地址http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/ 安装好后,右击generatorConfig.xml这个可以看到一个...
Informatica中Sequence Generator的两个有用的选项
先安装 eclipse插件安装地址:http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/ 然后再下载本项目,如果需要离线插件,请到笔者资源库查找 内含mysql 和 oracle 理论上sqlserver...
swift-parser-generator 是试验性的 Swift 解析器生成器。 swift parser generator 的代码包括尝试使用 Swift 制作类似 Scala 解析器关系选择器,部分可以成功制作简单的解析器,但是还未实现 Packrat 样式解析器。 ...
MyBatis Generator - http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/ 2 关闭eclipse 3 打开eclipse安装目录下的plugins目录 4 找到org.mybatis.generator.core_1.3.2....
2. 如果碰到Mybatis xml文件格式错误,请到https://mybatis.org/generator/configreference/xmlconfig.html 复制 文件头DOCTYPE, 覆盖原来的文件头即可。 <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis....
swift-init-generator, 使用 Swift 解析器生成初始化器的Xcode插件 swift-init-generator使用 Swift 解析器生成初始值设定项在选择包含变量声明的行之后,运行扩展命令生成相应的初始化器。示例 安装下载应用程序...
Laravel开发-laravel-generator laravel crud generator/model/migrate仅从一个命令开始,包括controller、service、repository、model、migrations、routes.php update。
json-data-generator 可帮助您构建用于测试数据目的的 json 数据。 它有许多不错的功能,您可以使用它们来构建所需的尽可能多的测试数据。 Maven 添加对com.github.vincentrussell:json-data-generator的依赖。 ...
我的天啊!!!!! Objection Model Generator是一个工具,可以通过使用information_schema表让我们知道表,列和BelongsToOneRelation从...const routes = require ( 'objection-model-generator/src/dbToRoutes' )
sequence-generator简介类似于oracle的sequence,但更加强大支持分布式环境下sequence的生成使用乐观锁和AtomicLong确保sequence的唯一性使用及其简单db scriptCREATE TABLE sequence_database.sequence ( name ...
virtualenv /path/to/scenery-generator/environment/ cd /path/to/scenery-generator/environment/ git clone ... source /path/to/scenery-generator/environment/bin/activate pip install beautifulsoup4 pip ...