2014-06-09 10 views
9

Próbuję przenieść jedną z moich aplikacji z Obj-C do Swift i mam problem z zarządzaniem wiadomościami e-mail.
Wyszukiwanie przez godziny, ale nie znalazłem, jak rozwiązać ten problem.
Zasadniczo próbuję przeprowadzić migrację funkcji func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!).Wysyłanie wiadomości e-mail - MFMailComposeResult

Problem polega na tym, że żadne opcje wewnątrz przełącznika nie są poprawne.

func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) 
{ 
    switch result.value 
    { 
     case CUnsignedInt(MFMailComposeResultCancelled): 
      var alert = UIAlertController(
       title: NSLocalizedString("sendingStatus", tableName: "LocalizationFile", comment:"sendingStatus"), 
       message: NSLocalizedString("emailCancelledByUser", tableName: "LocalizationFile", comment:"emailCancelledByUser"), 
       preferredStyle: UIAlertControllerStyle.Alert) 
      self.presentViewController(alert, animated: true, completion: nil) 
     case MFMailComposeResult(MFMailComposeResultFailed): 
      var alert = UIAlertController(
       title: NSLocalizedString("sendingStatus", tableName: "LocalizationFile", comment:"sendingStatus"), 
       message: NSLocalizedString("emailSentFailed", tableName: "LocalizationFile", comment:"emailSentFailed"), 
       preferredStyle: UIAlertControllerStyle.Alert) 
      self.presentViewController(alert, animated: true, completion: nil) 
     case MFMailComposeResultSaved: 
      var alert = UIAlertController(
       title: NSLocalizedString("sendingStatus", tableName: "LocalizationFile", comment:"sendingStatus"), 
       message: NSLocalizedString("emailSaved", tableName: "LocalizationFile", comment:"emailSaved"), 
       preferredStyle: UIAlertControllerStyle.Alert) 
      self.presentViewController(alert, animated: true, completion: nil) 
     default: 
      var alert = UIAlertController(
       title: NSLocalizedString("sendingStatus", tableName: "LocalizationFile", comment:"sendingStatus"), 
       message: NSLocalizedString("emailNotSent", tableName: "LocalizationFile", comment:"emailNotSent"), 
       preferredStyle: UIAlertControllerStyle.Alert) 
      self.presentViewController(alert, animated: true, completion: nil) 
    } 
} 

enter image description here

Odpowiedz

19

Nie zapominajcie, że można również użyć .rawValue (.value w starszych wersjach systemu SWIFT) od konkretnych typów wynikowych jesteś porównywanie zmiennej wynik:

var result:MFMailComposeResult = MFMailComposeResultCancelled 

    switch(result.value) { // <-- Here, note .value is being used 
     case MFMailComposeResultCancelled.value: // <-- And here as well! 
      print("Cancelled") 
     default: 
      print("Default") 
    } 
+0

OMG! Naprawdę działa dobrze ... Nie wiem, jak tego nie widziałem. Dziękuję Ci bardzo!!!! –

+0

Teraz używasz .rawValue zamiast .value – jaminguy

+0

@jaminguy Zaktualizowano, dziękuje –

3

Testowane i działające w 100% W wersji 3.0 to się zmieniło i teraz powinieneś zrobić coś takiego:

func mailComposeController(controller: MFMailComposeViewController, 
          didFinishWithResult result: MFMailComposeResult, error: NSError?) { 
    switch result.rawValue { 
    case MFMailComposeResult.Cancelled.rawValue: 
     print("Mail cancelled") 
    case MFMailComposeResult.Saved.rawValue: 
     print("Mail saved") 
    case MFMailComposeResult.Sent.rawValue: 
     print("Mail sent") 
    case MFMailComposeResult.Failed.rawValue: 
     print("Mail sent failure: %@", [error!.localizedDescription]) 
    default: 
     break 
    } 
    // Dismiss the mail compose view controller. 
    controller.dismissViewControllerAnimated(true, completion: nil) 
} 
0

Wydaje mi się, że 100% testowane w wersji 3 było testowane tylko w około 50%. Kiedy go wypróbowałem, kompilator naprawdę go nie polubił. XCode pomoże mi to naprawić, ale do tego, który działał od 9-1-17. Poniższy kod jest ostatecznie skompilowany:

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?){ 
    switch result.rawValue { 
    case MFMailComposeResult.cancelled.rawValue: 
     print("Mail cancelled") 
    case MFMailComposeResult.saved.rawValue: 
     print("Mail saved") 
    case MFMailComposeResult.sent.rawValue: 
     print("Mail sent") 
    case MFMailComposeResult.failed.rawValue: 
     print("Mail sent failure: %@", [error!.localizedDescription]) 
    default: 
     break 
    } 
    // Dismiss the mail compose view controller. 
    controller.dismiss(animated: true, completion: nil) 
}