42611


Swiftではmap,filterなどの便利な機能があるのであまりfor文を使わない方がいいと聞いたのですが、以下のような場合も書き換え可能な方法がありますでしょうか。

[code]

    var test = ["りんご","ごりら","らっぱ","ぱらしゅーと","とんねる"]
    for i in 0..<test.count{
        if test[i] == "ごりら"{
            test[i] = "ごじら"
        }
    }
    
[/code]

要素をすべて確認して、一致する場合、一致した要素そのものに変更を加えたいのです。


CC BY-SA 3.0
2018-03-23T12:15:06.220
42610
2018-03-25T16:38:17.810
27486
question
swift
Swiftでのfor文の書き換えについて


`map` の中で条件分岐をすれば良いです。

[code]

    test.map { (s: String) -> String in
        if (s == "ごりら") {
            return "ごじら"
        } else {
            return s
        }
    }
    
[/code]

[Wandbox](https://wandbox.org/permlink/5Nt2ucI0OTZBQYhI)


CC BY-SA 3.0
2018-03-23T12:28:17.977
42611
2018-03-23T12:28:17.977
19110
42610
answer


forとmapは役割が異なるので、単純に置き換えられるわけではありません。  
例に挙げられたプログラムの場合、forループでtest配列そのものを書き換えていますが、mapの場合はtest配列はそのままで、新しい配列がmapの戻り値として返ってきます。  
参考までに。


CC BY-SA 3.0
2018-03-24T03:09:00.000
42622
2018-03-24T03:09:00.000
8077
42610
answer


内部引数名の省略表記（$0）や三項演算子（?）を使ってこんな風にも記述できます。

[code]

    var test = ["りんご","ごりら","らっぱ","ぱらしゅーと","とんねる"]
    test = test.map {
        $0 == "ごりら" ? "ごじら" : $0
    }
    
[/code]

今回は配列に変更を加える場合なので、変更後の配列を返すmapを利用しましたが、  
変更を加えない場合はmapの代わりにforEachを利用すると良いかと思います。

[code]

    var test = ["りんご","ごりら","らっぱ","ぱらしゅーと","とんねる"]
    test.forEach {
        print($0)
    }
    
[/code]


CC BY-SA 3.0
2018-03-25T16:38:17.810
42649
2018-03-25T16:38:17.810
19889
42610
answer