質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Swift 2

    1337questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Swift2で、テキストファイルの開き方がわからない

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,268

Nicola

score 15

以下のコードでlet data = NSString(contentsOfFile: filePath, encoding: NSUTF8StringEncoding, error: nil)がエラーになります。


import Cocoa
import Foundation

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let filePath = paths[0].stringByAppendingPathComponent("dictionary00.txt")
    let data = NSString(contentsOfFile: filePath, encoding: NSUTF8StringEncoding, error: nil)
    data.enumerateLines { (line, stop) -> () in
    println(line)
    println(split(line,{ $0 == "\t"}))
    
    }
        // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }

}
 

正しい開き方を教えていただけないでしょうか。
よろしくお願いします。


解決しました。

下記のコードが最終コードとなります。

import Cocoa
import Foundation
extension String : CollectionType {}


class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        let filePath = paths[0].stringByAppendingPathComponent("test01.txt")
        print (filePath)
        let data = htmlStringWithFilePath(filePath)

        data!.enumerateLines { (line, stop) -> () in
            print(line)
            print(split(line){ $0 == "\t"})
        }
        
        // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }

    private func htmlStringWithFilePath(path: String) -> String? {
        
        do {
            let data = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)
            return data
            
        } catch {
            print("Lookup error: no HTML file found for path, \(path)")
            return nil
        }
    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Stripe

    2015/08/01 18:49

    質問文を編集して、ViewControllerのコードを丸ごと貼り付けてください。

    キャンセル

回答 4

checkベストアンサー

0

swift2 = Xcode7 beta 何ですね…
Xcode6.3 (= swift1.2)で確認していました <(_ _)>

swiht2になってエラーハンドリングのやり方が変わったそうで、下記サイトに実装例が載っていました。(環境が無いので未確認ですが)

http://stackoverflow.com/questions/31159291/xcode-7-beta-gives-error

今度こそ解決すると良いのですが・・・

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/05 15:58

    ありがとうございます。基本部分は解決いたしました。
    後一つの部分だけ、エラーが出てしまいます。

    コードを以下に記します。
    override func viewDidLoad() {
    super.viewDidLoad()

    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let filePath = paths[0].stringByAppendingPathComponent("test01.txt")
    print (filePath)
    let data = htmlStringWithFilePath(filePath)

    data!.enumerateLines { (line, stop) -> () in
    print(line)
    println(split(line){ $0 == "\t"})
    }

    // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
    didSet {
    // Update the view, if already loaded.
    }
    }

    private func htmlStringWithFilePath(path: String) -> String? {

    // Get HTML string from path
    // you can also use String but in both cases the initializer throws
    // so you need the do-try-catch syntax
    do {
    // use "try"
    let data = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)
    // or directly return
    return data

    // Check for error
    } catch {
    // an "error" variable is automatically created for you

    // in Swift 2 print is now used instead of println.
    // If you don't want a new line after the print, call: print("something", appendNewLine: false)
    print("Lookup error: no HTML file found for path, \(path)")
    return nil
    }
    }

    上記のタブ区切りがうまくいきません。
    print(split(line){ $0 == "\t"})
    もしくは
    println(split(line){ $0 == "\t"})

    splitでエラーになってしまいます。

    わかりましたら、お力添え頂ければ助かります。
    よろしくお願いいたします。

    キャンセル

  • 2015/08/05 16:01

    エラー名は
    Cannot invoke 'split' with an argument list of type '(String, (String) -> Bool)'
    です。

    キャンセル

  • 2015/08/05 16:57

    解決に向かっているようで少し安心しました。
    しかし、swift2 の仕様変更は結構激しいですね…

    どうやら String が Sliceable でなくなったとかで、下記に③通りの解決策が提案されていました。

    http://stackoverflow.com/questions/30759158/using-the-split-function-in-swift-2

    現在のコードに一番近いのは No.3 でしょうか?
    解決することを祈っております。

    キャンセル

  • 2015/08/05 17:07

    ありがとうございます。No.3のコードでいけました。

    色々ご援助いただきありがとうございました。

    キャンセル

0

swift初学者なので間違っていたらゴメンなさい。
自分の環境で試してみたところ以下のように修正すればOKのようです。

誤)let data = NSString(contentsOfFile: filePath, encoding: NSUTF8StringEncoding, error: nil)
正)let data = NSString(contentsOfFile: filePath, encoding: NSUTF8StringEncoding, error: nil) as! String

