首页 > 解决方案 > Swift:使用参数作为同一函数中不同参数的默认值

问题描述

我正在尝试定义一个函数来呈现邮件编写器。它将委托和演示者UIViewController作为参数(并不总是相同),但我不想为演示者和委托相同的情况提供默认值UIViewController。那可能吗?

internal func showMailComposer(presenterController: UIViewController, delegate: UIViewController = presenterController, recipient: String = "", subject: String = "", body: BodyMessage = BodyMessage(string: "", isHTML: false)) {

    guard let delegate = delegate as? MFMailComposeViewControllerDelegate else { return }

    // ...
}

标签: iosswift

解决方案


就像 0xa6a 所说,我认为这是不可能的,因为默认值应该在编译时可用。实现类似行为的另一个选择是将参数转换为对象并在那里实现逻辑。这只是个人喜好和风格的问题。这是一个建议:

struct Mail{
   let recipient: String = ""
   let subject: String = ""
   let body: BodyMessage = BodyMessage(string: "", isHTML: false)
}

struct MailPresenter{

   weak var presenter : UIViewController?
   weak var delegate : MFMailComposeViewControllerDelegate?

   init(using presenter: UIViewController?, mailDelegate: MFMailComposeViewControllerDelegate? = nil){

      self.presenter = presenter

      if let mailDelegate = mailDelegate{
        self.delegate = mailDelegate
      }else{
        self.delegate = presenter as? MFMailComposeViewControllerDelegate
      }
    }
 }
internal func showMailComposer(from presenter: MailPresenter , for mail: Mail = Mail() ) {

}

你可以像这样使用它:

showMailComposer(from: MailPresenter(using: yourViewController))

推荐阅读