Swift・iOS

Swiftを中心に学んだことを記録に残すブログです。技術に関係ない記事もたまに書いています。

【SwiftUI】"No exact matches in call to initializer"の原因

 

はじめに

最近SwiftUIに触る機会があるのですが、【SwiftUI】Listを表示する - Swift・iOSの内容を実践している時にケアレスミスで表題のエラーが発生しました。原因についてまとめたいと思います。

 

開発環境

macOS Catalina 10.15.7

Xcode 12.2

・Swift 5.3.1 

 

本題

エラー発生時の実装内容

リストを表示しようと、以下のように実装した。

import SwiftUI

struct ContentView: View {
    let listContents = ["お知らせ1", "お知らせ2", "お知らせ3", "お知らせ4", "お知らせ5"]
    
    var body: some View {
        List(0 ..< listContents.count) { item in
            HStack {
                Text(item)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

 

すると、"No exact matches in call to initializer "のエラーが表示された。

f:id:hfoasi8fje3:20201224193114p:plain

 

エラー内容に関して

"No exact matches in call to initializer"は、Google 翻訳を使うと「初期化子の呼び出しに完全一致がありません」という意味になる。正直この内容だけではエラーの原因がわからない・・・。

 

原因

原因は以下。(これはケアレスミスというか・・・ただの書き忘れレベルで恥ずかしい笑)

誤)

Text(item)

正)

Text(listContents[item])

 

一応説明すると、以下のitemには0から配列listContentsの中身の数(0から5までの数)が順番に入る。なので、例えば"Text(listContents[0])"は"Text("お知らせ1")"となる。

f:id:hfoasi8fje3:20201225160204p:plain

 

しかし、エラーが発生した時のように"Text(item)"と実装した場合、0が代入された"Text(item)"は"Text(0)"となる。TextはString型でなければならないためエラーが発生する。

※以下のように"Text(0)"と実装してみると、表題のエラーを再現できる。

f:id:hfoasi8fje3:20201225161248p:plain

 

エラー内容である「初期化子の呼び出しに完全一致がありません」というのは、「TextはString型でなければならないのに(Stringにマッチしていなければならないのに)、別の型(今回のケースはInt型)が指定されているよ」、という意味だと推測できる。

 

おわりに

プログラミングを始めた頃、写経しても割と頻繁にエラーが発生して詰むことがありました。エラーの原因を調べようにも、どのように調べるのが最適なのかわからなかったりして、なかなか問題を解消できそうな情報に辿り着けなくて苦しんでいました。結局、翌日見直すとただの写経ミスだったことに気づくパターンが多かったのですが・・・。表題のエラーが発生した時、「あ、なんだ実装ミスってるじゃん」とすぐに気づいて直せたので、多少は成長したのかもしれません笑

今回のようなケアレスミスで発生したエラーの解消法に関しては情報が少なそうですし、昔の自分はこのような情報が欲しかったと思うので笑、一応記事に残しておきます。