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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

311閲覧

【Swift】HTMLパーサ"Ji"を使用して取得した値のtypeを"Jinode"から"String"へ変換したい

ddp

総合スコア17

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/03/22 13:33

編集2018/03/22 13:44

前提・実現したいこと

HTMLパーサ"Ji"を使用してgetArticles関数内で取得したaNodesTextsを
ArticleListViewControllerクラスのarticlesに入れ替えたいのですが、
「Cannot invoke 'append' with an argument list of type '([JiNode]?)'」
というエラーメッセージが出現し、どうもJiNodeにはappendが使用できないようなのです。
そこでaNodesTextsのtypeを"Jinode"から"String"へ変換したいのですが、良い方法をどなたかお教え頂けますでしょうか。
JiNode->Stringへの変換ではなく、変換せずとも可能な方法や代替方法の提案でも非常にありがたいです。どうぞよろしくお願いします。

発生している問題・エラーメッセージ

エラーメッセージ Cannot invoke 'append' with an argument list of type '([JiNode]?)'

該当のソースコード

Swift

1ソースコード 2 3import UIKit 4import HTMLReader 5import Ji 6 7class ArticleListViewController: UIViewController, UITableViewDataSource { 8 var articles = "" 9 let table = UITableView() 10 11 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 12 return articles.count 13 } 14 15 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 16 <#code#> 17 } 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 title = "新着記事" // Navigation Barのタイトルを設定 22 table.frame = view.frame // tableの大きさをviewの大きさに合わせる 23 view.addSubview(table) // viewにtableを乗せる 24 getArticles() 25 } 26 27 func getArticles(){ 28 29 let url = URL(string: "https://menu.open2ch.net/bbsmenu.html") 30 let jiDoc = Ji(htmlURL: url!) 31 32 let aNodesTexts = jiDoc?.xPath("//body//a/text()") 33 let aNodesLinks = jiDoc?.xPath("//body//a/@href") 34 35 print("All aNodesTexts :(aNodesTexts)") 36 37 self.articles.append(aNodesTexts)// ここで上記のエラーが発生しています 38 } 39 40}

補足情報(FW/ツールのバージョンなど)

Xcode:9.2

※趣味でiOSアプリ作製を始めたものの、やはり一人では限界が。どなたか超初心者の私にご教授願います。。。

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

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

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

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

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

guest

回答1

0

ベストアンサー

aNodesTextsのエラーチェックをしていませんが、

var articles = "" ↓ var articles: [JiNode] = [] self.articles.append(aNodesTexts) ↓ self.articles.append(contentsOf: aNodesTexts!)

でエラーは解消されると思います。

articlesが[JiNode]と配列の型であることを宣言することでappendが使用できるようになります。

投稿2018/03/22 21:31

newmt

総合スコア1277

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

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

ddp

2018/03/23 06:34 編集

エラー消えました!ありがとうございます。 配列をJiNode型にすれば良い・・・自身の頭の硬さに落胆しています。 少し進めて同じようなエラーに躓いていまして・・・ tableview関数にJiNode配列に格納されているデータを吐き出して、テーブルに記載したいので cell.textLabel?.text = articles[indexPath] とコードを書いたのですが、 エラー"Cannot subscript a value of type '[JiNode]' with an index of type 'IndexPath' "が発生してしまいました。 そこでcell.textLabel?.text = articles[indexPath] as? String としてString型にできないかと試してみましたが、やはりエラーが発生している状況です。 もし何か良い方法がありましたらお教えいただけますか? よろしくお願いいたします。
newmt

2018/03/23 08:00 編集

cell.textLabel?.text = articles[indexPath.row].contentとしてはどうでしょうか? JiNodeはString型ではないのでStringにキャストしようとするとエラーが発生すると思います。 例えば、JiNode型の中の表示したい値をcell.textLabel?.textに設定してみてください(エラーが出ていなければそこらへんはXcodeが候補を表示してくれるはずですので。)
ddp

2018/03/23 07:38

