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

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

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

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

Swift

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

Q&A

解決済

1回答

3277閲覧

【swift】Eurekaを使ったフォームの列を動的に変化させたい

KazutakaShimizu

総合スコア157

iOS

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

Swift

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

0グッド

1クリップ

投稿2016/11/24 01:08

編集2016/11/25 03:31

現在iosアプリを作っているものです。
求人に対する応募フォームの画面を作ろうと思っているのですが、
フォームを作る際にEurekaというライブラリを使っています。
https://github.com/xmartlabs/Eureka

求人によってフォームの項目は違っているので、apiを叩きかえってきた配列に合わせてフォームの項目を動的に変化させたいとおもっているのですがうまくいきません。
ソースコードは下記のようになります。formsにはapiから返ってきたフォームのフィールドの名前が入っており、Section2の項目を変化させようとしています。

swift

1private func createNormalForm(forms: [String]){ 2 form = Section("Section1") 3 <<< TextRow("name"){ row in 4 row.title = "名前" 5 row.placeholder = "Enter text here" 6 } 7 <<< PhoneRow("phone"){ 8 $0.title = "Phone Row" 9 $0.placeholder = "And numbers here" 10 } 11 +++ Section("Section2") 12 <<< DateRow("date"){ 13 $0.title = "Date Row" 14 $0.value = NSDate(timeIntervalSinceReferenceDate: 0) as Date 15 } 16 forms.forEach({form in 17 <<< DateRow("date"){ 18 $0.title = "Date Row" 19 $0.value = NSDate(timeIntervalSinceReferenceDate: 0) as Date 20 } 21 }) 22 }

foreach内の<<<の部分で
Unary operator cannot be separated from its operand
というエラーが出てしまいます。

どなたか原因がわかる方、ご教授いただけないでしょうか

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

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

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

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

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

fuzzball

2016/11/24 07:51

コードは ``` で囲って下さい。また、<<<は、行の後ろにコメントとして書いた方が見やすいと思います。
KazutakaShimizu

2016/11/24 12:30

ご指摘ありがとうございます。コードのほうは修正いたしました。ただ<<<に関してはコメントではなく、このライブラリで使われている特殊な記法のようです。
fuzzball

2016/11/24 12:45

なるほど。おもしろいですね。import Eurekaは書いているでしょうか?
KazutakaShimizu

2016/11/24 12:59

import Eurekaは書いており、FormViewControllerも継承しております。同じクラスの中でforeachを使って動的にフィールドを増やそうとしなければきちんとフォームを生成することができる状態です。
fuzzball

2016/11/25 01:11

formsには何が入っているのでしょうか?また、やりたいことをもう少し具体的に書いていただけるでしょうか?SECTION2の項目を増やそうとしているのでしょうか?
KazutakaShimizu

2016/11/25 01:48

ご指摘ありがとうございます。質問を修正いたしました。
fuzzball

2016/11/25 01:58

「フィールドの名前」ということはStringでしょうか?(引数ではAnyになっていますが)で、その名前を項目名($0.title)に反映させたいのでしょうか?
KazutakaShimizu

2016/11/25 03:31

すいません、Stringに修正しました。そうです、$0.titleに反映させたいと考えています。
guest

回答1

0

ベストアンサー

エラーの原因

まず、なぜエラーになるのかを調べました。

swift

1forms.forEach({form in 2 セクション 3 <<< DateRow("date"){ 4 :

**<<<**の前にセクションを指定してやらないとダメなようです。

とりあえず

form[]でセクションを拾えることが分かりました。
form[0]だと"Section1"、form[1]だと"Section2"です。(追加した順)

swift

1forms.forEach { item in //formだと紛らわしいので名前を変えてます 2 form[1] //←これがSection2のこと 3 <<< DateRow(item) { //tagは名前を使います 4 $0.title = item //タイトル 5 $0.value = NSDate(timeIntervalSinceReferenceDate: 0) as Date 6 } 7}

これでうまくいきましたが、form[1]というのがアレなので改良します。

改良版

まず、Section2にtagを付けます。

swift

1 : 2 } 3 +++ Section("Section2") { 4 $0.tag = "sec2" //tag設定(文字列は任意です) 5 } 6 <<< DateRow("date"){ 7 :

そして、tagからセクションを取得して、あとはさっきと同じです。

swift

1if let section = form.sectionBy(tag: "sec2") { //tagからSection2を取得 2 forms.forEach { item in 3 section 4 <<< DateRow(item) { //tagは名前を使います 5 $0.title = item //タイトル 6 $0.value = NSDate(timeIntervalSinceReferenceDate: 0) as Date 7 } 8 } 9}

あとがき

Swift2 + Eureka 1.7.0で検証しました。
回答のコードはSwift3にしているつもりですが、エラーが出たら適当に直して下さい。

投稿2016/11/25 04:06

fuzzball

総合スコア16731

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

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

KazutakaShimizu

2016/11/25 04:31

swift3で実行することができました。 丁寧にご説明いただき、非常にたすかりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問