我创建了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
    }
}

09-11 20:30