I have just upgraded from Xcode 6 Beta 3 to Beta 4. In 3 my app was compiling perfectly however in 4 I have the following error. Can anyone explain and provide a solution please.
func messageComposeViewController(sendMsg: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult) {
switch result {
case MessageComposeResultSent : //Error: MessageComposeResult is not convertible to _OptionalNilComparisonType
label2.text = "Msg Sent"
case MessageComposeResultCancelled : //Error: MessageComposeResult is not convertible to _OptionalNilComparisonType
label2.text = "Msg Send Cancelled"
case MessageComposeResultFailed : //Error: MessageComposeResult is not convertible to _OptionalNilComparisonType
label2.text = "Msg Send Failed"
default:
label2.text = "Msg Error"
}
self.dismissViewControllerAnimated(true, completion: nil)
self.reloadInputViews()
}
It's a bug in the way this module is bridged to Swift. Report it. To use the module, stay in Objective-C until the Swift bridging bug is fixed.
The main part of the bug as it stands seems to me to be:
This should be an enum, and it isn't; it's a struct
The struct has a value
, which ought to be capable of comparison, but it has no getter (you can set it on initialization but you can't get it later)
func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) {
switch result.value {
case MessageComposeResultSent.value :
println("enviado")
case MessageComposeResultCancelled.value :
println("cancelado")
case MessageComposeResultFailed.value :
println("fallo")
default:
println("")
}
}
For Swift 2, you will need to use rawValue
:
// MARK: MFMessageComposeViewControllerDelegate
func messageComposeViewController(controller:MFMessageComposeViewController, didFinishWithResult result:MessageComposeResult) {
controller.dismissViewControllerAnimated(true, completion:nil)
switch result.rawValue {
case MessageComposeResultSent.rawValue:
print("cancelado")
case MessageComposeResultCancelled.rawValue :
print("canceled...")
case MessageComposeResultFailed.rawValue :
print("fail...")
default:
print("default...")
}
}
Of course, if you're just interested in one particular value, you could use an if statement as such:
if (result.rawValue == MessageComposeResultCancelled.rawValue) {
// Message canceled.
}
For Swift 3.0, you will need this:
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult){
switch result.rawValue {
case MessageComposeResult.sent.rawValue:
print("sent")
break
case MessageComposeResult.cancelled.rawValue:
print("cancelled")
break
case MessageComposeResult.failed.rawValue:
print("failed")
break
default:
break
}
self.dismiss(animated: true) { () -> Void in
}
}
@IBAction func sentSMSAction(_ sender: AnyObject) {
if MFMessageComposeViewController.canSendText() {
let messageVC = MFMessageComposeViewController()
messageVC.body = "My first custom SMS";
messageVC.recipients = ["0123456789"]
messageVC.messageComposeDelegate = self;
self.present(messageVC, animated: false, completion: nil)
}
}