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

これが最後じゃないからね

iOS開発 / Swiftなどの技術を中心に

UIScrollView、UIKit座標計算系に関しての復習

みなさんお元気ですか?
新卒として社会人になり、気がつくとGWになってしまっていました、、、
業務でUIScrollViewでつまってしまったので復習してみることにしました。
プラスαでみなさんご存知UIKit座標系に関しても。

UIScrollView

UITableViewやUICollectionViewもUIScrollViewのサブクラスです。 f:id:haptaro:20170503204939p:plain

UIScrollViewの主な目的

  • 表示したいコンテンツの領域をドラッグして表示できるようにするため
  • ピンチジェスチャでコンテンツの表示を拡大縮小できるようにするため

今回は前述のほうに関してです。
表示したいコンテンツの領域をドラッグして表示するためにはそのコンテンツはUIScrollViewより大きい

UIScrollViewに関するプロパティ f:id:haptaro:20170503213246p:plain

  • contentOffset: CGPoint・・・どのくらいスクロールしているのか。特定の位置を左上角とする位置
    初期値は{0, 0}
  • contentSize: CGSize・・・スクロールする中身のサイズ。スクロール可能な領域 f:id:haptaro:20170503204556p:plain

  • contentInset: UIEdgeInsets・・・余分にどれだけスクロールできるか。こちらは以下の図の余白部分が伸び縮みする感じ f:id:haptaro:20170503204748p:plain

contentOffsetへのスクロールは2通り

  • setContentOffsetメソッドで指定されたcontentOffsetへコンテンツをスクロールさせる
  • contentOffsetプロパティへ直接代入(動きはsetContentOffset:animated: false同じ即座にスクロール)

UIScrollViewを使用するときのポイント

f:id:haptaro:20170503221005p:plain

  • contentOffsetの座標を移動させることでスクロール動作ができることを把握する
  • contentSize(スクロールする中身のサイズ。スクロール可能な領域)を決める
    ※StoryboardでAutoLayout制約をつける人も、コードでレイアウトをする人も結局意識することは同じです

Debug View Hierarchy

Viewをレイヤのように階層化して3D表示してくれる。
Xcode6から追加された機能。

f:id:haptaro:20170503160804p:plain

UI系の不具合やUIScrollViewでのスクロールなどにもってこい。
実際にUIScrollViewのスクロール計算部分で値が合わず、Debug View HierarchyでNavigationBar(44pt)やStatusBar(20pt)の高さを見て解決しました。

UIScrollViewでたまに出てくる処理

scrollView.contentOffsetをxより小さかったらxに、yより大きかったらyにというような処理
ex)
0より小さかったら0に
100より大きかったら100に

var x = scrollView.contentOffset.y
if x < 0 {
    x = 0
} else if x > 100 {
    x = 100
}

省略系

let y = min(max(0, scrollView.contentOffset.y), 100)

以下の座標や計算系

CGFloat・・・CG(Core Graphics)などのふ浮動小数点系。
UIViewの座標系を扱う際はDoubleやFloatではなく、CGFloatを使う必要がある

CGPoint

(x, y)座標

struct CGPoint {
    var x: CGFloat
    var y: CGFloat
}

CGSize

(width, height)の大きさ

struct CGSize {
    var width: CGFloat
    var height: CGFloat
}

CGRect

(x, y, width, height)

struct CGRect {
    var origin: CGPoint
    var size: CGSize
}

※Rect(Rectangles)

※frameはCGRect型

iOSの座標系

f:id:haptaro:20170503211422j:plain

frameとbounds , frame.origin(bounds.origin)とframe.size(bounds.size) の違い

f:id:haptaro:20170503215744p:plain

  • frame・・・親Viewからの座標 (x, y, width, height)
  • bounds・・・自分から見たViewの座標 (0, 0, width, height)
    ※boundsの(x, y)は常に(0, 0) f:id:haptaro:20170503215637p:plain

  • frame.origin(bounds.origin)・・・左上角の座標

  • frame.size(bounds.size)・・・Viewの大きさ

※origin: CGPoint, size: CGSize

まとめ

結局UIKit周りの知識がしっかりないとって感じなんですよね。。。
ただUIScrollViewもRxのものがあったりするので、リアルタイムに動きを監視して何か処理する部分は今後はRxSwiftでバリバリ書いていきたいですねー。
さてまた気分がのったらブログ更新します。

Apple公式ドキュメント

