読者です 読者をやめる 読者になる 読者になる

Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift入門 #219】関数プログラミング その4(複雑な処理を簡略化)

Objective-C Swift 関数型プログラミング

for文、if文がいくつもあり複雑な処理を関数型プログラミングで簡略化する。

■配列内の文字列を先頭の1文字が同じものどうしでグループ化する

関数プログラミングを使わない場合

// 単語リスト
let words = ["Cola", "Coffee", "orange juice", "Cider", "Pocari", "Tomato juice", "pose"]

// エイリアス → データ型を指定するのを省力化。コードが見やすくなる
typealias Entry = (Character, [String])

// 単語リストをグループ化
func buildWordGroup(words: [String]) -> [Entry]{
    var result = [Entry]()

    var letters = [Character]()
    for word in words{
        let firstLetter = Character(word.substringToIndex(advance(word.startIndex, 1)).uppercaseString)

        if !contains(letters, firstLetter){
            letters.append(firstLetter)
        }
    }

    for letter in letters{
        var wordsForLetter = [String]()
        for word in words{
            let firstLetter = Character(word.substringToIndex(advance(word.startIndex, 1)).uppercaseString)

            if firstLetter == letter{
                wordsForLetter.append(word)
            }
        }
        result.append((letter, wordsForLetter))
    }

    return result
}

// 結果を出力
println(buildWordGroup(words))

※結果(Playground画面)
f:id:fjswkun:20150628153420p:plain

関数プログラミングを使った場合

// 単語リスト
let words = ["Cola", "Coffee", "orange juice", "Cider", "Pocari", "Tomato juice", "pose"]

// エイリアス → データ型を指定するのを省力化。コードが見やすくなる
typealias Entry = (Character, [String])

// 単語リストをグループ化
func buildWordGroup(words: [String]) -> [Entry]{
    let letters = words
                    .map{(word) -> Character in Character(word.substringToIndex(advance(word.startIndex, 1)).uppercaseString)}
    let distinctLetters = distinct(letters)
    println(distinctLetters)

    return distinctLetters
            .map{(letter) -> Entry in
                return (letter, words.filter{(word) -> Bool in
                    Character(word.substringToIndex(advance(word.startIndex, 1)).uppercaseString) == letter
                    })
            }
}

// 重複排除
func distinct<T: Equatable>(source: [T]) -> [T]{
    var unique = [T]()
    for item in source{
        if !contains(unique, item){
            unique.append(item)
        }
    }
    return unique
}

// 結果を出力
println(buildWordGroup(words))

※結果(Playgournd画面)
f:id:fjswkun:20150628153444p:plain

・さらに関数プログラミングを使ってリファクタリング

// 単語リスト
let words = ["Cola", "Coffee", "orange juice", "Cider", "Pocari", "Tomato juice", "pose"]

// エイリアス → データ型を指定するのを省力化。コードが見やすくなる
typealias Entry = (Character, [String])

// 単語リストをグループ化
func buildWordGroup(words: [String]) -> [Entry]{
    func firstLetter(str: String) -> Character{
        return Character(str.substringToIndex(advance(str.startIndex, 1)).uppercaseString)
    }

    return distinct(words.map(firstLetter))
        .map{
            (letter) -> Entry in
            return (letter, words.filter{
                (word) -> Bool in
                firstLetter(word) == letter
            })
    }
}

// 重複排除
func distinct<T: Equatable>(source: [T]) -> [T]{
    var unique = [T]()
    for item in source{
        if !contains(unique, item){
            unique.append(item)
        }
    }
    return unique
}

// 結果を出力
println(buildWordGroup(words))

※結果(Playgournd画面)
f:id:fjswkun:20150628153506p:plain

【参考情報】
iOSアプリ開発未経験の人向け
iOSアプリ開発をはじめたとき最初に買った書籍
【アプリ作成未経験の人向け】
Storyboardを使って画面を作成していく。
手順にしたがって操作していくと、ボタンの作成やWebViewの作成などができる。
アプリって、こんな感じで作るんだというのを体験できる。

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】

・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾

③中級者、上級者向け

詳解 Swift

詳解 Swift