はじめに
今回は、アプリ内でCSVファイルの中身を作成し、
それをメールに自動添付するやり方をまとめました。
メーラーを起動させて、
メールアドレス・件名・本文などを指定してメール送信するやり方は、
以下のURLにまとめてあります。
【Swift】アプリ内でメーラーを起動しメール送信するやり方
また、
この記事の後半部分に完成版ソースコードがあるため、
そちらを参考にしても構いません。
やり方
・CSVデータの中身を作成するために、csvDataという変数を定義する
 var csvData=[[String]]()
・csvにデータを入れる
 csvData.append(["日付","データ1","データ2","データ3","データ4"])
・sendMailWithCSVという関数を作成し、呼び出す
sendMailWithCSV("メール件名", message: "メール本文", csv: csvData)
func sendMailWithCSV(subject: String, message: String, csv: [[String]]) {
        
    let mailViewController = MFMailComposeViewController()
    mailViewController.mailComposeDelegate = self
    
    mailViewController.setSubject(subject)
    mailViewController.setToRecipients(toRecipients)
    mailViewController.setCcRecipients(CcRecipients)
    mailViewController.setBccRecipients(BccRecipients)
    mailViewController.setMessageBody(message, isHTML: false)
    mailViewController.addAttachmentData(imageData, mimeType: "image/png", fileName: "image")
    mailViewController.addAttachmentData(toCSV(csv).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false), mimeType: "text/csv", fileName: "sample.csv")
    self.presentViewController(mailViewController, animated: true) {}
}
完成
import UIKit
import MessageUI
class ViewController: UIViewController, MFMailComposeViewControllerDelegate{
    let startMailerBtn = UIButton(frame: CGRectMake(0,0,200,30))
    var csvData=[[String]]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        startMailerBtn.layer.position = CGPoint(x:self.view.bounds.width/2,y:self.view.bounds.height/2);
        startMailerBtn.setTitle("メール送信", forState: .Normal)
        startMailerBtn.setTitleColor(UIColor.blueColor(), forState: .Normal)
        startMailerBtn.addTarget(self, action: "onClickStartMailerBtn:", forControlEvents: .TouchUpInside)
        self.view.addSubview(startMailerBtn)
        
    }
    func onClickStartMailerBtn(sender: UIButton) {
        //メールを送信できるかチェック
        if MFMailComposeViewController.canSendMail()==false {
            println("Email Send Failed")
            return
        }
        
        //CSVデータの作成
        csvData.append(["日付","データ1","データ2","データ3","データ4"])
        csvData.append(["2015年5月5日","aaa","bbb","ccc","ddd"])
        
        sendMailWithCSV("メール件名", message: "メール本文", csv: csvData)
        
    }
    
    func sendMailWithCSV(subject: String, message: String, csv: [[String]]) {
        
        let mailViewController = MFMailComposeViewController()
        mailViewController.mailComposeDelegate = self
        var toRecipients = ["to@1gmail.com"]
        var CcRecipients = ["cc@1gmail.com"]
        var BccRecipients = ["Bcc1@1gamil.com","Bcc2@1gmail.com"]
        var image = UIImage(named: "myphoto.png")
        var imageData = UIImageJPEGRepresentation(image, 1.0)
        
        mailViewController.setSubject(subject)
        mailViewController.setToRecipients(toRecipients)
        mailViewController.setCcRecipients(CcRecipients)
        mailViewController.setBccRecipients(BccRecipients)
        mailViewController.setMessageBody(message, isHTML: false)
        mailViewController.addAttachmentData(imageData, mimeType: "image/png", fileName: "image")
        mailViewController.addAttachmentData(toCSV(csv).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false), mimeType: "text/csv", fileName: "sample.csv")
        self.presentViewController(mailViewController, animated: true) {}
    }
    
    func toCSV(a: [[String]]) -> String {
        return join("\n", a.map { join(",", $0.map { e in
            contains(e) { contains("\n\",", $0) } ?
                "\"" + e.stringByReplacingOccurrencesOfString("\"", withString: "\"\"", options: nil, range: nil) + "\"" : e
            })}) + "\n"
    }
    
    func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) {
        
        switch result.value {
        case MFMailComposeResultCancelled.value:
            println("Email Send Cancelled")
            break
        case MFMailComposeResultSaved.value:
            println("Email Saved as a Draft")
            break
        case MFMailComposeResultSent.value:
            println("Email Sent Successfully")
            break
        case MFMailComposeResultFailed.value:
            println("Email Send Failed")
            break
        default:
            break
        }
        
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
・CSVの文字列を作成する(以下のコード参照)
func toCSV(a: [[String]]) -> String {
     return join("\n", a.map { join(",", $0.map { e in
         contains(e) { contains("\n\",", $0) } ?
             "\"" + e.stringByReplacingOccurrencesOfString("\"", withString: "\"\"", options: nil, range: nil) + "\"" : e
            })}) + "\n"
}
メール画面の下の方にsample.csvというCSVファイルが添付されているのが確認出来ます。

メール画面でsample.csvをクリックすることが出来ないため、
一度メールを送信して、
受信先でデータの中身を確認しなければなりません。
完成版ソースコード
https://github.com/chankei1/CSVAttachedToMailer
上記のGitHubに載っています。
前回の記事(【Swift】アプリ内でメーラーを起動しメール送信するやり方)で紹介したコード(メールアドレスの自動入力や画像表示など)も含んでいます。
※しかし、関数を使用したため若干、
 前回の記事とコードが違いますが、
 実行結果は同じです。
githubに載せているコードは今回使用したコードになっています。
おわりに
これで、アプリ内で作成したデータをCSVファイルにして、
メール送信させることが出来ました。
参考サイト
「SwiftによるCSVファイルの生成方法」
URL:http://ja.stackoverflow.com/questions/5668/swift%E3%81%AB%E3%82%88%E3%82%8Bcsv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%94%9F%E6%88%90%E6%96%B9%E6%B3%95
「[iPhoneアプリ/Swift]csvファイルの作成方法」
URL:https://teratail.com/questions/6070
「[Swift]ファイルをメールに自動添付させる方法」
URL:https://teratail.com/questions/6071
