Swiftでバーコードを生成する（Swift2.1, XCode7.2.1, iOS9）

iOSアプリから、バーコード（code39）を生成させる必要があったのでメモ。
iOS9のAVFoundationでは、code128を生成させることはできるが、code39はできない？ようなので、自前で実装しようとしたが、便利なライブラリ([RSBarcodes_Swift](https://github.com/yeahdongcn/RSBarcodes_Swift))があったのでそれを使う。

※CocoaPodsインストール済み前提

１．XCodeでSwiftプロジェクト作成する

２．Podfile作成、インストール
~ pod init
```# required by Cocoapods 0.36.0.rc.1 for Swift Pods
use_frameworks! 
pod 'RSBarcodes_Swift', '~> 0.1.5'
```
~ pod install

３．
~ cd プロジェクトルートパス
~ git submodule add https://github.com/yeahdongcn/RSBarcodes_Swift.git


４．.xcworkspaceファイルからプロジェクトを開く

５．RSBarcodes_Swiftフォルダの中の、RSBarcodes.xcodeprojを自分で作ったプロジェクトにドラッグして追加する
<img width="270" alt="スクリーンショット 2016-02-09 18.07.02.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40894/5303b3ed-e4ca-68b9-d753-0b0d41de1edd.jpeg">

６．
Embedded Binaries追加
![スクリーンショット 2016-02-09 18.10.02.jpg](https://qiita-image-store.s3.amazonaws.com/0/40894/c99d10d1-b79f-ae03-1a0a-5d86ce1a99c1.jpeg)

Target Dependencies追加
<img width="1206" alt="スクリーンショット 2016-02-09 19.11.36.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40894/c416aa64-f737-d920-ae6b-841fc2a5cfe8.jpeg">


７．ViewController.swift編集

```swift

import UIKit
import AVFoundation
import RSBarcodes

class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {

    let type = [
        AVMetadataObjectTypeCode39Code,
        AVMetadataObjectTypeCode39Mod43Code,
        AVMetadataObjectTypeCode93Code,
        AVMetadataObjectTypeCode128Code,
        AVMetadataObjectTypeUPCECode,
        AVMetadataObjectTypeEAN8Code,
        AVMetadataObjectTypeITF14Code,
        AVMetadataObjectTypeInterleaved2of5Code,
        AVMetadataObjectTypeDataMatrixCode,
        AVMetadataObjectTypeQRCode,
//        AVMetadataObjectTypeAztecCode,
        AVMetadataObjectTypeEAN13Code,
        AVMetadataObjectTypeFace,
        AVMetadataObjectTypePDF417Code,
    ]
    let s = "ABCDE12345"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        let lbl: UILabel = UILabel(frame: CGRectMake(0, 0, 400, 50))
        lbl.text = "generate code: \(s)"
        lbl.layer.position = CGPoint(x: 200, y: 40)
        self.view.addSubview(lbl)
        
        // ImageView生成
        let cnt = type.count
        var img: [UIImageView] = Array<UIImageView>(count: cnt + 1, repeatedValue: UIImageView())
        var y: CGFloat = 100
        for var i = 0; i < cnt + 1; i++ {
            let width = CGFloat(300)
            let height = CGFloat(100)
            img[i] = UIImageView(frame: CGRectMake(0, 0, width, height))
            y += CGFloat(i % 2) * height
            img[i].layer.position = CGPoint(x: width / 2 + (width * CGFloat(i % 2)), y: y)
            view.addSubview(img[i])
        }

        // AVFoundation code128しか生成できない？
        let data = s.dataUsingEncoding(NSASCIIStringEncoding)
        let filter = CIFilter(name: "CICode128BarcodeGenerator")
        filter!.setValue(data, forKey: "inputMessage")
        img[0].image = UIImage(CIImage: filter!.outputImage!)
        
        
        // RSBarcodes
        let gen = RSUnifiedCodeGenerator.shared
        gen.fillColor = UIColor.whiteColor()
        gen.strokeColor = UIColor.blackColor()
        
        for var i = 0; i < cnt - 1; i++ {
            if let _img = gen.generateCode(s, machineReadableCodeObjectType: type[i]) {
                print("\(i) \(type[i])")
//                img[i].image = RSAbstractCodeGenerator.resizeImage(_img, scale: 1.0)
                img[i + 1].image = _img
            }
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```

iPad Retinaシミュレータで表示した結果
（表示出来ていない種類もあるが、code39は表示されているので一応OKとしておきます）
<img width="880" alt="スクリーンショット 2016-02-09 19.26.33.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40894/22291947-664c-cdf5-bf9a-4175c2f4fecf.jpeg">