ios - 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 }
// ...
}
解决方案
就像 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))
推荐阅读
- python - 尝试打印 *args 和 **kwargs 时出现奇怪的错误
- java - JavaParser:解析通用返回类型
- sql - T-SQL 使用来自字段表中的字符串的整个 WHRE 条件
- reactjs - 单击 Safari 上的后退按钮时使用 React 挂钩强制页面重新加载
- html - 使数据表适合 div
- docker-compose - restart 和 deploy: restart in docker-compose v.3 有什么区别?
- outlook-addin - Outlook 加载项发送功能 - 替换邮件正文中的 URL 字符串
- kotlin - Kotlin 中的库使用
- react-native - 上传期间的视频压缩
- sql-server - SQL Server:检查没有特定角色且没有其他角色的员工的条件