https://developer.apple.com/jp/documentation/UIScrollView_pg.pdf

developer.apple.com

参考URL

blogios.stack3.net www.itwendao.com サイズ指定(CGRect CGPoint CGSize) - iPhoneアプリ開発の虎の巻 gabrielghe.github.io

※中国語は読めません。w

2016年も終わりですね。。。

久しぶりにブログを更新します。 更新をだいぶ怠っていました...反省。

さて、2016年はみなさんにとってどのような年だったでしょうか?
僕は毎年毎年201x年は飛躍的に成長する年にしようと思っているのですがホント微々たる成長しかできていません。
そんなものなのかもしれませんが。笑 1歩1歩成長。


近況報告としては

RxSwift勉強会@Sansan

先日というか結構前に行われたRxSwift勉強会@Sansanで発表してきました。
内容はこちら弊社ブログにて

jp.corp-sansan.com

Rxの発表は内容を決める際にかなり悩みました。
正直ある程度わからないと、Rxのコードを見ても何もわからないと思うので、Observableの概念みたいなところから入ろうかと思ったのですが、それだと知っている人には全くおもしろくもないのでHot/ColdやshareReplay、disposeBagなどにしました。基本的ですけどね。
先輩方はMVVMやRxCommunityのお話をしていました。

ゆーて僕自身も2ヶ月ぐらいしか触っていなく業務でもRxの部分を書いてはいないので、最近わかってきた次第です。
コードを読めるようにはなってきましたが、まだ自分でイケてる感じには書けないですねー。
結構学習コストが高いとか、メンテがされなくなったら...的なことも言われていますが、話によるとAndroid開発ではデファクトとしてRxJavaやRxKotlinが使われているそうなので、知っておいて損はない技術かなーと思ってます!
実際に自分でサンプルを使ってみても通信周りやバインドではかなり使えますね!
これからも継続して勉強していきます!


2つめはなぜか資格試験を2つ受けていました。
1つは内定先の会社で取らなければ昇給が停止になるという恐ろしいもので「個人情報保護士認定試験」というもの。2つ目は「基本情報処理技術者試験」これはまぁ友達が受けるらしくノリで申し込みをしました。笑

個人情報保護士認定試験

要は個人情報保護法の知識とその対策の試験です。
法律なので基本暗記ですね。
しかし試験が課題Ⅰと課題Ⅱに分かれていて合格基準が両方8割以上なのでまぁまぁつらかったです。
これの合格発表は来年の1/18なのですが、自己採点をしたところおそらく受かっていそうで一安心!

基本情報処理技術者試験

こちらは何やらメーカー系や大手SIerの新卒はこれを取らされるらしく、これを取っていると昇格条件にもなっているらしい。
今イケてるベンチャー企業に勤めている方も「あー、前職の最初のころ受けたわー」みたいな記憶があるのではないしょうか?

僕はその反面、持っていても何もないです笑

ただこんなん使わんやろーとかいうのもありましたが、自分自身が情報系の学科でもないので、CPUのクロック数計算やビット計算、コンパイラ構文解析など意外にも面白いところもあり、学びもありましたね!
基本ということもあってDB設計の正規化やオブジェクト指向カプセル化とは?みたいなこもありました。
そして午前は知識と計算問題なのですが、午後は少し業務より?な試験なので、プログラミング言語の問題があり、C, Java, COBOL, 表計算などから1つ選ぶのですが、まぁJavaを選びました。Javaはほぼ前日に文法を確認したぐらいだったので、これはSwiftの〜かとか、これはプロトコルかーみたいな感じで頭で変換して解きました。

そして意外にも合格の賞状が送られてくるのですよ笑
一応国家試験らしく。
賞状は中学校の部活以来ですかね。長らくもらっていない気がします。
なんかめっちゃ資格好きなやつみたいになっていますがそういうわけではございません。笑


さてこんなところで
最後はみなさん恒例の

2017年の目標

目標を10個決めました。
生活面では以前の記事 23歳の誕生日 とほぼ変わっていないのですが

  1. 英会話と英語の記事を苦なく読めるようにする
  2. DJをはじめる
  3. Ruby on Railsで何かを作りながら、サーバサイドやWeb APIの知識を身につける
  4. 「すごいHaskellたのしく学ぼう!」を終わらせる
  5. 個人でiOSアプリを2つリリースする
  6. 健康的な食事を心がけ、ジムに通って筋力、体力をつける
  7. OSS活動をする
  8. デザインを学ぶ(特にSketch, Photoshop)
  9. 2週間に1回本を読む時間とブログを書く時間を作る
  10. ピアノを始めて曲が作れるようになる

