我创建了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
但这不再是一条线......我怎么能改善呢?
谢谢!
答案 0 :(得分:1)
我猜编译器无法将类型推断为ImplicitlyUnwrappedOptional
。尝试:
self.myLabel = .Some(self.view.createAndAddSubview())
或
extension UIView {
func createAndAddSubview<T:UIView>() -> T? {
let view = T()
self.addSubview(view)
return view
}
}