配列の要素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}
これで返り値が返されます。
事前にあった問題は解消されたので本題に移って行きます。
###どんなアプローチがあるのか
- ループを回す
- 配列操作
以上の二つを考えていくことになります。
###ループを回す
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