プログラミング言語Swift Part4 [無断転載禁止]©2ch.net
初心者ですいません テキストファイルのデータ全文を読み込んで表示したいです 以下のコードでは失敗している判定になってしまうのか読み込めず、catchの処理がされてしまいます どこがダメなのでしょうか # animals.txt うさぎさん かめさん きりんさん ぞうさん let PATH = URL(string: "/Users/MYPC/Desktop/animals.txt")! do { var TXT_DATA = try String(contentsOf: PATH, encoding: .utf8) print(TXT_DATA) } catch { print("エラーが発生しました") } >>397 URL(string: を URL(fileURLWithPath: に変える SwiftってAppleの作ったコンパイル型言語でなんとなくカッコ良さそう、速そうだから使ってみたけど 文の書き方が悪いのか知らんけどスクレイピング程度ならcurlやgrep組み合わせたシェルスクリプトの方が速い… その結果をスマホなんかで利用するからSwiftで書くんやないの?なにがしたいんだ iOSアプリ作るために覚えるだけであって、それ以上でもそれ以下でもないと思う。 WEBサービス作らならPHPなりなんなりそれ用に覚えるだけ。 突然の質問で申し訳ないです。 title,caption,valueを持つクラスインスタンスの配列を作成したいと思っています。 ただし、Allay要素内のvalueはIntだったりStringだったり別個のインスタンスだったりします。 以下のようなコーディングをしてみたのですが、Root<Int>をRoot<Any>へ変換出来ない旨のコンパイルエラーが発生します。 対応策としてプロトコルにassociatedtypeを設定してRootで準拠させようとしてもRootの時点で型を決めないといけないようで 同様なエラーとなってしまいました。 ElementA(〜) as! Root<Any> は always fails ですし var elementArray: [Root<some Any>] も同様の結果でした。 何か良い方法はないものでしょうか? import Foundation class Root<T: Any>: NSObject { var title: String var caption: String var value: T init(title: String, caption: String, value: T) { self.title = title self.caption = caption self.value = value } } class ElementA: Root<Int> {} class ElementB: Root<String> {} class ElementC: Root<NSObject> {} var elementArray: [Root<Any>] elementArray.append(ElementA(title: "A", caption: "CapA", value: 10)) elementArray.append(ElementB(title: "B", caption: "CapB", value: "ABC")) elementArray.append(ElementC(title: "C", caption: "CapC", value: NSObject())) 404です。 以下訂正 誤:var elementArray: [Root<Any>] 正:var elementArray: [Root<Any>] = [] 解決策の一つとして var elementArray: [Any] = [] とすればelementArray.append(〜)のエラーは解決しますが、 最後に以下を実行すると"Nothing"が3つ表示されます。 elementArray.forEach({print(($0 as? Root<Any>)?.value ?? "Nothing")}) 当然と言えば当然なんですが、なんとかインチキでできないものかと・・・。 変数を先に定義してもいいかもね。 あと一つのarrayに複数の変数入れるならinitとか使わんほうがいいとか struct datafile { let name: String let size: Int let time: Double } 404です。 遅くなってすみません。 頂いた内容などを参考に結果として以下のような形になりました。 ジェネリクスクラスを辞めてvalueをAnyとすることでRootを要素とするArrayを作ることができました。 ありがとうございます。 ただ、ElementAのvalueはIntであることが(人間は)判っているのに value as! Int で必ずキャストしないといけないのが難点ですね。 すみません、改行が多いと怒られませいた。次レスへ続きます。 改行を減らすために少し見辛くてすみません。 import Foundation class Root: NSObject { var title: String var caption: String var value: Any init(title: String, caption: String, value: Any) { self.title = title self.caption = caption self.value = value } } class ElementA: Root {init(title: String, caption: String, value: Int) {super.init(title: title, caption: caption, value: value)}} class ElementB: Root {init(title: String, caption: String, value: String) {super.init(title: title, caption: caption, value: value)}} class ElementC: Root {init(title: String, caption: String, value: NSObject) {super.init(title: title, caption: caption, value: value)}} var elementArray: [Root] = [] elementArray.append(ElementA(title: "A", caption: "CapA", value: 10)) elementArray.append(ElementB(title: "B", caption: "CapB", value: "ABC")) elementArray.append(ElementC(title: "C", caption: "CapC", value: NSObject())) elementArray.forEach({print($0.value)}) read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる