gpt4 book ai didi

swift - 将 optional 项分配给惰性属性的更优雅的方法

转载 作者:行者123 更新时间:2023-12-04 09:54:27 25 4
gpt4 key购买 nike

假设我们有一个 lazy imageView我们想初始化它 只有如果有要分配的图像。所以我们每次都需要检查图像值:

lazy var imageView1 = UIImageView()
lazy var imageView2 = UIImageView()

var image: UIImage?
var someOptional: SomeType?

func addImage1IfNeeded() {
guard let image = image else { return }
imageView1.image = image
}

func addImage2IfNeeded() {
guard let image = someOptional?.someChildOptional?.image else { return }
imageView2.image = image
}

所以如果我们有很多 optional s 和 lazy变量和一些 optional 链接 在某些情况下,我们会有大量重复的代码。

什么是更优雅的方式来做到这一点? (也许使用运算符? optional 扩展?)

请注意 这不是为了优化。这个例子是总结性的,当你想在没有数据呈现的情况下不添加 UI 元素时,就会发生最初的问题。在其他情况下也是如此。

最佳答案

一种方法是使用这样的运算符:

infix operator ?=>
func ?=>(lhs: Any?, rhs: @autoclosure ()->()) {
guard lhs != nil else { return }
rhs()
}
用法:
image ?=> (imageView1.image = image)
我不知道我们是否可以结合第一个和最后一个参数,因为它们总是相同的。

更新 - 选项 2
遵循@Sweeper 的评论:
func ?=><T>(lhs: T?, rhs: (T)->()) {
guard let lhs = lhs else { return }
rhs(lhs)
}
用法:
someOptional?.someChildOptional?.image = { imageView2.image = $0 }
它更适合长时间的 optional 更改,但需要花括号和 $论点(我忘记了它的名字)

关于swift - 将 optional 项分配给惰性属性的更优雅的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61951496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com