です。
DJをはじめるやピアノを始めるなどの趣味的な部分の目標も含めました。
まぁ最初に単位を取り切り、卒論を出し、大学を卒業するという最重要タスクがあるのですが笑


そして最後になりましたが

みなさんにとって2017年が良いお年になりますように。

Swift、iOS関連を中心に勉強会やイベントに参加すると思うので是非来年も宜しくお願い致します。try! Swift Tokyo 2017にも参加する予定です!

それでは良いお年をお迎え下さいー


P.S. 今まで公開しないソースコードはBitbucketを使用していたのですが、今更ながらGithubのStudent用Private Accountにしました。(あと3ヶ月ww)

内定者アルバイトで学んだこと

もうそろそろ10月で、夏が終わりそうですねー...悲しい😢

ブログの更新を怠っていましたが、また出来る限り書いていこうと思ってます!

さて、現在内定先でiOSエンジニアとしてアルバイトをしているのですが、
そこでプログラミングをする上で重要だと思ったこと第3選を紹介したいと思います。

そしてこれはプログラミング言語に依存しない話です。

重要だと思ったこと第3選


1. 命名
2.設計、アーキテクチャ
3.Git, GitHub

1.命名

まず初めに個人で開発をしているときと比べて明らかに意識していることは命名ですね。 クラス名、メソッド名、変数名とさまざまなときに命名をしなければいけないのですが、命名が適当だと何が書いてあるのかがわかりにくいほか、必ず内部実装を見なくてはいけなく時間も奪われてしまいます。

そして、基本的にコードを読めばわかる部分はコメントとしては記述せず、「なぜそのようなコードになっているか」や、「注意しておくこと」、またUIコンポーネントの説明には「補足」を入れておくということです。
ちなみに会社によってはコメントを多めに記述したり、会社独自のルールもあるとは思うのですが。

例)
・なぜそのコードを書いているかの理由

// 〇〇のためにこのタイミングでアクションログを送信しておく

・使っているライブラリのURLや、参考URLなど

ライブラリ: 〇〇、参考: △△

・UIコンポーネントでLabelが3つのったViewの命名などで、「ViewWithLabelsOnIt」などという口語的な変数名をつけるではなく、コメントで補足する

// Labelが3つのったView
@IBOutlet weak var view: UIView!

はい、リーダブルコード。大切ですね。

https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1?s=books&ie=UTF8&qid=1474369709&sr=1-1&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89www.amazon.co.jp



2.設計、アーキテクチャ

次は設計、アーキテクチャです。
クラス設計を「1クラス1責務」にすることやMVC、MVVMアーキテクチャに沿うことが大切

この辺であまり悩んだことがない人もいるとは思いますが、自分がリファクタリングしている最中は「このメソッドは本当にこのクラスの責務か?適切なクラスにメソッドが記述されているか」や、「ちゃんとMVCに沿っているか」を考えてやっています。

またシングルトンなどのデザインパターンをしっかりと理解していることや、Utilityクラスの作成、通信やデータベースやManagerクラス系はModel層にあるかなども重要だと思います。

自分も正直まだまだでこれからで、もっと経験を積んで設計やアーキテクチャについて学んでいこうと思っているところです。

そして購入して少ししか読んでいなかったJavaデザパタを掘り起こしてちゃんと読もうと...

https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=sr_1_1?s=books&ie=UTF8&qid=1474369871&sr=1-1&keywords=Java%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3www.amazon.co.jp



3.Git, GitHub

Git、GitHubも重要ですねー
個人開発ではGit、GitHubは使ってはいたものの、1人なのでmasterにpushしていたり、branchもなんとなく切って作業、コミットメッセージもなんとなくで、そこまで意識して開発をすることはありませんでした。
(この時点で結構ポンコツだったと気付かされました...笑)

しかし、初めてチーム開発を経験して、コミットメッセージの重要性や、作業単位でなるべく細かくコミットをしていく重要性を感じました。

特にコードレビューをしていただかないとマージがされないので、レビュアーの人にも適当なコミットメッセージや、いろいろなところを編集してから最後に大きなコミットをしてしまうと、非常に見にくく面倒な思いをさせてしまいます。
レビュアーの方も人間です。

