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

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

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

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

Swift

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

Q&A

解決済

1回答

941閲覧

Model内の、initの引数の書き方が分からないです【MVC】

kazuki_user

総合スコア147

iOS

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

Swift

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

0グッド

0クリップ

投稿2020/09/09 07:11

編集2020/09/10 01:00

## Model内の、initの引数

VCにて、コンパクトにテキストを表示するため、
Modelを使用したいです。

その際、下記コードでエラーが発生してしまい、対処法を伺いたいです。

引数の指定が原因な気がするのですが、
下記の場合、Model内のinitの引数はどのようにすべきでしょうか?

## コード

Model

1import Foundation 2 3struct Repository { 4 5 let repo = selectedUser.repo[selectedUser.RepoToPass] 6 7 var language: String 8 var stars: String 9 var watchers: String 10 var folks: String 11 var issues: String 12 13 init() { // Editor placeholder in source file 14 self.language = "Written in (repo[ApiKey.Language] as? String ?? "")" 15 self.stars = "(repo[ApiKey.Stars] as? Int ?? 0) stars" 16 self.watchers = "(repo[ApiKey.Watchers] as? Int ?? 0) watchers" 17 self.folks = "(repo[ApiKey.Forks] as? Int ?? 0) forks" 18 self.issues = "(repo[ApiKey.Issues] as? Int ?? 0) open issues" 19 } 20 21}

Swift

1 2// ViewController 3 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 setupUI(repo: repo) // Cannot convert value of type '[String : Any]' to expected argument type 'Repository' 7 } 8 9 func setupUI(repo: Repository) { 10 11 LanguageLbl.text = repo.language 12 StarsLbl.text = repo.stars 13 WatchersLbl.text = repo.watchers 14 ForksLbl.text = repo.folks 15 IssuesLbl.text = repo.issues 16 }

エラー

// Model Editor placeholder in source file
// VC Cannot convert value of type '[String : Any]' to expected argument type 'Repository'

## 追記

以下のコードをクリーンアップしたいです。

"Written in (repo["language"] as? String ?? "")"以下5つのテキストデータを
モデル(別ファイル)に記述し、VCにて呼び出したいと考えています。

VC

1 LanguageLbl.text = "Written in (repo["language"] as? String ?? "")" 2 StarsLbl.text = "(repo["stargazers_count"] as? Int ?? 0) stars" 3 WatchersLbl.text = "(repo["wachers_count"] as? Int ?? 0) watchers" 4 ForksLbl.text = "(repo["forks_count"] as? Int ?? 0) forks" 5 IssuesLbl.text = "(repo["open_issues_count"] as? Int ?? 0) open issues"

こんな感じです。

VC

1// LanguageLbl.text = repo.language 2// StarsLbl.text = repo.stars 3// WatchersLbl.text = repo.watchers 4// ForksLbl.text = repo.folks 5// IssuesLbl.text = repo.issues

もしくは、initを使用せず以下のようにstatic letの使用も考えたのですが、
テキストデータのモデル格納に適切な方法は何でしょうか?

model

1struct Identifiers { 2 static let Language = "Written in (repo["language"] as? String ?? "")" 3}

追記2 (現在状況)

Model

1var selectedUser: SearchRootVC! 2// 以下letにて、エラー 3let repo = selectedUser.repo[selectedUser.RepoToPass] // Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value 4 5... 6 7struct repoTxt { 8 static let language = "Written in (repo["language"] as? String ?? "")" 9 static let stars = "(repo["stargazers_count"] as? Int ?? 0) stars" 10 static let watchers = "(repo["wachers_count"] as? Int ?? 0) watchers" 11 static let forks = "(repo["forks_count"] as? Int ?? 0) forks" 12 static let issues = "(repo["open_issues_count"] as? Int ?? 0) open issues" 13}

VC

1 func setupUI() { 2 LanguageLbl.text = repoTxt.language 3 StarsLbl.text = repoTxt.stars 4 WatchersLbl.text = repoTxt.watchers 5 ForksLbl.text = repoTxt.forks 6 IssuesLbl.text = repoTxt.issues 7 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

Swift

1 setupUI(repo: repo) // Cannot convert value of type '[String : Any]' to expected argument type 'Repository'

上記のエラーが出ている関数の定義ですが、

Swify

1 func setupUI(repo: Repository) {

これをみる限り、setupUI(repo:)の引数はRepository型を渡す必要があります。

一方、エラーメッセージから判断すると、渡している変数、つまりrepoの型は [String: Any] の辞書型となっています。渡そうとしている変数の型と、受け取りのための変数の型が一致しないことがエラーの原因です。

なので、setupUI(repo:) に渡す変数の型を Repository型にする必要があるのではないでしょうか。

投稿2020/09/09 07:26

TsukubaDepot

総合スコア5086

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

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

kazuki_user

2020/09/09 07:44

override func viewDidLoad() { super.viewDidLoad() setupUI(repo: Repository) getProfileImage() } としたところ、 Cannot convert value of type 'Repository.Type' to expected argument type 'Repository' となるのですが、 辞書型以外にも原因があるのでしょうか?
TsukubaDepot

2020/09/09 07:51

「型」を渡すのではなく、Repository型の変数を渡す必要があります。
kazuki_user

2020/09/09 08:17

ありがとうございます! 引数付きの関数を呼び出す際には、hoge型の変数を設定し、渡す必要があるのですね???? ですがまたモデルにて、 Editor placeholder in source fileエラーが依然として表示されるのですが、 どのような引数を指定すれば良いのでしょうか? init(repo: repo)でしょうか?
kazuki_user

2020/09/09 08:18

let repo = selectedUser.repo[selectedUser.RepoToPass]実行のため、 var selectedUser: SearchRootVC! を記述したのですが、 Cannot use instance member 'selectedUser' within property initializer; property initializers run before 'self' is available というSwift言語特有のエラーが出てしまいました。 回避策は色々あるようですが、今回の場合はどのような策が有効でしょうか?
TsukubaDepot

2020/09/09 08:22

> どのような引数を指定すれば良いのでしょうか? それは、このコードを作られたkazuki_userさんが一番分かっていることかと思いますし、与えられた情報だけでは判断することは難しいと思います。 Repository型にはイニシャライザがあり、そこで値を代入しているのでイニシャライザに引数を渡す必要はありませんが、その一方、イニシャライザでやっていることは、selectedUser.repo[selectedUser.RepoToPass](おそらく辞書型)の情報をキーごとに代入していることだけです。 なので、コード全体として整合性を合わせる必要もあるのではないでしょうか。 もし、このやりとりが理解できないとなると、ここで説明するには場所が足りないかと思います。 Swift文法のごく基本的な部分になりますので、文法について正確に学ばれることをお勧めします。
kazuki_user

2020/09/09 08:37 編集

了解です。 そもそもテキストデータをモデルに保存するには、initは適切なのでしょうか? "Written in (repo[ApiKey.Language] as? String ?? "")"のような、テキストデータです。 struct にてstatic let= "テキスト" も考えたのですが、これは不適切ですか?
TsukubaDepot

2020/09/09 08:45

> そもそもテキストデータをモデルに保存するには、initは適切なのでしょうか? > "Written in (repo[ApiKey.Language] as? String ?? "")"のような、テキストデータです。 ごめんなさい、聞きたいことがよくわからないのですが、具体的にはどのようなことをやりたいのでしょうか。
kazuki_user

2020/09/09 08:57

ご返信ありがとうございます。 質問欄に追記致しますね。
kazuki_user

2020/09/09 23:31

追記2に記載した通り、一旦はstructを使用することにしました。 他に有効なテキスト格納方法があれば、教えて頂きたいです。 とりあえず、本問題は解決済とさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問