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

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

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

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再帰関数定義が漸化式のように見えたり、集合の内包的記法なども出てきて数学との関連性が見えてくるもの面白いです

綺麗に三日坊主でしたね笑

ブログを始めたものの綺麗に三日坊主で終わってしまっていました。 書こう書こうと思ってはいるものの書けないですねー ブログやっている方にブログを続けるコツ?みたいなのがあれば是非お聞きしたい!

そして

SwftポケットリファレンスChapter 2を読みました。

Chapter 2は「Swiftの基本的な使い方」というタイトルで、Swiftの概要とObjective-Cとの違いについて触れたあと、文法やよく使うクラスのメソッドなどが記述されていました。
自分の感覚的には普段からSwiftを書いている人にはSwiftの文法が中心なのでさらっといけるのではないでしょうか。

ただこの本は初心者にも優しく、コメントの記述方法まで載っていました。 これは自分も初めは思うのですが、コメントの方法は気になるのでありがたいですね。
また基本的にサンプルも書いてあり、写経で動くという点も!

さらに読み進めてみると日付を比較するisEqualToDateメソッドなど自分は1回も使ったことがないメソッドなどにも出会えて楽しかったです。個人的にはこのメソッドはNotificationや時間を利用したアプリなどで使えるのかなーと思ったり。
そしてC言語では文字はシングルクォーテーション、文字列はダブルクォーテーションという決まりがあったが、Swiftでは文字列(String型)も文字(Character型)もダブルクォーテーションで囲まないといけないのですね。

ただ1つ思ったことはSwift3.0で廃止されるC-Styleのforループや、インクリメントとデクリメントについては昔のままでしたね... まぁー本を書いてから世に出るまで相当な時間がかかると聞いているので仕方がないとは思うのですが。

最近プロトコルによく触れているせいかプロトコル拡張は頭に入っていたもののクラスを拡張できることがすっかり頭から抜けていて...という気もしました。

そして今回読んでいて自分で確認しておきたい部分やまだ理解は浅いなと思った部分は

  • Swiftにおけるアクセス修飾子
  • 列挙型
  • 辞書

ということですかね

Swiftにおけるアクセス修飾子

アクセス修飾子については詳解Swiftで確認

public, internal, privateの違い

public・・・モジュールをimportすれば、どこからでもアクセス可能
internal・・・定義を含むソースファイルと同じモジュールの内部からならば、どこからでもアクセス可能
※アクセス修飾子を指定しない場合はすべてinternalになっている
private・・・定義されたソースファイル内のみからアクセス可能

f:id:haptaro:20160517000132j:plain

※詳解Swiftより

列挙型

列挙型に関しては普段使っているものの、使いこなせていない感がひどいので、今度列挙型に注目して記事を書こうかと。rawValueとかイカした使い方あるのかなー(正直わかっていない)

辞書

これも確認になるのですが、配列は順番という概念がありますが、辞書は順番という概念がないためループで回したからといって入れた順番で値が取れるとは限らないですね。

f:id:haptaro:20160516235851p:plain

これを解決するには返り値がタプル型の配列ということを使えばうまくできそうですね。

f:id:haptaro:20160517001123p:plain

そしてこの記事のあともまた続くかわからないですが今回はこの辺で。

大学の課題やらないとーーーー泣

iOSアプリのSubmit周りの資料

27日のHealth Swift MeetupのLT資料になります。


そして資料の補足を書きたいと思います。

全体として

CertificatesとProvisioning Profilesには利用できる期限があるため期限切れになっていないか、いつまで利用できるものかはたまに見ておいたほうが良いです。
IdentifiersにはApp Groupsなどもあり、Provisioning ProfilesにもAd-HocやtvOS用のもあるので、用途によって作り分けてください。
今回の資料は説明をわかりやすくするために基本的なDevelopmentとDistributionの2種類にしてあります。
またBuildやArchiveの際に警告で「Fix Issue」が出てくるかもしれませんが、提出関係で「Fix Issue」はあまりしないほうが良いです。「Fix Issue」することによって理解していないものが自動でダウンロードされてしまう危険性があるからです。

個別のスライド

