加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift:调用可选变量的方法

发布时间:2020-12-14 05:41:27 所属栏目:百科 来源:网络整理
导读:所以我知道’
所以我知道’!’之间的区别和’?’,我只想知道在调用可选变量的方法时使用它们的最佳方法是什么
var bar: Bar? = nil

bar?.doSomething()  // this will be valid,but wouldn't call doSomething
bar!.doSomething() // Given error: EXC_BAD_INSTRUCTIONS (Obviously)

但是当’bar’不为零时,这两个方法调用都是有效的.

bar = Bar()
bar?.doSomething()  // Valid
bar!.doSomething()  // Valid

所以我的问题是,什么是调用可选变量的方法的最佳方式,我个人使用:

if bar != nil {
    bar!.doSomething()
}

或者将bar?.doSomething()做的完全一样?

我认为这是不正确的建议,以避免bar?.doSomething(),并始终使用如果让bar = bar {…}代替.

主要有两个原因:

首先,bar?.doSomething()只是简明扼要.如果您正在使用条件表达式中的一个语句编写一个let,那么您应该问自己是否不希望将该代码放在一个较短版本的单行上.

虽然这是完全合法的代码

if let thing = thing {
    thing.bar()
}

..以下是合法的,只是短了很多..

thing?.bar()

第二,更重要的是这个问题的核心,它们是不一样的!如果let是一个组合测试,可选的解包和赋值吧?做一个叫做可选链接的东西.

后者在许多情况下非常有用,可以让您编写更好的代码.例如:

它可以用来代替这个..

var imageGenerator: ImageGenerator?

if let generator = imageGenerator {
    myView.image = generator.generateImage()
} else {
    myView.image = nil
}

简单地说:

myView.image = self.imageGenerator?.generateImage()

原因是因为可选链接在链中遇到零时返回零.因为UIImageView有一个图像:UIImage?,它需要这个零值.即使它来自ImageGenerator?

当与无合并运算符组合时,它更有用.

现在你可以转这个代码..

var imageGenerator: ImageGenerator?

if let generator = imageGenerator {
    myView.image = generator.generateImage()
} else {
    myView.image = DefaultImage
}

..进..

myView.image = generator?.makeImageGenerator() ?? DefaultImage

这是更简洁的方式.

并且因为可选链在链上工作..你甚至可以做一些像:

myView.image = delegate?.makeImageGenerator()?.generateImage() ?? DefaultImage

哪个会变成..

if let delegate = delegate {
    if let generator = delegate.generatorForImage() {
        if let image = generator.generateImage() {
            myView.image = image
        } else {
            myView.image = DefaultImage
        }
    } else {
        myView.image = DefaultImage
    }
} else {
    myView.image = DefaultImage
}

..如果您没有使用可选链接和无合并运算符.

(是的,myView.image = DefaultImage只能在有条件地完成,但这意味着你仍然必须引入额外的代码来检查它是否被设置,它不会更短.)

那里有两个新的技巧:-)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读