またリファクタリングの業務中、blameでコミットメッセージを見ることがあるのですが、「人によってこんなにも差が生まれるのか」と思うぐらい、丁寧なコミットメッセージもあれば、関係のない内容が記述された(おそらく少ない作業単位ではなく大きな単位でコミットしているため別の内容がコメントされている)コミットメッセージもあります。
このような経験から反面教師で自分はblameされても大丈夫なようにしっかりとしたコミットメッセージを記述するように心がけています。



「無知の無知」への3ステップ

それと最後に先輩から教えていただいた記事を紹介します。
(この記事自体は別の方が書かれたものです)

仙石浩明の日記: 「無知の無知」への 3ステップ


1. 「あとで調べればいいや」
2.「何がわからないのかわからない」
3.「わかったつもり」

まぁこれはエンジニアに限った話ではないですが、

考える習慣を身につけ、「あとで調べればいいや」はせず、「わかった」と思っても本当に理解しているのか、今一度自分を疑ってみること

を意識して生活していきたいです。

Swiftのプロトコルやジェネリクスなどについての勉強メモ

お久しぶりです。
プロトコルジェネリクスは奥が深く、すべてをまとめることは不可能なので、自分なりに特徴をピックアップしてまとめてみようと思います。

プロトコルとは

「実装を伴わない宣言の集合」で、振る舞いや性質を表す。

オブジェクト指向言語における継承の概念は
・クラス継承
・インタフェース継承
の2種類があり、Swiftはプロトコルを利用してインタフェース継承を実現する。

拡張(Extension)とは

すでに存在するクラス、構造体、列挙型、プロトコルに新しい機能を追加することができる 注意しておきたいこととしては、「格納型プロパティ」と「プロパティオブザーバ」は追加できない。

ジェネリクスとは

Swiftの最も強力な特徴の1つで、柔軟で再利用可能な関数やあらゆる型を抽象的に記述することができる。 Swiftの標準ライブラリでもジェネリクスのコードが多用されている

※ちなみにジェネリクスはSwift特有の機能ではなく、Javaにもあり、C#ではジェネリックC++ではテンプレートとなっている

ジェネリクスには2種類ある
ジェネリクス関数
ジェネリクス

Swiftの多重継承について

C++Pythonとは異なり、Swiftでは多重継承の機能はないので、プロトコルを使用して多重継承を実現する
その際の複数のプロトコルを適合させる際はプロトコルは振る舞いなどを持った性質のようなものなので感覚では「性質の融合」。
たとえば
CollectionTypeは

CollectionType: Indexable, SequenceType {}


という性質のIndexable

という性質のSequenceType
の融合であると言える

関数の戻り値にプロトコルを使ってアクセス制御

// プロトコルを使ってアクセス制御(フィルター)
// アクセス可能なものを定義
protocol AccessibleFilter {
    var name: String { get }
    var age: Int { get }
}

// モデルクラス
class Model: AccessibleFilter {
    // 5つのプロパティ
    var id: String = NSUUID().UUIDString
    var createdAt: NSDate = NSDate()
    var updatedAt: NSDate = NSDate()
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

func readData() -> AccessibleFilter {
    let data = Model(name: "taro", age: 10)
    return data
}

これを使うと

f:id:haptaro:20160602004817p:plain

ちゃんとフィルターがかかり補完にアクセス制御がされる

ジェネリクス型について

ジェネリクス型は基本的に構造体やクラスで使われる
型パラメータTにはプロトコルに準拠させることができる

クラスの場合

 class MyClass<T> {}

構造体の場合

