作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
通常,当我用自己的 subview 创建自定义 View 时,它往往看起来像这样:
class MyView : UIView {
var myButton : UIButton?
var myLabel : UILabel?
override init(frame: CGRect) {
super.init(frame: frame)
//Create the frames and such
myButton = UIButton(frame: myButtonsFrame)
myLabel = UILabel(frame: myLabelsFrame)
}
// Do other things
}
这在技术上是可行的,但它似乎违反了 Swift 中可选值的整个概念。因为我的 subview 总是被创建,所以它们不应该有 ?
。
但是,因为它们确实存在,所以我经常被迫检查它们是否为 nil 或强制解包,即使我知道它们永远不应该是,如果是,它们应该会在 init 中失败。
有更好的方法吗?
最佳答案
是的,只需切换代码即可:
class MyView : UIView {
var myButton : UIButton
var myLabel : UILabel
override init(frame: CGRect) {
myButton = UIButton(frame: myButtonsFrame)
myLabel = UILabel(frame: myLabelsFrame)
super.init(frame: frame)
}
// Do other things
}
您只需确保在调用 super.init
之前已初始化所有存储的属性。
或者,您可以将属性声明为隐式展开的可选值,如 UILabel!
和 UIButton!
如果您 100% 确定它们在第一次您之前设置了值尝试访问它们的任何属性或函数。
请注意,@tmpz 在评论中所说的是正确的 - 如果您不打算使用 let
而不是 var
将属性声明为常量在 init
之后更改它们的值。
关于ios - 在 Swift 中,有没有办法以编程方式添加我可以在整个类中使用的 subview ,而无需可选属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34728699/
我是一名优秀的程序员,十分优秀!