使用 UIViewController 作为可选参数的默认值,但出现 "X does not have a member named Y" 错误

Using a UIViewController as the default value for an optional parameter, but I get the "X does not have a member named Y" error

所以我一直在享受默认参数值。

class containerViewController: UIViewController {
    var detailView:UIViewController?

    override func viewDidLoad(){
        super.viewDidLoad()
        detailView = anotherViewController()
    }

    func hideDetailView(vc:UIViewController? = detailView){ // <- THIS LINE
        // code
    }
}

我标记的行产生错误:

'containerViewController.Type' does not have a member named 'detailView'

我一直在网上阅读,including this question,但我似乎不知道如何解决这个问题。

我想要的是能够使用 hideDetailView(),如果我将特定的视图控制器作为参数发送给该函数,它会隐藏该特定的视图控制器。如果我不发送任何参数,它只会隐藏 detailView 参数中保存的当前视图控制器。

我怎样才能做到这一点?

您可以使用nil作为默认值,并检查正文中是否有nil

func hideDetailView(vc:UIViewController? = nil){ // <- THIS LINE
    let vc_ = vc ?? detailView
    // code
}

但在这种情况下,您无法区分以下调用:

// passing `nil` as Optional<UIViewController>
let vc:UIViewController? = nil
container.hideDetailView(vc: vc)

// use default value
container.hideDetailView()

如果你不喜欢那样,你可以使用 UIViewController??:

func hideDetailView(vc:UIViewController?? = nil){
    let vc_ /*: UIViewController? */ = vc ?? detailView 
    // code
}