4枚目: 今回のエラーの原因はおそらく開発の最中にAppleのメールアドレスを変更してしまったことか、期限が切れていたことだろうと思います。
このエラーが出てきた場合はただApp IDsを別の文字列に変更しただけではダメだったりします。
App IDsを変更した場合それに対応するProvisioning Profilesも作成しなければいけないので、1からApp IDsを調べて作り直すのをおすすめします。

13枚目: Extensionも1つのアプリとして考える理由はExtensionはアプリとは独立しており、別バイナリでサンドボックスも違うからです。

Extensionについては

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

またApp IDsを作成してからProvisioning Profilesを作成するという順番の理由はProvisioning Profilesを作成する際に対応するApp IDsを選択するので、先に作っておかないと選択することができないからです。

14枚目: もしwatchOS 1でアプリを提出する際はこの例に加えてwatch appのApp IDsとProvisiong ProfilesのDev, Distが必要になります。しかし、今後watchOSのアプリを提出する場合は基本的にwatchOS 2なのでwatch appのことは無視して構わないと思います。

watchOS 1とwatchOS 2のアーキテクチャの違い

https://developer.apple.com/jp/documentation/General/Conceptual/AppleWatch2TransitionGuide/BeforeYouStart/BeforeYouStart.html#//apple_ref/doc/uid/TP40015234-CH2-SW1

17枚目: XC Wildcardについて。これはウノというカードゲームを知っていればわかると思うのですが、黒いカードでワイルドカードとワイルドドロー4というカードがあり、場にどのようなカードがあろうとも出せることができるカードなのですが、それと同じ機能を持ちます。具体的な使い方としてはサンプルなどちょこっとプロジェクトを作って実機で試したいときなどがあると思いますが、その際にいちいちApp IDsやProvisioning Profilesを作るのはめんどうだと思います。その際はこのXC Wildcardを使えば大丈夫です。確か何も設定せずにApp IDsやProvisiong Profilesがないアプリは自動的にXC Wildcardが割り当てられ実行されるはずです。

21枚目: 現在自分はCodeControllerというApple WatchとCustomKeyboardを使用したアプリと、moneyDecisionというアプリの2つをリリースしているためアプリ2つとワイルドカードの構成になっています。

自分の実体験として

僕は普段趣味で個人開発をしています。

    そこで感じたことは
  • アプリの作り方や機能のサンプルコードはネットに落ちているのを拾ってくれば良いのですが、せっかくアプリが完成したのに提出関係で詰まってしまう人が多いと思います(自分がそうだったのでそういう人が多いと思いたいw)
  • 会社でアプリを作成している人は会社で自分よりできる人に質問すれば解決するとは思うのですが、特に個人開発をしている学生や一人でiOSアプリ開発を始めた人ですと、アプリ提出に必要なものがわからない人がいたり、実際にプログラミング意外の設定などは聞けなかったりします。
  • またアプリ提出の手順などは検索をかけると結構出てくるのですが、大まかなに何が必要なのかが書いてある資料は意外と少なかったりします。

なのでこの資料がこれからアプリを提出する人たちに少しでも役立てば幸いです。
加えて間違いやアドバイスなどありましたら是非宜しくお願い致します。

※この資料は2016年4月23日現在のものなので今後変更になる可能性もあります。

Swift ポケットリファレンス Chapter 1

Swift ポケットリファレンスChapter 1 iOSアプリ開発の基本を読んで。

Chapter 1にはiOSの概要や、iOSのレイヤ、アプリ開発に必要な環境、Xcodeの基本的な使い方について書かれていました。

アプリをある程度開発している人にとっては基本的なことが書かれている感じです。
確かにアプリの提出方法や、証明書、Provisioning Profilesなどについては詳しく載っていないですが、リファレンスなので最低限って感じですね。

しかし、iOSのレイヤ構造については復習になりました。

iOSのレイヤ構造は上から

  • Cocoa Touch
  • Media
  • Core Service
  • Core OS

となっていることは知っていたのですが、Core Serviceレイヤにどのようなフレームワークが割り当てられているかなどは知りませんでした。

ここでiOSのレイヤについてもう一度確認しておきたいと思います。

iOS Architectures

f:id:haptaro:20160428203203p:plain

上のようなレイヤ構造になっておりますが、iOSアプリ開発において基本的に触る部分は上の3層のCocoa Touch、Media、Core Serviceの部分になりますね。