ご連絡ありがとうございます。 ・cell.textLabel?.text = articles[indexPath.row]としてはどうでしょうか? →試してみましたがエラー”Cannot assign value of type 'JiNode' to type 'String?' ”となります。 ・例えば、JiNode型の中の表示したい値をcell.textLabel?.textに設定してみてください →let article = articles[indexPath.row] cell.textLabel?.text = article as? String として試してみました。エラーは消えましたが"Cast from 'JiNode' to unrelated type 'String' always fails"という注意が記載されています。この状態で実行してみたのですが、tableに何も文字が記載されません。 やはりJiNode型をどうにかString型へ変更する方法を探る必要がありそうです。。
newmt

2018/03/23 07:47

print(article)とした場合に何が出力されますでしょうか? article.(ドット)と入力するとXcodeで何かヒントが出てきませんでしょうか?
ddp

2018/03/23 07:52

print(article)とすると、fatalerrorで処理が止まってしまうことがわかりました。 article. ではヒント?というかExpected member name following '.とエラーが返ってきます。
newmt

2018/03/23 08:00 編集

何度も申し訳ございません。 エラーの前にprint(articles)とprint(indexPath)を出力した場合に値は設定されていますでしょうか? おそらく値が正しく設定できていないのかと思われます。 また、上記の回答一部間訂正しました。 cell.textLabel?.text = articles[indexPath.row] ↓ cell.textLabel?.text = articles[indexPath.row].content
ddp

2018/03/23 12:35

上記試してみました。 まずcell.textLabel?.text = articles[indexPath.row].content とするとエラーは出力されませんでした。 ついで、 print(articles) --------A print(indexPath) --------B を同tableView関数内にて実行したところ、動作はしたようです。 で出力値なんですが、これがどうもおかしくて上に書かせていただいたAとBをそれぞれの関数の出力値とすると、 A→B→A→B・・・と16回繰り返されています。 なおAは繰り返されるのは不明ですが、毎回所望の一次元配列が出力されております。 Bについてはまず[0,0]が出力され、繰り返されるたびに[0,1]→[0,2]と値が変化していきます。 またfatalerrorについては、getArticles()関数にもprint(articles)を書いてやると発生しないが、 tebleView()関数のみの記載だと発生することがわかりました。
ddp

2018/03/23 12:50

追加です。 print(articles[indexPath.row].content)の出力値はnilでした。 print(articles[indexPath.row])の出力値はarticlesの配列の一番目の要素でした。
ddp

2018/03/23 13:12

すいません、よくわかりませんが・・・ cell.textLabel?.text = articles[indexPath.row].description にしてみると成功しました。。。 理由はよくわかりませんが、気長に調べてみます。 最後にもしお分かりでしたら教えていただきたいのですが、この"Ji"というHTMLパーサはなぜ JiNodeという型で出力する仕様なのでしょうか。意図的にそうしているように感じるのですが、その意図が私には全くサッパリなのでスッキリしません。よろしくお願いいたします。
newmt

2018/03/23 21:55

UITableViewへ値を設定する方法に何か誤りがあるのかもしれません。 以下の記事などを参考にしてみてください。 http://yuu.1000quu.com/how_to_use_uitableview descriptionはデフォルトの文字列またはクラスで定義して文字列を出力します。JiNodeクラスの場合は読み取った文字列をそのまま出力するか、読み取れなかった場合は"nil"と出力するようです。 JiNodeという型を定義している理由ですが、 色々あるとは思いますが、一つの理由として JiNodeという型を利用することで、HTMLだけではなく、XMLやURLなどの文字列を解析してDictionaryやArrayに変換して要素を同じように取り出すことができます。 また、JiNodeという型にすることでHTMLやXMLを構造化して保持することができるため 深い構造のものであったとしても簡単に要素が取り出せるようになります。例えばあるタグの子ノードの情報が欲しい場合はchildrenというプロパティを使えば配列で取り出せたりします。 詳しい内容は下記などを参考にしてみてください。 https://github.com/honghaoz/Ji https://qiita.com/shu223/items/86df55788f6b12d00fda
ddp

2018/03/24 01:13

「要素を同じように」というのが重要な点なのですね。まだなんとなくしかイメージ出来ないのは私の未熟さゆえですね。。 作者の文書を読んでみたいと思います。 この度は最後までお付き合い頂きありがとうございました! ドットを入力してxcodeにヒントを貰うという方法も今まで知りませんでしたので、大変有り難い助言でした。 また機会がありましたらよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問