最初の回答が適切ではありませんでした。「Codable
を使うという手もあるのでよかったら調べてみてください。」と書きましたが、「Codable
を使うべき」です。ごめんなさい。
そもそもの話になりますが、.txt
ファイルに配列は保存できません。配列は文字列ではないからです。どうしても文字列として保存する場合は、例えば配列を\n
などでつなぎ一つの文字列にすることが考えられます。
この場合["a", "b", "c"]
を保存すれば
a
b
c
というテキストファイルとなります。
しかしこの方式では改行を含む文字があった場合、つまり["a\nd", "b", "c"]
のような場合、保存すると
a
d
b
c
となってしまいます。これを読み込むと["a", "d", "b", "c"]
になってしまいます。
Codable
はprotocolの一種ですが、これは値を保存可能にするために役立つprotocolです。例えば次の例がCodable
を用いている例です。
var strings = ["a", "b", "c"]
let encoder = JSONEncoder()
let data: Data = try! encoder.encode(strings)
let read_strings = try? JSONDecoder().decode([String].self, from: data)
print(read_strings) //Optional(["a", "b", "c"])
3行目に注目してください。data
というのはData
型の値です。Data
型はバイト列の型ですが、要するに単に0と1の並んだものなので、これをそのままファイルに保存することができます。(もちろんtxtファイルではないので読めるとは限りませんが)。
実際にこれを保存するには
try data.write(to: url, options: .atomicWrite)
のようにします。
ソースコード部分ですが、まずエラーの原因は型が違うことです。
var testarray1: [Data] = ["a", "b", "c"]//エラー1
Cannot convert value of type 'String' to expected element type 'Data'
String型の値を要求されているData型の値に変換できません
これはなぜかというと、Data
はString
から暗黙に変換できないからです。
ですので、値としては[String]
を維持し、保存の関数で受け取った後に上記の方法でtestarray1
をData
に変換して、保存すれば良いかと思います。