###前提・実現したいこと
辞書へ代入するための仮の配列を作り、辞書へ代入したあと、
その配列をもう一度使えるように初期化したいのですが、
配列が初期化できません。
ある文字列
-> 行ごとに配列へ
-> さらに1要素を2つにわける
-> 1つを辞書にキーに、1つを値にする
というコードなのですが、最初の文字列や辞書は初期化、代入ができるものの、配列のみ初期化できません。
###発生している問題・エラーメッセージ
swift
1Swift Compiler Error 2 Value of tuple type '()' has no member 'removeAll'
###該当のソースコード
swift
1func updateMediaInfo(mediaItem: MPMediaItem) { 2 //一部省略 3 lyricsDict = [:] 4 //前回のキーと要素を初期化 5 lyricsString = mediaItem.lyrics! 6 var lyricsArray = lyricsString.components(separatedBy: CharacterSet.newlines) 7 .map { $0.components(separatedBy: "//") } 8 .filter { $0.count == 2 } 9 .forEach {lyricsDict[$0[0]] = $0[1]} 10 lyricsString = "" 11 //使用したlyricsStringを初期化 12 lyricsArray.removeAll() //これがエラーになる・・・
見てわかると思いますが、ある要素(歌詞mediaItem.lyrics!
)を行ごとに配列の要素にし、さらに//
で歌詞1行を2つの文字列に分けた上で一つをlyricsDict
のキーに、もう一方を値にしています。
これを何度か繰り返すに当たって、lyricsDict
やlyricsArray
を初期化したいのですが、配列のみ初期化や他の値の代入ができません。
もちろん、
.allRemove()
をlyricsArray = []
に変えても、同じエラーが出てしまいます。
ちなみにこれは音楽再生系のアプリで、上記コードは**nowPlayingItemChanged
メソッドが呼び出されるたびに呼び出されるコード**です。
1秒ごとにキーを更新して値を呼び出すというコードもこのアプリには含まれていますが、配列はその辞書を作るためのものなので、そちらの処理は関係ないように思えます。
###考察
エラーの文中にタプルとの記述があるため、.map
や.filter
の過程でlyricsArray
が普通の配列ではなくなってしまったのでは、と考えました。
また、.forEach
については調べてもわからず、
とりあえずそう書いてみたら理想の動き(//
の前後をわけて、キーと値にする)ができたので使っている状態なのです・・・
しかし、
playgroundで以下のように簡易的に再現してみると、
swift
1var array = ["りんご//Apple", "ばなな//Banana", "マンゴー//Mango", "トマト//Tomato"] 2var dictionary = [String:String]() 3array.map { $0.components(separatedBy: "/") } 4 .filter { $0.count == 2 } 5 .forEach { dictionary[$0[0]] = $0[1] } 6print(array) 7 //["りんご//Apple", "ばなな//Banana", "マンゴー//Mango", "トマト//Tomato"] 8array = [] 9print(array) 10 //[]
結果は[]
と普通に初期化されます。
###試したこと
ViewController
の直下にvar lyricsArray :[String] = []
として宣言しておき、
問題の箇所を、
swift
1lyricsArray = [] 2lyricsArray = lyricsString.components(separatedBy: CharacterSet.newlines) 3 .map { $0.components(separatedBy: "//") } 4 .filter { $0.count == 2 } 5 .forEach {lyricsDict[$0[0]] = $0[1]}
とメソッド内で変数の宣言をなしにすると、
.forEach
の部分で別のエラーが出てしまいました。
swift
1Swift Compiler Error 2 Cannot assign value of type '()' to type '[String]'
です。
###補足情報(言語/FW/ツール等のバージョンなど)
swift3Xcode8
回答1件
あなたの回答
tips
プレビュー