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

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

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

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

Q&A

解決済

2回答

198閲覧

クラスからインスタンスを検索して取得したい

Yeezy21

総合スコア21

Swift

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

0グッド

0クリップ

投稿2019/02/19 09:37

編集2019/02/20 02:53

前提・実現したいこと

personというクラスのarrayというインスタンスの配列の中に人の名前が入っています。
languageというクラスにその人が話せる言語のインスタンスの配列があります。
textFiledにはPickerViewをインプットしていてPickerViewで返す配列がpersonクラスのArrayという配列です。
そのPickerViewから選択したAという文字がtextFiledに入っている場合、下のPickerViewnにはlanguageクラスのAという配列を返したいです。

どうすれば取得できますか?

クラスにしなくてもViewControllerのクラスにlanguageクラスの配列を定義して、返したい配列の名前で定義でに一致したら返すということはできるのですが、それだとViewcontorllerのコードが長くなりすぎるので別のクラスを作り呼び出しています。

該当のソースコード

swift

1class person: NSObject { 2 let array = ["A","B","C","D","E","F","G","H"] 3}

swift

1class language : NSObject { 2 let A = ["Japanese"] 3 let B = ["English"] 4 let C = ["Japanese","French"] 5 let D = ["Italian"] 6 let E = ["English","Spanish"] 7 let F = ["Chinese","Japanese"] 8 let G = ["Korean","Japanese","English"] 9 let H = ["German","Spanish"] 10

試したこと

下記のコードのように手入力していたが、personArrayが1000近くあるのでコードが長くなりすぎる

swiff

1swift text { 2 case "A": 3 pickerArray = language().A 4 case "B": 5 pickerArray = language().B 6 case "C": 7 pickerArray = language().C 8 case "D": 9 pickerArray = language().D 10 case "E": 11 pickerArray = language().E 12 case "F": 13 pickerArray = language().F 14 case "G": 15 pickerArray = language().G 16 case "H": 17 pickerArray = language().H 18 19}

イメージ説明

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

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

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

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

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

fuzzball

2019/02/20 00:14

personとlanguageを別クラスにする必要があるのでしょうか?
fuzzball

2019/02/20 00:15

let "A" = ["Japanese"] ってなんでしょうか?エラーになりますよね?
fuzzball

2019/02/20 00:16

なぜNSObjectを継承しているのでしょうか?
fuzzball

2019/02/20 00:17

PickerViewの画像はどういう意味があるのでしょうか?
Yeezy21

2019/02/20 02:51

すみません、let A = ["Japanese"]の間違いでした。 personというクラスにarrayという配列を持たせ、その配列を上のTextFieldにinputViewしてあるPickerViewに返しているからです。 そこで選択した文字に合わせて下のPickerViewに返す配列をクラスから取得したいです。 違うクラスにする必要はないのですが、personクラスがとても長いためもう一つクラスを作ってます。
fuzzball

2019/02/20 02:57

数が膨大だからこそ、対になるデータはまとめておくべきではないですか? それとも、personとlanguageは1対1ではないのでしょうか?
Yeezy21

2019/02/20 03:03

personとlanguageは1対1です。 説明不足ですみません。 コードが長いので違う場所に保存した方がいいのかなと思い分けていました。
fuzzball

2019/02/20 03:49

そもそもで言うと、1000件もあるならcsvなりdbなりで「データ」として別に持つべきだと思います。
guest

回答2

0

同じ名前のインスタンスを取得する、んじゃなくて、インスタンスの中にキーワード(インスタンスの名前?)入れといてそれで検索するようにすればいいんでは

投稿2019/02/19 10:31

y_waiwai

総合スコア87719

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

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

Yeezy21

2019/02/19 11:06

例えば let "A" = ["Japanese"] というのを let "A" = ["Japanese", "A"}という風にするということでしょうか? それでどう検索するのですか?
guest

0

ベストアンサー

現状のコードのままで回答すると、

"A"を得るためには0というインデックス値が必要になるはずですから、language側もそのインデックス値でアクセスできる配列にすればいいと思います。

swift

1class language : NSObject { 2 let array = [ 3 ["Japanese"], 4 ["English"], 5 ["Japanese","French"], 6 ["Italian"], 7 ["English","Spanish"], 8 ["Chinese","Japanese"], 9 ["Korean","Japanese","English"], 10 ["German","Spanish"], 11 ]

swift

1print(person().array[6]) //=> G 2print(language().array[6]) //=> ["Korean", "Japanese", "English"] 3

投稿2019/02/20 03:54

fuzzball

総合スコア16731

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

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

Yeezy21

2019/02/20 18:27

適切な回答ありがとうございます。CSVへのデータの保存方法も試してみます! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問