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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Swift 2

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

Q&A

解決済

2回答

3925閲覧

CSVファイルを読み込む実装でString型に変換する時処理が止まる

gokken

総合スコア11

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Swift 2

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

1グッド

0クリップ

投稿2016/03/23 05:51

###前提・実現したいこと
初めまして、アプリ開発初心者です。
swiftで5択クイズアプリを作っています。
CSVファイルを読み込み、String型に変換して値を返すloadCSVの関数を実装したいのですが

let csvData = NSString(contentsOfFile: csvBundle!, encoding: NSUTF8StringEncoding,error: &encodingError) !

の部分で以下のようなエラーメッセージが表示され、うまく動作しません。
CSVファイルを読み込んでいないと思い、新しくファイルを作り、プロジェクトに入れ込んでみたのですが、うまくいきませんでした。
どうしたらCSVファイルをStringに変換できるでしょうか?
回答のほどよろしくお願いします。

###発生している問題・エラーメッセージ
Argument labels '(contentsOfFile: encoding: NSUTF8StringEncoding,error:&encodingError)'do not match any available overloads
###ソースコード

// // ViewController.swift // import UIKit class ViewController: UIViewController { @IBOutlet weak var logoImageView: UIImageView! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var bodyTextView: UITextView! @IBOutlet weak var startbutton: UIButton! @IBOutlet weak var creditLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() //loadCSVメソッドで配列csvArrayに読み込んだCSVファイルを格納 var csvArray = [String]() csvArray = loadCSV("start") //ImageViewに画像を設定 let img:UIImage = UIImage(named:csvArray[0])! logoImageView.image = img //titleLabelにアプリ名を設定 titleLabel.text = csvArray[1] //bodyTextViewにアプリ説明文を設定 bodyTextView.text = csvArray[2] //ボタンのタイトル文字を白色に設定 startbutton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal) //creditLabelにクレジットを設定 creditLabel.text = csvArray[3] } //CSVファイルの読み込みメソッド。引数にファイル名、返り値にString型の配列。 func loadCSV(filename :String)->[String]{ //CSVファイルの読み込み let csvBundle = NSBundle.mainBundle().pathForResource(filename, ofType: "csv") //エラー値の設定 var encodingError: NSError? = nil let csvData = NSString(contentsOfFile: csvBundle!, encoding: NSUTF8StringEncoding,error: &encodingError) ! //改行コードが"\r"で行なわれている場合は"\n"に変更する let lineChange = csvData.stringByReplacingOccurrencesOfString("\r", withString: "\n") //"\n"の改行コードで区切って、配列csvArrayに格納する let csvArray = lineChange.componentsSeparatedByString("\n") return csvArray } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

###補足情報(言語/FW/ツール等のバージョンなど)
Xcodeのバージョンは7.2.1です。

ikuwow👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

以下の書き方はSwift1.2までの書き方になります、なのでSwift2.1のXcode7.2.1ではArgument labels '(contentsOfFile: encoding: NSUTF8StringEncoding,error:&encodingError)'do not match any available overloadsの様なエラーが表示されていました。

swift

1//エラー値の設定 2var encodingError: NSError? = nil 3let csvData = NSString(contentsOfFile: csvBundle!, encoding: NSUTF8StringEncoding,error: &encodingError) !

Xcode7、Swift2.0以降では以下の書き方になります。2種類書きましたがエンコード等でエラーが発生した場合にアプリが落ちない様な書き方です。

swift

1 2// ① エラーが発生した場合csvDataにnilが入りif文の中には入りません 3if let csvData = try? NSString(contentsOfFile: csvBundle, encoding: NSUTF8StringEncoding) { 4 // エンコーディングに成功した時の処理 5 6} 7 8// ②エンコーディングに失敗した場合はcatchが実行されます。 9do { 10 let csvData = try NSString(contentsOfFile: csvBundle, encoding: NSUTF8StringEncoding) 11 // エンコーディングに成功した時の処理 12 13} catch let error as NSError { 14 15 // エンコーディング失敗時 16 print(error) 17}

投稿2016/03/23 17:01

_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gokken

2016/03/24 00:11 編集

if文の部分は少し変えましたが、 //CSVファイルの読み込みメソッド。引数にファイル名、返り値にString型の配列。 func loadCSV(filename :String)->[String]{ if let csvBundle = NSBundle.mainBundle().pathForResource(filename, ofType:"csv"){ // ②エンコーディングに失敗した場合はcatchが実行。 do { let csvData = try NSString(contentsOfFile: csvBundle, encoding: NSUTF8StringEncoding) // エンコーディングに成功した時の処理 let lineChange = csvData.stringByReplacingOccurrencesOfString("\r", withString: "\n") //"\n"の改行コードで区切って、配列csvArrayに格納する csvArray = lineChange.componentsSeparatedByString("\n") } catch let error as NSError { // エンコーディング失敗時 print(error) } } //配列に値を格納 return csvArray } これでエラーを消えて、値も配列に格納されていました! コメントありがとうございます!
guest

0

NSString(contentsOfFile:encoding:error:)!というコンストラクタはもうありません。
代わりに、NSString(contentsOfFile:,encoding:)throwsを使ってください。

Swift

1let csvData = try! NSString(contentsOfFile: csvBundle!, encoding: NSUTF8StringEncoding)

投稿2016/03/23 12:25

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gokken

2016/03/24 00:05

Xcode7,Swift2.0以降でコンストラクタが変更されていたのですね、、、気づかなかったです 解決しました!!コメントありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問