swift - 在一行中转换值并从中获取属性

标签 swift

我想将以下几行写成一行语句:

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/

相关文章:

java - 使用 REST API 将 swift 3 webservice 多次数据插入数据库

swift - iOS - UI 标签未更新

ios - 在 Swift 中访问静态 Objective-C 方法

ios - 如何在 Swift 3.0 中以编程方式使用自动布局将 UIView 容器内的 2 个或更多 UIView 水平居中

ios - 获取正在旋转的 View 内的 subview 框架(CGAffineTransform)

ios - 如何使用 Moya pod 为请求设置超时?

ios - 如何在 Swift 的小数位拆分字符串?

swift - config.preparations.append(modelName.self) 错误使用未解析的标识符 'modelName'

ios - Travis CI 上的 Carthage 缓存

ios - swift 3 : Tab Bar Controller Image Size Issue