以下にAppleの公式ドキュメントを載せておいたのでそちらで詳しくは確認できると思いますが、Chapter 1には実際にこの本で紹介されている機能がどこのレイヤに相当するかが記載されています。

普段フレームワークを利用する際もiOSのどのレイヤなのかなどは意識していなかったのでこれが意外に勉強になりました。

    Cocoa Touchレイヤ
  • UIKit・・・画面構成やタッチ
  • MapKit・・・地図関連機能
  • MessageUI・・・メール/メッセージの送信
    Mediaレイヤ
  • AvFoundation・・・メディアの再生
  • MediaPlayer・・・プレイヤーの利用
  • Core Image・・・画像加工
  • Core Graphics・・・グラフィック関連
    Core Serviceレイヤ
  • Accounts・・・ソーシャルメディアのアカウント管理
  • CoreMotion・・・端末のセンサー等
  • CoreLocation・・・位置情報関連機能
  • Foundation・・・データ管理
  • LocalAuthentication・・・指紋承認

今までアプリでMediaやCore Serviceのレイヤを使ったことはほぼないですが、やはりこの辺の技術を使うとアプリの幅もぐっと広がりそうですね!!
Core GraphicsやCoreMotion、CoreLocationあたりは今後アプリで使ってみたい技術ですね

Apple公式ドキュメント

developer.apple.com

今回はこんなところで。
ざっと見たところChapter 2はSwiftの文法や配列操作メソッドなどが載っていました。
徐々にやっていきます!

Health Swift MeetupでLTしてきた

株式会社FiNCさんで行われたHealth Swift Meetupで人生初のLTをしてきました。 とても緊張しました。
ただ大学のサークルでバンドをやっていてたまに人前で話すことがあるので声の張りなどは大丈夫だったかと。

f:id:haptaro:20160428000540j:plain

FiNCさんのオフィス見学もあったのですが、

  • オフィスが綺麗(移転したばっかだからもあるけど)
  • 健康に気をつかっている
  • デスクやチェアがすごい
  • 体操のお兄さんみたいな方や、栄養士の方も専属でいるらしい

とエンジニアに対する環境がちゃんとしていてすごかった。 エンジニアでなくても健康に気をつかっていることは良いと感じた。

僕なんて先週扁桃炎で高熱で1週間ほど倒れていたので、RxSwift勉強会やメルカリのアッテなどの勉強会もキャンセルしてしまい散々でしたので。

勉強会の最後に体操のお兄さんのような方が出てきてフィットネスで締めるのも今までにはない感じで楽しかったです!

f:id:haptaro:20160428000344j:plain

そして今回の勉強会に岸川さんが来られていまして、3冊の技術本をくださるということで、その本をかけて参加者でじゃんけんをすることになりました。
僕は初回負けだったのですが、欲しかったのでダメ元で見事本を勝ち取った方にお願いしたところ、 「Swift ポケットリファレンス」を譲ってもらいました!!! 本当にありがたいです。

f:id:haptaro:20160428000727j:plain

www.amazon.co.jp

いやーなんでもダメ元で言ってみるものですね笑

しかしここまでして譲り受けたので最大限に活用しようと思います!

GWは健康のために運動とあとはSwiftの勉強をする感じになるのかな...?

発表資料は後日アップする予定ですので少々お待ちを。

p.s.
Amazonのリンク張ったけどアフィリエイトとかいうのあったよなー
まぁやり方わからないからリンクまんまペって貼っただけだけどww
特にそのへんは考えていないが徐々にブログ関係の知識も増やしていこ

ブログ始めてみました!

題名の通り、人生で始めてブログを始めてみました。 今までもブログをやろうとは思っていたのですが、結局できず、やっと始めることができました! きっかけは昨日iOSエンジニアの堤修一さんの記事を見て「まずは1歩」踏み出してみました!

type.jp

正直中学生の頃に流行ったプロフの日記ぐらいは書いたことがありますが、続いた試しがないです。笑

しかし、エンジニアとしてファーストキャリアをスタートするのでその際の自分の技術系のアウトプットなどになれば良いと思っています。

もし記事の中に間違っていることなどありましたらコメントください! アドバイスやおすすめの本とか勉強法とかもいただけたらめっちゃ嬉しいです!

また技術系以外の記事もたまには書こうと思っています。

ブログってこんな感じでいいのかな? まぁよくわかりませんが宜しくお願いします笑