参见英文答案 > Using multiple let-as within a if-statement in Swift
在Swift中,我使用if声明来检查我的对象是否不为零
if let obj = optionalObj
{
}

但有时候,如果允许声明,我必须面对连续

if let obj = optionalObj
{
    if let a = obj.a
    {
        if let b = a.b
        {
            // do stuff
        }
    }
}

我正在寻找一种避免连续的方式,如果允许声明。

我会尝试像:

if let obj = optionalObj && if let a = obj.a && if let b = a.b
{
    // do stuff
}

但是swift编译器不允许这样做。

任何建议?

之前我写了一些关于替代品的小文章: https://gist.github.com/pyrtsa/77978129090f6114e9fb

在其他答案中还没有提到一种方法,我喜欢,是添加一堆重载的每个功能:

func every<A,B>(a: A?,b: B?) -> (A,B)? {
    switch (a,b) {
        case let (.some(a),.some(b)): return .some((a,b))
        default:                       return .None
    }
}

func every<A,B,C>(a: A?,b: B?,c: C?) -> (A,C)? {
    switch (a,b,c) {
        case let (.some(a),.some(b),.some(c)): return .some((a,c))
        default:                                 return .None
    }
}

// and so on...

这些可以用于if语句,case表达式以及optional.map(…)链:

// 1.
var foo: Foo?
if let (name,phone) = every(parsedname,parsedPhone) {
    foo = ...
}

// 2.
switch every(parsedname,parsedPhone) {
    case let (name,phone): foo = ...
    default: foo = nil
}

// 3.
foo = every(parsedname,parsedPhone).map{name,phone in ...}

必须为每个添加重载是模板,但只能在库中完成一次。类似地,通过使用Functor方法(即使用< ^&&>运算符),您需要以某种方式创建curried函数,这也导致一些样板。

避免连续的“如果让”声明在Swift的更多相关文章

  1. ios – Swift:方法重载只在返回类型上有所不同

    我一直在看Swift类,其中定义了两种方法,它们的返回类型不同.我不习惯使用允许这种语言的语言,所以我去寻找描述它如何在Swift中工作的文档.我在任何地方都找不到任何东西.我本来期望在Swift书中有关于它的整个部分.这记录在哪里?

  2. ios – 在Swift中可以重载=运算符吗?

    可以在Swift中使用overload=运算符来接受例如CGFloat参数吗?我的方法(下面)不起作用.(编辑)重要:上面的编码方法确实有效.请seemyanswerbelow解释为什么我认为没有.解决方法对不起,我很难过.对于CGFloat参数,operator=不需要重载,因为Swift中包含了这样的重载.我试图做类似的事情这失败了,因为我无法放弃让XCode显示的错误让我感到困惑.当然,像我原来的问题(下面)中的方法适用于重载运算符.请随时投票以结束此问题.

  3. Swift 运算符重载

    但是现在还有另外一个Swift的特性,你应该知道并且会爱上它,它就是运算符重载。例如:我们在SwiftSpriteKitutilitylibrary代码中使用运算符重载去讲多个CGPoints对象相加,例如下面代码:1234letpt1=CGPointletpt2=CGPointletpt3=pt1+pt2letpt4=pt3*100方便吧?当一个人查看你的代码,他们希望操作符的默认行为,这时候运算符重载会使他们迷惑。幸运的是Swift让你能够定义属于你自己的自定义的运算符。

  4. Swift函数重载

    1、函数重载的概念函数的重载指的是多个函数享有相同的名字都是有不同的参数或返回值类型不同,它们互相成为重载关系,2、与其它语言的不同Swift函数的参数类型包含了参数列表类型和返回值类型,例如(Double,Double)->Double是由2个Double类型参数列表和Double类型的返回值类型构成,也就是说Swift中函数名相同,参数列表不同或者返回值类型不同的函数都可以构成重载,而在C++

  5. swift中使用xib

    在OC时代,使用xib来管理界面很简单,但是swift下使用xib有点小复杂。由于项目需要,有一个view需要重复使用,storyboard无法满足需求,使用xib更为简便。总结一下swift中使用xib的注意事项:1.新建cocoatouchclass,xib的file‘sowner设置成对应controller2.由于swift不会自动override父类的init方法,所以如果只是按照第一步来做得话,会报错,因此,我们必须手动添加init方法:以上两个方法必须重载,至于默认构造函数最好也重载:

  6. Swift学习笔记(十二)构造过程

    默认构造器Swift将为所有属性已提供默认值的且自身没有定义任何构造器的结构体或基类,提供一个默认的构造器。构造器的继承和重载跟Objective-C中的子类不同,Swift中的子类不会默认继承父类的构造器。Swift的这种机制可以防止一个父类的简单构造器被一个更专业的子类继承,并被错误的用来创建子类的实例。

  7. swift 重载 泛式 inout的使用

    swift重载泛式inout的使用函数func关键字->表示返回值信息等等那我们接下来利用函数做几件事情-a比较两个数字的大小-b比较两个字符串-c既能比较字符串,又能比较数字a情况b情况c情况特殊之处就在于这个Equatableinout总之1.swift中重载传递的参数类型不同也可以重载2.范式可以更好的兼容数据类型,利于不同类型数据的比较3.inout可以再一个没有返回值的函数修改该函数的形

  8. Swift 2.0学习笔记Day 39——构造函数重载

    Swift中构造函数可以多个,他们参数列表和返回值可以不同,这些构造函数构成重载。构造函数代理在结构体和类中使用方式是不同,先介绍结构体中构造函数代理。将上一节的示例修改如下:将Rectangle声明为结构体类型,其中也有4个构造函数重载。这种在同一个类型中通过self.init语句进行调用当前类型其它构造函数,其它构造函数被称为构造函数代理。横向代理类似于结构体类型构造函数代理,发生在同一类内部,这种构造函数称为便利构造函数。

  9. Swift 中的 数组排序 和 重载运算符

    数组排序首先拿到一个数组,然后这个是按照数字中Item元素的name属性来排序的代码片段:这个使用的方法是sortInPlace,还有另外一个方法是sort。如果使用了sort,那么原来的数组是不会有任何变化的,使用sortInPlace,会在原来的数组上做修改。还可以简化为:第二种写法没有传统的括号(),使用$0来标记两个$1数组中的对象可读性很好,这是Swift的闭包中很好的一个特性。

  10. Swift 3.构造函数-重载构造函数

    ViewController.swiftPerson.swiftStudent.swift

随机推荐

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

返回
顶部