 struct MyStruct<T: プロトコル> {}

ジェネリクス関数について

Intと全く同じ性質を持つ型パラメータTを作成してみる(今回は理解のため、TはIntと同じ笑)

func genericsFunction<T: SignedIntegetType where T: Comparable, T: Equatable>() {}

もしくは

func genericsFunction<T where T: SignedIntegerType, T: Comparable, T: Equatable>() {}

と書ける。今回の場合は下のほうがわかりやすい気がしますね。 もし複数のプロトコルとクラスを継承する場合は

func genericsFunction<T: クラス where T: プロトコル1, T: プロトコル2, T: プロトコル3>() {}

などとクラスをwhereの前に出したほうがわかりやすい

※型パラメータには慣習的ににT, U, V, Wなどが使われる
※クラス継承の場合はクラスとプロトコルを継承する際の順番はまずクラスを継承し、そのあとプロトコルを適合させるが、ジェネリクス関数の型パラメータの場合は順番は関係なく、最初に型パラメータにプロトコルを適合させてから、クラスを継承しても良い

Selfについて

Self・・・自分自身の型

プロトコルの関数定義の際によく用いられ、そのプロトコルを適合させたクラス、構造体、列挙型自身になる。 特に

func 関数名 -> Self { 
// do something
return something
}

となっていた場合はそれ自身のインスタンスを返す。

付属型について

ジェネリクスの機能の1つ
まずなぜ付属型が必要なのか?
=> プロトコル内では型パラメータのような抽象的なものが使えないので、associatedtypeを使って付属型(抽象的な型)を表現する そしてassociatedtypeは付属型を宣言するための宣言子である

associatedtype 付属型: 条件

以下のようにプロトコル内で「なんでも良い抽象的な型」を宣言することができる

protocol SequenceType {
  associatedtype SubSequence
}

※型パラメータのように条件をつけることも可能

protocol Indexable {
 associatedtype Index: ForwardIndexType
}

感想

やっぱりプロトコルジェネリクスは難しいですね。しかしマスターするとコードの表現力も上がりますし、抽象化もでき、いろいろ役立つと思うので少しずつ頑張っていこうかと思っています。
もし間違いや良い表現がありましたら気軽にコメントください!
そしてこれから知識が付き次第追記していこうと考えています

23歳の誕生日

そういえば
5月6日をもって23歳になりました。
もう今日は22日ですが、23歳の目標を生活面で3つ、技術面で3つの計6つ個作りました。

生活面

  • 筋トレや運動をし、健康的な食生活を心がける
  • まめに手洗いうがいをする
  • 英語の勉強をする

生活面はしょーもないことも入っていますが、22歳はよく体調を崩していて、熱や風を引くとやりたいこともできないので何よりも健康が大切だと思いました。
英語は今後必ず必要なので少しずつ勉強していきたいですね。リファレンスを読むリーディング能力もそうなのですが、海外の人の動画を見たりもしたいのでヒアリング能力の改善もしたいです。
英語できる人はほんとあこがれます...
It's never too late to start.

技術面

