作者:Erica Sadun,原文链接,原文日期:2016-05-11
译者:pucca;校对:wiilen;定稿:CMB

昨天在 Swift-Users 有人提问如何防止序列(sequence)为空。这个问题来源于如何在断言(predicate)中测试一个序列,由此引发的问题是如果序列为空,会返回 true 来满足断言。

我们先不考虑这种处理是否有问题(我认为这种处理是正确的,因为一个空序列里没有元素,对元素的断言也就不会失败),Jeremy Pereira 提出了一个相当巧妙的解决方案:

func all(@noescape where predicate: Generator.Element throws -> Bool) rethrows -> Bool {
    var count = 0
       for element in self {
        guard try predicate(element) else { return false }
        count += 1
       }
       return count > 0
}

但从此讨论中延伸出的另一个大问题是“如何优雅地判断一个序列是否为空?”。我的方法是用缓冲区(buffer)并进行预处理。以下是我的第一次尝试,粗糙不堪,请不吝指教。

public struct BufferedSequence<Base : SequenceType>:GeneratorType,SequenceType {
    
    internal var _base: Base
    internal var _generator: Base.Generator
    public var bufferedElement: Base.Generator.Element?
    
    public init(_ base: Base) {
        _base = base
        _generator = base.generate()
        bufferedElement = _generator.next()
    }

    public mutating func next() -> Base.Generator.Element? {
        defer {
            if bufferedElement != nil {
                bufferedElement = _generator.next()
            }
        }
        return bufferedElement
    }
    
    public func isEmpty() -> Bool {
        return bufferedElement == nil
    }
}

有趣的是,写这个小东西最难的不是如何进行预处理,而是将 Swift 3 的语法转换回 Swift 2.2,这样我就能在 playground 中进行混编了。

你的语法转换进行的怎样了?已经全部转换成 3 的语法了?还是坚守 2.2 写生产代码?

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。

防止序列为空的更多相关文章

  1. 使用xib创建自定义视图

    但是,您必须接受您的XIB将包含根视图或其他内容,这些视图将作为子视图添加到放入Placement的类的实例中.这样,你应该有类似的东西:XIB与您的自定义视图内容:添加XIB的位置:由于添加到展示位置的视图实例与XIB中的文件所有者相同,因此您可以在XIB和Placement中设置出口和操作.只是不要忘记你的XIB中的根视图不是UIKit将创建放置到Placement的实例.为方便起见,请在下面找到我的代码,该代码是基类,以便于创建此类视图:

  2. 防止序列为空

    作者:EricaSadun,原文链接,原文日期:2016-05-11译者:pucca;校对:wiilen;定稿:CMB昨天在Swift-Users有人提问如何防止序列为空。这个问题来源于如何在断言中测试一个序列,由此引发的问题是如果序列为空,会返回true来满足断言。我们先不考虑这种处理是否有问题,JeremyPereira提出了一个相当巧妙的解决方案:但从此讨论中延伸出的另一个大问题是“如何优雅地判断一个序列是否为空?”。本文由SwiftGG翻译组翻译,已经获得作者翻译授权,最新文章请访问http://

  3. 为什么在Swift中甚至需要便利关键字?

    由于Swift支持方法和初始化程序重载,因此可以将多个init放在一起,并使用任何您认为方便的:那么为什么便利关键字也存在呢?`我在thisanswer年轻微触及它,其中我详细地覆盖了Swift的初始化规则,但主要关注的是所需的词。因为Swift不允许未初始化的变量,所以不能保证从你继承的类继承所有(或任何)初始化器。所以方便关键字做的是告诉我们哪些初始化器可以被添加没有默认值的实例变量的子类继承。它只意味着Inheritor只有一个指定的初始化器。

  4. swift – 检查Hashable一致性

    我有一个基本协议(模型),一些结构符合.它们也符合Hashable我有一个函数,它接受一个符合Model的对象数组.如何将[Model]传递给需要Hashables而不制作ModelHashable的函数?我试图避免这种情况因为当我这样做时,我得到“模型不能用作通用约束……”

  5. swift – Sprite-kit:在圆形路径中移动元素

    我正试图让元素在cercle的边缘移动.>我已经在屏幕中间创建并定位了一个cercle:>然后我创建了另一个精灵并在其上添加了一个动作:宇宙飞船的第一次旋转(见下图)完全遵循圆的边缘,但第二次迭代改变了宇宙飞船的位置并将其移出屏幕边界.这是正常的还是我做错了什么?

  6. 如何在Swift中用它创建类和实例对象的数组?

    能够实例化适当的对象?您只需要一个必需的init,一些方法来创建一个实例,该实例将在您希望其工作的所有类型之间共享.保存init方法的协议可以正常工作.显然,当init不需要参数时,这种方法最简单.缺点是您需要向下转换结果实例.

  7. JSP页面文件中base标记用法实例分析

    这篇文章主要介绍了JSP页面文件中base标记用法,以实例形式较为详细的分析了JSP中base标记的功能与具体使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

  8. PHP 实现base64编码文件上传出现问题详解

    这篇文章主要介绍了PHP 实现base64编码文件上传出现问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  9. js继承 Base类的源码解析

    Base据说是最好的js继承的封装类,最近读了一下base2.js的继承部分,现在将源码的解析贴下,有错误的地方希望大家指出,我会更新的.

  10. javascript Base类 包含基本的方法

    一个Base类,包含基本的方法,大家可以在这个基础上拓展下功能。

随机推荐

  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,所以编译器会报错,现在来一一解决。

返回
顶部