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
相关推荐
Swift Generator 0.22.0 是一个开源项目,它主要设计用于生成 Swift 代码,以便简化编程工作。这个项目的重点在于提供一种高效的方式,通过DSL(Domain-Specific Language)来定义代码结构,并自动生成相应的Swift源...
标题中提到的“基于SystemGenerator/Simulink的FPGA联合开发方案”涉及到两个重要的概念:SystemGenerator和Simulink。SystemGenerator是Xilinx公司XtremeDSP计划的关键部分,它是一个用于FPGA开发的图形化工具,...
序列生成器(文件 ID #24620)已重命名为 CORE - 约束随机化环境。 本手册解释了 v0.91 的接口和代码结构。 ############ 当前的发展集中在这些主题上: - 性能相关问题- 错误修复(3 个已知问题) - 改进了约束...
Swift-Swift-Video-Generator 是一款专为Swift开发者设计的库,用于高效地处理视频制作任务,包括将图片和音频合成视频以及合并多个视频。这个库为iOS、macOS等Apple平台上的应用开发提供了便利,让开发者可以轻松...
MyBatis Generator(MBG)是一款强大的自动化代码生成工具,它是MyBatis框架的一个扩展,主要用于自动生成MyBatis的Mapper接口、Mapper XML文件、实体类以及DAO实现类等,大大提高了开发效率。"mybatis-generator-...
Mybatis-generator是一个强大的工具,它能够自动生成Mybatis的映射文件、模型类以及DAO接口,极大地提高了开发效率。在Java开发中,Mybatis作为一款轻量级的持久层框架,以其灵活、易于理解的特性深受开发者喜爱。而...
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(MBG)是一个实用工具,它可以在数据库中自动逆向工程表,生成MyBatis的映射文件、Java模型类和DAO接口。这个工具极大地简化了开发过程,减少了手动编写这些常见代码的工作量。在你提供的信息中,...
Informatica 中 Sequence Generator 的两个有用的选项 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....
sequence-generator简介类似于oracle的sequence,但更加强大支持分布式环境下sequence的生成使用乐观锁和AtomicLong确保sequence的唯一性使用及其简单db scriptCREATE TABLE sequence_database.sequence ( name ...
snmp_exporte 工具集合包 ...2、*.mib加到snmp_exporter/generator/mibs/里面 3、编写snmp_exporter/generator/generator.yml 留下保留监控项 4、运行make docker-generate 5、生成的snmp_exporter/generator/snmp.yml
2. 如果碰到Mybatis xml文件格式错误,请到https://mybatis.org/generator/configreference/xmlconfig.html 复制 文件头DOCTYPE, 覆盖原来的文件头即可。 <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis....
mybatis 的generator一个增删改查示例,generator先安装,我安装的地址http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/ 安装好后,右击generatorConfig.xml这个可以看到一个...
本资料"Medoc sequence generator.rar"正是关于三菱PLC的一个具体应用实例,主要探讨了如何利用PLC实现序列生成功能,这对于自动化生产线、设备控制等场景尤为重要。 首先,我们来理解一下“Medoc sequence ...
【SEQUENCE GENERATOR】是一种序列生成器,它主要用于生成二进制或离散值的序列,具有高度的灵活性,能够根据需求进行调整。专利号EP19990920786和EP1078457B1表明这是一项欧洲专利,由TELEFONAKTIEBOLAGET L ...
<generator class="sequence"> <param name="sequence">序列名</param> </generator> </id> ``` 3. **native**:这个策略是跨数据库兼容的,它会根据所使用的数据库方言来选择合适的 ID 生成方式。例如,在 ...
【SEQUENCE GENERATOR】是一种序列生成器,特别适用于生成二进制或离散值的序列,具有高度的灵活性,能够根据需求进行调整。专利号EP1078457B1表明这是一个已授权的欧洲专利,最初申请于1999年4月26日,公开日期为...