我创建了UIView的扩展,以便能够在一行中创建和添加子视图:
extension UIView {
func createAndAddSubview<T:UIView>() -> T {
let view = T()
self.addSubview(view)
return view
}
}
这适用于普通声明:
let myLabel:UILabel = view.createAndAddSubview()
var myImageView:UIImageView = view.createAndAddSubview()
但是使用隐式包装的可选参数,我会遇到编译器错误。我认为这是因为可选选项阻止编译器确定正确的类型。
“ UIView”不可转换为“ UILabel”
class MyController {
var myLabel:UIlabel!
func foo() {
myLabel = view.createAndAddSubview()
}
}
我当然可以像这样工作
let myLabel:UILabel = view.createAndAddSubview()
self.myLabel = myLabel
但这不再是一条线了……我该如何改善呢?
谢谢!
最佳答案
我猜编译器无法将类型推断为其ImplicitlyUnwrappedOptional
。尝试:
self.myLabel = .Some(self.view.createAndAddSubview())
要么
extension UIView {
func createAndAddSubview<T:UIView>() -> T? {
let view = T()
self.addSubview(view)
return view
}
}