23515


メールを立ち上げることはできたのですが、閉じることができません。  
switch result.value のところにエラーメッセージが出ています。  
調べてみても分からなかったので質問させていただきました。

よろしくお願いします。

func mailComposeController(controller: MFMailComposeViewController,
didFinishWithResult result: MFMailComposeResult, error: NSError?) {

[code]

        switch result.value  {
        case MFMailComposeResultCancelled.value:
           break
        case MFMailComposeResultSaved.value:
            break
        case MFMailComposeResultSent.value:
            break
        case MFMailComposeResultFailed.value:
            break
        default:
            break
        }
    
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    
[/code]


CC BY-SA 3.0
2016-03-27T14:42:04.457
23513
2016-03-27T16:42:44.510
2016-03-27T16:42:44.510
11019
11019
question
ios swift iphone swift2
swift メール画面を閉じたい。


どこで見つけられたコードか知りませんが、ずいぶん古い書き方をしていますね。Swift1.xのかなり初期の書き方になっています。

現在の`MFMailComposeResult`型はSwiftに以下のようにimportされています。

[code]

    public struct MFMailComposeResult : RawRepresentable, Equatable {
        public init(_ rawValue: UInt32)
        public init(rawValue: UInt32)
        public var rawValue: UInt32
    }
    public var MFMailComposeResultCancelled: MFMailComposeResult { get }
    public var MFMailComposeResultSaved: MFMailComposeResult { get }
    public var MFMailComposeResultSent: MFMailComposeResult { get }
    public var MFMailComposeResultFailed: MFMailComposeResult { get }
    
[/code]

ご覧になればわかると思いますが`MFMailComposeResult`には、`value`という名前のプロパティはありませんから、そのせいでエラーになっています。
**あなたのコードから全ての`.value`を削除してしまってください。**

[code]

    func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
    
        switch result  {
        case MFMailComposeResultCancelled:
            break
        case MFMailComposeResultSaved:
            break
        case MFMailComposeResultSent:
            break
        case MFMailComposeResultFailed:
            break
        default:
            break
        }
    
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    
[/code]

初期のSwiftでは、Objective-Cからimportしたenum型の定数では`==`による比較もできなければswitch-
caseにも使えないという、今から考えるとかなりひどい制約があったので`enum`内部の整数値(これも`value`から現在では`rawValue`に変更されています)を取り出して比較する必要があったのですが、現在のSwiftにはそのような制約はありませんので値(`result`)も比較する定数値(`MFMailComposeResultCancelled`等)も共に同じ型(今回は`MFMailComposeResult`)であれば、全てに`.value`をつけるような面倒はしなくても良くなっています。

Xcodeのエディター上で`MFMailComposeResult`をCommand-
clickすれば上記の型定義のヘッダーは見ることができます。何もかも全て読み取れる必要はありませんが、「`MFMailComposeResult`型には`value`なんてプロパティがない」ことくらいは(そのような意味のエラーメッセージも出ていたはずです)理解できるようにしてください。

なお表題の「Swiftのメーラー」ですが、通常「メーラー」と言うと「メールの送受信機能を持った独立したアプリ」のことを言いますから、大変誤解を招きやすいタイトルになっています。正確な技術用語はわからなくても、`MFMailComposeViewController`を表示させているというのはコードを書かれたのだから分かっているはずです。タイトルにもそのクラス名を含めたほうが良いでしょう。(私は最初「メーラーのことなんて知らねぇよ」と思ってスルーしていました。)

また今回は自明な誤りがあったので回答が書けましたが、「エラーが出ています」と言う場合には必ず「ビルド時のエラーなのか実行時のエラーなのか」と「エラーメッセージの内容」をエラーが出た場所に加えて質問中に記載するようにしてください。


CC BY-SA 3.0
2016-03-27T16:24:35.220
23515
2016-03-27T16:24:35.220
13972
23513
answer