デバッガーで「型」を調べてみると分かりますが、
NSString → Swift.Optional<NSString>
なので、 as! String でダウンキャストして
data        → Swift.String
としてやらないと、enumerateLines メソッドを利用できないということのようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/02 09:56

    ありがとうございます。
    しかしその上の行の
    let filePath = paths[0].stringByAppendingPathComponent("dictionary00.txt")
    のpaths[0]ですでに、エラーになっています。

    キャンセル

  • 2015/08/02 16:57

    失礼しました、あまり良く見ていませんでした。。
    Stripeさんが回答されている通り、処理全体を、たとえば「viewDidLoad」関数の中に書いてください。
    自分は、テスト用のボタンをクリックした時に動作するよう、自分で追加した関数の中に当該のコードを記載していたため、paths[0]のところではエラーになっていませんでした。。

    キャンセル

  • 2015/08/03 08:48

    ありがとうございます。今度は次の行がエラーになってしまいました。

    キャンセル

  • 2015/08/03 15:02

    おかしいですね…
    自分の環境ではエラーなく読み込み完了しますが。
    2点確認ですが
    ①ご使用のswiftのバージョンは?
    ②対象のフォルダに読み込み可能なファイルが間違いなく配置されていますか?配置先フォルダを探すのちょっと面倒だと思いますが~

    キャンセル

  • 2015/08/03 15:48 編集

    ①2.0Bata
    ②配置の確認はしました。/Users/*****/Documents/dictionary00.txt
    エラーは
    Cannot find an Initializer for type NSString that accepts an argument list of type (contentsOfFile: String,encoding: Uint, error: nil)
    です。
    よろしくお願いします。

    キャンセル

  • 2015/08/03 19:36

    現在、出先なので詳しくコメントしにくいのですが~
    今はios向けアプリをmac上でシミュレーターを使って開発中なのでは?
    もしそうなら②が違うと思います。
    下記を参考に正しいパスにファイルを置いてからテストして下さい。

    >http://qiita.com/singo405/items/b84f81ee2daaef27d0a2

    キャンセル

  • 2015/08/04 14:44

    ありがとうございます。
    一応mac用の変換ソフトを作っています。
    タブ区切りテキストを読んで、データベースに書き込むことをしようとしています。
    しかし、上記のエラーになってしまいます。

    よろしくお願いします。

    キャンセル

0

そのテキストファイルを開くコードを、関数(メソッド)の中に書いてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/02 12:04

    開く前に、ディレトリ設定でエラーなんですが…

    キャンセル

  • 2015/08/02 12:39

    だから、そのコードを関数の外側に書いているからエラーになるのです。

    キャンセル

  • 2015/08/03 08:49

    ありがとうございます

    キャンセル

0

入力ファイルが下記パスに存在しTSV(TAB区切り)になっているという前提で、動作確認しました。

/Users/{ユーザー}/Documents/dictionary00.txt

import Foundation

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let filePath = paths[0].stringByAppendingPathComponent("dictionary00.txt")
let data = NSString(contentsOfFile: filePath, encoding: NSUTF8StringEncoding, error: nil) as! String
data.enumerateLines { (line, stop) -> () in
    println(line)
    println(split(line){ $0 == "\t"})
}

今更な確認ですが・・・Mac上での開発には Xcode をご使用になられていますか??

推測なので間違っていたら申し訳ありませんが、きっとネット上の情報(実装例)をご参考にスクリプトを作成されているのだと思います。
が、Nicolaさんがご参考にされたのは、同じswift のコードでも ios (モバイル)用であり OS X (Mac)用ではありません。

今度は次の行がエラー

と仰っている箇所については、先に回答した通り末尾に as! String を付加してダウンキャストすればOKのはずです。

さらに、split の使い方が少し違っていたようです。。

老婆心ながら一言。
先を急ぐお気持ちは十分に分かりますし、実際に確認しながら進めるのも非常に重要なことなのですが、まずは アプリの骨組み と、開発ツールである Xcode の基本的な使い方くらいはしっかりと確認してからコーディングを進められた方が結果的には早いと思います。
急がば回れ、ということです。


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/05 11:22 編集

    as! Stringでダウンキャストもしているんですが・・・
    NSStringでエラーになってしまいます。
    Cannot find an initializer for type 'NSString' that accepts an argument list of type '(contentsOfFile: String, encoding: UInt, error: nil)'
    一応、OS X用にXCODE7を設定しているんですが。

    確かにアプリの骨組みは、ある程度のものが頭にあるだけですが。

    10年前までVB6での開発が最後でしたが。その後は、HP開発の言語を少ししたくらいです。

    キャンセル

  • 2015/08/05 13:19

    ゴメンナサイ、初学者故に根本的に思い違いをしていました。。
    新たな回答を別途記載致しますので、ご確認をお願い致します。

    キャンセル

同じタグがついた質問を見る

  • Swift 2

    1337questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。