  • Swiftの進化についていく
  • 「すごいHaskellたのしく学ぼう!」本をしっかり理解して読み切る
  • メモリやアルゴリズム、通信など、プログラミングの基礎を再度勉強する

Swiftは3.0までにプロトコルジェネリクスあたりもしっかり理解し、3.0でまたいろいろ変わるそうなのでそこで再度頑張ろうと思っています。

すごいH本は関数型プログラミングという新しいパラダイムに触れ、感覚を養うために純粋関数型言語Haskellを理解すれば、Swiftの書き方も変わってきたりすると考えています。

最後は基礎力も問題です。これはスポーツでも勉強でも何でもそうだとは思うのですが、基礎がしっかり固まっていないと応用は絶対できないので、この年でもう一度メモリや、アルゴリズム、低レイヤなどの勉強を再度しようと思っています。

まぁこんなとこでしょうか。

17卒でエンジニアとして良いスタートダッシュが切れるように基礎力をあげたいと思っています。

ただ学生最後の年でもあるので、勉強もそうですが遊びも全力でやっていこうと思います!!

あとはまず単位を取って卒業ですね笑 結構危機的な状況でもあるので大学の課題などもしっかり!w

SwiftのcompletionとSQLのPreparedStatement

Swiftのcompletion

初めの頃、よく通信処理などのメソッドの引数の最後にcompletionやcompletionHandlerなどが与えられ、そのブロック内で通信処理の後に実行することやJSONのパースなどをしていました。

しかし、最初の頃はXcodeの補完のダブルクリック展開でなんとなーく終わったあとの処理をブロック内に書いておいて、引数のdataをパースしたり、errorを確認していました。

全くわかりませんでした。
ですよね?笑

まぁー、僕は理解はできていませんでした。

しかし最近クロージャに再挑戦したところわかってきましたので、メモ程度に。
色々ツッコミはあると思いますが、最初の僕みたいな人が見るとなんとなーくわかるかなと。(クロージャの書き方や詳しい性質は説明しませんので)

またタイトルはクロージャでもよかったのですが、クロージャは他にもいろいろな使い方があるのでこのようにいたしました。

そしてわかりやすいように通信中にエラーは起きないと仮定しております。 (responceはtypoです)

まずはクロージャを使わなかったもの f:id:haptaro:20160521195309j:plain

このように関数を2つ作らなければいけないですね。

f:id:haptaro:20160521195528j:plain

コンソールはこんな感じです
f:id:haptaro:20160521195609p:plain

「生成されたもの」という表現はおかしいですが、スクショ撮り直すの面倒なので、レスポンスだと思ってください

クロージャを使うと f:id:haptaro:20160521200844j:plain

クロージャの特性により変数に値を保持できるからですね。 f:id:haptaro:20160521195812j:plain

こんな感じでクロージャの特性を使うことによりブロック内で終わったあとの処理が書け、可読性の向上に繋がるというわけです!!
今回は通信メソッドの実装もしましたが、メソッドを使用する側ですと、別で通信後の処理のメソッドを作るよりも、クロージャで書いたほうが見やすいし使いやすいですね。
ただまだまだクロージャを使いこなせていないのでこれからも精進していきます。

次は

SQLのPreparedStatement

これは最近インターンで開発させていただいているプロジェクトのコードを見て、SQL文に?が入っていてなんだこれ?と思ったので即ググりました。(?を見るとすぐにオプショナルと思ってしまう癖がついています...w)

これはPreparedStatementというものでした。

PreparedStatementとは?
準備済みSQL。バインド変数?のパラメータを持つSQL

たとえば
SELECT * FROM name WHERE id = ?

上記のようなSQL文を予め準備しておき、?の部分は実行時に展開させる

PreparedStatementはどのようなメリットがあるのか?

ちなみに最近のニュースでもありましたが、高校生がDos攻撃ツールなどを保持している時代なので、今サービスやプロダクトを作っている人や今後作る人はセキュリティもしっかり考えて作らなければいけませんね。

www.nikkansports.com

僕はSQLインジェクションDos攻撃DDos攻撃CSRF、ポートスキャンぐらいしか知りませんが、これからセキュリティの知識も少しずつ頭に入れていきたいと思っています

関数のカリー化と部分適用がなんとなーくわかってきた

3ヶ月前ぐらいに「詳解SwiftのCHAPTER 13 クロージャ」の章の「関数のカリー化と部分適用」が
は?って感じだったのですが今はなんとなくですがわかってきました。
あ、はじめに言っておきますが、まだ理解途中なのであくまで自分の現在の理解ではって感じです

「整数x, y, zを足し算して返す関数」

Swiftで実装 f:id:haptaro:20160518212630p:plain

Haskellだと f:id:haptaro:20160518210850p:plain

Haskellめっちゃ簡潔ですね! ただSwiftでreturnがあったほうが仕組みの理解はコードでできるかもしれませんね。

やっていること

x, y, z(Int型の変数を3つ)受け取って、Int型の値を返す

やり方

  1. x(Int型の変数1つ)を受け取って、Int型の変数を2つ受け取ってInt型の値を返す関数をクロージャで返す
  2. y(Int型の変数1つ)を受け取って、Int型の変数を1つ受け取ってInt型の値を返す関数をクロージャで返す
  3. z(Int型の変数1つ)を受け取って、x, y, z(今までの変数)を足した値を返す

そして恥ずかしながらこれを書いてみてはじめて「クロージャ内部に変数(結果)を持たせる」感覚がわかった。

カリー化関数は何が良いのか?

カリー化をすることによって、「関数を本来より少ない引数で呼び出したときに部分適用された関数が得られること」で「新しい関数を作ることができる」からです。
※すごいHaskellたのしく学ぼう!からの引用

今回の例で見てみますと f:id:haptaro:20160518214735j:plain ただまだ正直部分適用された関数をどのように使うかは計算的な例しか理解していないので、今後調べていきたいですね。

まぁHaskellガチ勢、関数型プログラミングガチ勢の人からしたらなめんなよ!って感じかもしれませんが自分的には意外と感動!笑
むしろマサカリ投げられて手とり足とり教えて欲しい。。。

そしてターミナルとかで勉強していても良いのだが、効率を上げるためにお試しで買ってしまった...

正直高いけど、...まぁー投資だと思って。
お金ないです笑

Swift 3.0では

カリー化関数宣言構文が削除されます。 Swift 2.2現在では f:id:haptaro:20160518212848p:plain

というように書けますが、warningがあるように f:id:haptaro:20160518213039p:plain

怒られます。

関数型プログラミング初心者として思うことは普通に面白いですね!
また自分は理系なのでHaskell再帰関数定義が漸化式のように見えたり、集合の内包的記法なども出てきて数学との関連性が見えてくるもの面白いです