我想将以下几行写成一行语句:
var myBool = false
if let myButton = myView.subView.button as? MyButton {
myBool = !myButton.isValid
}
是否可以这样做,如果 myButton
不是 MyButton
的类型,我在简短的语句中包含所有内容,它也会返回 false?
最佳答案
如果你真的想把它放在一条线上,你可以这样做:
let myBool = !((myView.subView.button as? MyButton)?.isValid ?? true)
这是我能够想到的最简洁的方法,它具有您概述的预期行为。然而,它远非易读。
然而,想要单行方法的明确原因可能是 myBool
可以用 let
声明为常量,对吗?
这里的替代方法可能是一种方法:
func isValidButton(testView: UIView) -> Bool {
guard let button = testView as? MyButton else {
return false
}
return button.isValid
}
所以这是多行,但人们更容易阅读这里发生的事情。在调用的地方,它仍然是一行并允许 let
声明你的 bool 变量:
let myBool = !isValidButton(myView.subView.button)
请记住,这甚至不必是类中的方法。如果您只在一个地方需要它,它可以是一个局部作用域的闭包。
func viewDidLoad() {
super.viewDidLoad()
let isValidButton = { (testView: UIView) -> Bool in
guard let button = testView as? MyButton else {
return false
}
return button.isValid
}
let myBool = !isValidButton(myView.subView.button)
// do some things
}
这里需要注意的是,我只假设您的 MyButton
继承自 UIView
并且 UIView
可能是 myView .subView.button
被声明为返回。实际上,您的 isValidButton()
闭包应该采用 myView.subView.button
返回的任何类型的参数(可能是 UIButton
),并且大概是类型要么是 MyButton
的父级,要么是 MyButton
遵循的协议(protocol)。
关于swift - 在一行中转换值并从中获取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35114211/