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

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

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

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

Q&A

解決済

1回答

1584閲覧

Swift 配列の要素1つ1つに関数を適用するにはどうすれば良いのでしょうか?

maru.wk

総合スコア30

Swift

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

0グッド

0クリップ

投稿2017/10/25 10:09

編集2017/10/26 10:00

配列の要素1つ1つに関数を適用する方法がわかりません。配列の要素が果てしなく多いので、何か効率の良い方法があれば教えてください。

swift

1var bright = [Double]()

↑この要素の数がとても多いです;

swift

1 func brightValue(gradiation: Double) { 2 let x = (gradiation-115.97)/60.056 3 print(pow(2.718,x)) 4 }

↑こちらが適用したい関数です。
上のgradiationに配列brightの要素を1つ1つ代入して、新たな配列として得たいと考えています。

こんなことも分からず、情けない限りですが何卒よろしくお願いいたします。

〜追記〜
xAxis様へ

swift

1var bright = [Double]() 2 3 //画像内すべての階調値を取得 4 func light() -> [Double] { 5 6 //var lig = Int(getPixelColorFromUIImage(myUIImage: image!, pos: CGPoint(x:x,y:y))) 7 for y in 0..<Yheight.yheight{ 8 for x in 0..<Xwidth.xwidth { 9 bright.append(Double(getPixelColorFromUIImage(myUIImage: image!, pos: CGPoint(x:x,y: y)))) 10 } 11 } 12 return bright 13 }

このように定義した関数light()を

swift

1func Power() { 2 for index in 0..<light().count { 3 let value = brightValue(gradiation: light()[index]) 4 powerArray.append(value) 5 } 6 }

↑上のように関数lightは戻り値がDoubleの配列なので、配列light()としてご教授いただいたfor文の中に入れても問題ないでしょうか?

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

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

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

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

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

xAxis

2017/10/25 11:51

pow関数ってどんなコードなんですか?
maru.wk

2017/10/25 11:54

累乗です。数式だと、2.718^xになると考えてます!
xAxis

2017/10/25 11:55

brightValue関数と直接関係しているのでコードを貼ってもらえますか?
maru.wk

2017/10/25 11:56

いまパソコンが手元にないので、明日の午前までに必ず貼ります!よろしくお願いします。
xAxis

2017/10/25 12:05

あーpow関数って標準ライブラリの話ですね。となると得たい新たな配列というのはpow関数によって得られた値の配列ということですか?
maru.wk

2017/10/25 12:07

はい。配列brightの要素をpow関数で計算した値の配列です。
guest

回答1

0

ベストアンサー

配列の要素1つ1つに関数を適用する方法

について。アプローチは二つあるかと思います。
がその前に質問内容についてアプローチが必要です。

###返り値がない
配列の各値に関数を適用してその結果を新しく配列に入れるという状態を想定した時、その適用したい関数には返り値が必要になります。ですが質問内容に書かれているbrightValue関数には返り値がありません
ちなみに返り値がある関数は

swift

1func returnFunction() -> Int { 2 return Int(0) 3}

返り値がない関数は

swift

1func voidFunction() { 2 3}

です。
返り値がないのでXcodeから
Missing return in a function expected to return 'Double' と言うwarningが出ます。
平たく言うと関数内にあるであろうDoubleの値の返却し損ねてんぞ!って事ですね。

なのでbrightValue関数に返り値を返すように記述してあげます。

swift

1func brightValue(gradiation: Double) -> Double { 2 let x = (gradiation-115.97)/60.056 3 return pow(2.718,x) 4}

これで返り値が返されます。

事前にあった問題は解消されたので本題に移って行きます。

###どんなアプローチがあるのか

  1. ループを回す
  2. 配列操作

以上の二つを考えていくことになります。

###ループを回す
while文もありますが今回はfor-in文の中で関数を呼び出し、その返り値を事前に用意しておいたArrayに入れていきます。

swift

1var powerArray = [Double]() 2for index in 0..<bright.count { 3 let value = brightValue(gradiation: bright[index]) 4 powerArray.append(value) 5}

こんな風に書いてあげればpowerArrayの出来上がり。

