スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Swift】 ファイルの読み込みと保存【Mac】


ここのところファミコンのソフトを開発していたのですが、実装するデータを作るのに Mac で変換ツールを作ろうと思い立って、Swift を弄り始めました。

まぁ、変換ツールなので、基本、バイナリファイルを開いて、中身を変換して、バイナリかテキストファイルを書き出すって処理です。

なので、ファイル・オープンと、ファイル・セーブができれば7割がた出来たも同然。(うそ)
で、7割がたできたのですが、結構、時間が掛かってしまったので、備忘録。

といっても、調べたところワタクシの環境が、MacOSX 10.9.5Xcode Version 6.2Swift 1.1.0 なので、あまり需要はないとは思いますが。

というかさぁ、公式のドキュメント(とネットの情報)がガンガン最新の物に書き換わり、古いバージョンの物がなくなってるので、とてもとても苦労します。
結局のところ、Objective-C のコードを解析して、Swift に置き換えるようなことになってしまった。
じゃぁ、Objective-C で書いたらいいんじゃないかと思うけど、まぁ、ファイル数は半分になるし、コードも少ないし・・・と、面倒臭がりやのワタシはSwift の誘惑に負けるわけです。

ま、いいや、とりあえず、ファイルオープン。

    func openFile(){
       
        let openPanel = NSOpenPanel()
        openPanel.allowsMultipleSelection = false // 複数ファイルの選択を許すか
        openPanel.canChooseDirectories = false // ディレクトリを選択できるか
        openPanel.canCreateDirectories = false // ディレクトリを作成できるか
        openPanel.canChooseFiles = true // ファイルを選択できるか
        openPanel.allowedFileTypes = ["xxx","aaa"]// 選択できるファイル種別 :拡張子を指定

        openPanel.beginWithCompletionHandler({ (num) -> Void in

            if num == NSModalResponseOK {
           // OKボタンを押したら
                for fileURL in openPanel.URLs {
                    let filePath :String! = fileURL.resourceSpecifier
                    let decoadPath :String! = filePath.stringByRemovingPercentEncoding  // 日本語ファイルの場合
                    // 以下にファイルを開いてからの処理

                       let file = NSData(contentsOfFile: decoadPath)

                       //  読み込んだデータを配列にコピー
                       let fileLength = file?.length
                       var data = Array<uint8> (count:fileLength!, repeatedValue:0)
                       file?.getBytes(&data, length: fileLength!)
       
                }
           
            } else if num == NSModalResponseCancel {
           // キャンセルボタンを押したら

                //NSLog("Canceled")
            }
        })
    }



で、実装するには、

    @IBOutlet weak var fileOpen: NSMenuItem!
    func applicationDidFinishLaunching(aNotification: NSNotification) {
        // Insert code here to initialize your application
        openFile()
    }


こんな感じですかね。
アプリが起動したら、即ファイル選択って感じですけど。


でもって、ファイル保存(テキスト保存)

    func saveText(str: String){
   
        let savePanel = NSSavePanel()
        savePanel.canCreateDirectories = true     //この辺はファイル・オープンと一緒
        savePanel.showsTagField = false
        savePanel.nameFieldStringValue = "test.asm"
        savePanel.allowedFileTypes = ["txt"]

        savePanel.beginWithCompletionHandler { (result) in

            if result == NSFileHandlingPanelOKButton {
    //OKボタン

                let url = savePanel.URL!.path
                let path = url?.stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
              
                if (path != nil){
                   
                    if str.writeToFile(path!, atomically: true, encoding: NSUTF8StringEncoding){
                        print(str)
                    }else{  }
                }else{
                    return
                }

            }else{
     //OKボタン以外

            }
        }
    }



ファイルオープンは、色々なサイトさまを参考にさせて頂いて、割とすぐにできたんだけど、ファイル保存で手間取りました。
let url = savePanel.URL!.path で、URL をパスに変換しなくちゃならないということに気がつかなくて。
しかも、writeToURL を使おうとするとエラーが出るし。
いや、エラーがでるのはいいんだけど、Xcode が表示するエラーフィックスの候補がことごとく外れるという。
あれ、新しいバージョンだと改善されてるんだろか。

というわけで、あとはガシガシ変換すればOKなはず。
ガンバロー! おー!
スポンサーサイト

コメント

非公開コメント




上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。