Swift实现MFMailComposeViewControllerDelegate时协议遵循报错咨询
问题原因与解决方法:Cannot declare conformance to 'NSObjectProtocol' in Swift
错误原因
MFMailComposeViewControllerDelegate是Objective-C体系下的协议,它间接继承了NSObjectProtocol。在Swift中,若要遵循这类依赖NSObjectProtocol的ObjC协议,你的类必须继承自NSObject——因为NSObject已经默认实现了NSObjectProtocol要求的所有基础方法(如isEqual(_:)、hash等),而纯Swift类没有这些默认实现,因此编译器会抛出该错误,强制要求类通过继承NSObject来满足协议的隐式约束。
你的SettingsViewModel应该是一个未继承NSObject的纯Swift类,所以在扩展中声明遵循MFMailComposeViewControllerDelegate时触发了这个错误。
解决方案
方案1:让ViewModel继承NSObject
修改SettingsViewModel的类定义,使其继承自NSObject:
class SettingsViewModel: NSObject { // 原有的ViewModel业务代码 }
之后你的扩展代码可以保持不变,就能正常遵循协议:
extension SettingsViewModel: MFMailComposeViewControllerDelegate { public func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { controller.dismiss(animated: true) } }
方案2:将代理逻辑移到UI层类中
如果不想让SettingsViewModel继承NSObject(比如ViewModel采用SwiftUI的ObservableObject等架构设计),可以把邮件代理的逻辑转移到UI层的类中(如UIViewController或UIView的子类)。这类UI层类本身就继承自NSObject,天然满足MFMailComposeViewControllerDelegate的协议要求,无需额外修改继承关系。
内容的提问来源于stack exchange,提问作者Heimdallr
相关产品推荐
相关产品推荐