###配列操作
もう一つは配列操作を行う方法。配列操作を行う関数はmap関数、reduce関数、filter関数等々色々あります。
今回はmap関数を使います。これは単純にmap関数の中でbrightValue関数を呼び出すだけです。

swift

1let powerArray = bright.map { brightValue(gradiation: $0) }

###サンプルコード**(追記)**

swift

1//: Playground - noun: a place where people can play 2 3import UIKit 4 5var bright = [Double]() 6 7//insert random value into bright 8bright = (0...10).map { index in 9 return Double(arc4random_uniform(index * index)) 10} 11 12func brightValue(gradiation: Double) -> Double { 13 let x = (gradiation-115.97)/60.056 14 return pow(2.718,x) 15} 16 17//(1) 18var powerArray1 = [Double]() 19for index in 0..<bright.count { 20 let value = brightValue(gradiation: bright[index]) 21 powerArray1.append(value) 22} 23print(powerArray1) 24 25//(2) 26let powerArray2 = bright.map { brightValue(gradiation: $0) } 27print(powerArray2) 28 29powerArray1 == powerArray2 //true

###最後の質問について

関数lightは戻り値がDoubleの配列なので、配列light()としてご教授いただいたfor文の中に入れても問題ないでしょうか?

この質問に関しては答えられないです。質問からは配列brightの扱いが分からないからです(スコープが絡んできます)。その辺りはBuildしてみるなりprintしてみるなりして判断していってください。
ただし、配列brightをlight関数内に置いても問題ない場合、質問に対する回答は問題ないになるかと。

###総評と各々の具体的な使い方

とりあえず1をやってみて短く書きたいなーとか思ったら2でアプローチしたらいいかと思います。

for-in文
https://qiita.com/Morio/items/2ddfaee5b41adb0b64a2

map
https://qiita.com/kotaro_p/items/25b38d1c5150a621e060

投稿2017/10/25 12:45

編集2017/10/26 12:46
xAxis

総合スコア1349

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

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

maru.wk

2017/10/25 13:05

とても丁寧にありがとうございます。参考URLまで載せていただき、感謝しきれません。また、どちらのやり方も、なるほど!が止まりませんでした。 自分は基礎がまだ完全に固まっておらず、質問でもご迷惑をおかけしたと思います。 重ねてになりますが、本当にありがとうございます。
maru.wk

2017/10/25 13:06

明日になりましたら、さっそく実装してみたいと思います。 ご迷惑でなければ、またお願い致します。
maru.wk

2017/10/26 01:52

すみません。エラーが出てしまったのですが、おそらくbright[]がおかしいせいだと思われるので、調整してみます。
xAxis

2017/10/26 03:38

Playgroundで実際に試しました。自分のコード自体は問題ないですね。どんなエラーが出てるかコピペしてもらえます?
maru.wk

2017/10/26 04:26

質問の方を編集させていただきました。自分はXcodeprojectの方で作成しているのですが、そのためなのでしょうか? サンプルコードまでありがとうございます。本当に感謝してもしきれないです。重ねてになりますが、ありがとうございます。
xAxis

2017/10/26 07:15

加筆修正を行いました。回答を読んでもらえば分かると思いますがXcodeprojectだから問題だ、と言うわけではありません。Playgroundのサンプルコードもいい具合に合わせればあのまま使えますよ。
maru.wk

2017/10/26 09:46

返信が遅くなり、申し訳ありません。考えながら実行しているので、もう少しお時間がかかりそうです。 また何かありましたら、この場で質問させていただけるとありがたいです。
maru.wk

2017/10/26 10:02

すみません。最後にもう一度だけ質問を加筆させていただいたので、回答いただければと思います。 初心者なため、ご迷惑をおかけします。
maru.wk

2017/10/26 12:50

何度も何度もありがとうございました。質問の度に、丁寧で分かりやすい解説をいただき本当に感謝しております。 また何かありましたら、是非お願いしたいです。 重ねてになりますが、本当にありがとうごさいました。
xAxis

2017/10/26 13:01

回答とは外れるのでこちらに記載しますが、基本的な文法や簡単なリファクタリングは抑えることを強くお勧めします。このまま進めばいわゆる「何が分からないのかが分からない」ということになりかねないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問