前言

GeneratorsSequences构成了Swift式循环。

Generators

提到数组我们就会想到遍历,一般的遍历可能都是从头到尾进行的。但是如果你有特殊的需求呢。你可能不想呆板的进行遍历。这时候Generators就可以派上用场了。

一个字:Generators的存在是进行特殊癖好的数组遍历,其筛选出符合该癖好的下标索引到数组没有元素为止。

怎么玩

任意一个generator都需要遵从如下协议:

protocol GeneratorType { 
    typealias Element
    func next() -> Element?
}

根据上述协议,该协议需要元素类型以及一个next()函数。

举个倒序索引的generator:

class CountdownGenerator: GeneratorType {
    typealias Element = Int
    var element: Element

    init<T>(array: [T]) {
        self.element = array.count - 1
    }

    func next() -> Element? {
        return self.element < 0 ? nil : element--
    }
}

// TEST CASE
let xs = ["A","B",152)">"C"]
let generator = CountdownGenerator(array: xs)
while let i = generator.next() {
    println("Element \(i) of the array is \(xs[i])")
}

好处是啥

好处是啥,我的总结是把一个很抽象遍历模式使用Generators的方式剥离出来,当你对当前的迭代循环方式不爽的时候只需要修改一下当前的这个generator。更直观的“头疼医头,脚疼医脚”。

Sequences

Generators在循环过程中每个元素提供的服务是一次性的。所以我们想做倒回操作的话需要生成一个新的generator。若不想这样则需要用上sequence,其遵从另外一个协议SequenceType

怎么玩

protocol SequenceType {
    typealias Generator: GeneratorType 
    func generate() -> Generator
}

通过协议我们知道每个sequence都与一个generator类型已经一个generator构造器绑定在一起。我们可以使用这个遍历sequence

举个栗子,我们可以使用CountdownGenerator来定义一个sequence从而生成一个倒序的数组。

struct ReverseSequence<T>: SequenceType {
    var array: [T]
    init(array: [T]) {
        self.array = array
    }

    typealias Generator = CountdownGenerator func generate() -> Generator {
        return CountdownGenerator(array: array)
    }
}

// TEST CASE
    let xs = ["C"]
    let reverseSequence = ReverseSequence(array: xs)
    let reverseGenerator = reverseSequence.generate()
    while let i = reverseGenerator.next() {
        println("Index \(i) is \(xs[i])")
    }

    // 利用熟悉的OO
    for i in ReverseSequence(array: xs) {
        println("Index \(i) is \(xs[i])")
    }

不用每次进行Loop操作的时候都去生成一个新的generator,提升代码的统一性。


转载地址:http://segmentfault.com/a/1190000002464158

Swift:Generators 与 Sequences 浅析的更多相关文章

  1. ios – 数组的数组.仅存储副本

    我需要存储一个Int数组的数组,用于有序重复.例:>给定数组:mainArray=[7,7,3,2,1,5,5]现在我需要创建一个int数组的数组.例:这是我有的:解决方法您可以使用reduce方法.减少工作如何?reduce将封闭中的逻辑应用于空的2D数组的整数和数字的第一个elm.然后再次应用上一次迭代的结果和第二个整数数组…if是否检查在结果中添加的最后一个数组中的数字是否等于当前检查的整数.如果这样,那个整数被添加到该数组.否则,只会添加一个仅包含新整数的数组.测试

  2. Swift:Generators 与 Sequences 浅析

    前言Generators与Sequences构成了Swift式循环。Generators提到数组我们就会想到遍历,一般的遍历可能都是从头到尾进行的。这时候Generators就可以派上用场了。举个倒序索引的generator:好处是啥好处是啥,我的总结是把一个很抽象遍历模式使用Generators的方式剥离出来,当你对当前的迭代循环方式不爽的时候只需要修改一下当前的这个generator。SequencesGenerators在循环过程中每个元素提供的服务是一次性的。

  3. 再探Swift基础

    基础tuplesstringsnumericfor循环while循环if条件switchoptionalarraydictionaryset

  4. swift排序算法和数据结构

    vararrayNumber:[Int]=[2,4,216)">6,216)">7,216)">3,216)">8,216)">1]//冒泡排序funcmaopao->[Int]{forvari=0;i

  5. Arrray 中的map和filter 函数的使用

    swift中的Array提供了两个很方便的函数map和filter使用map可以建立一个从A数组到B数组的一个映射,例如:我们给数组的每个元素后添加一个testvararray=["1","2","3"];printlnfuncfx->String{returnstr+"test"}我们还可以使用filter函数按条件过滤一些不符合条件的数组例如:vararray=[1,4,10];array=array.filterprintln//结果[4,10]另外一种写法:array.filter

  6. Swift 2.0学习笔记Day 17——Swift中数组集合

    数组中的集合元素是有序的,可以重复出现。varstudentList1:ArrayvarstudentList2:[String]声明的Array还不能用,还需要进行初始化,Array类型往往在声明的同时进行初始化。示例代码如下:varstudentList1:Array=["张三","李四","王五","董六"]varstudentList2:[String]=["张三","董六"]letstudentList3:[String]=["张三","董六"]varstudentList4=[String](

  7. Swift高级开发语言基础

  8. Swift关于Array的探讨

    当我们想向Array添加不同数据类型的元素时,可以这样做:这样我们便可以向Array添加任何数据类型的元素了,但是如果我们希望Array中只能添加特定几种类型的元素怎么办呢?这里提供一种思路:

  9. 《从零开始学Swift》学习笔记Day 17――Swift中数组集合

    数组中的集合元素是有序的,可以重复出现。,Array类型往往在声明的同时进行初始化。整个遍历过程与循环分不开,可以使用for-in循环。下面是遍历数组的示例代码:运行结果如下:张三李四王五Item1:张三Item2:李四Item3:王五欢迎关注关东升新浪微博@tony_关东升。

  10. Swift学习 数组

    1、计算数组的长度count:计算数组的长度2、判断数组是否为空isEmpty:判断数组是否为空3、在数组尾部添加元素append:在数组尾部添加元素4、通过下标修改数组元素的值5、数组的插入insert:通过insert和下标向数组中插入元素6、数组的删除7、数组的遍历8、数组的拼接

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部