try! Swift Pre Talks 2019にて初登壇で話した内容を公開します

# 前書き

昨日は[try! Swift Pre Talks 2019](https://tryswifttokyo-aftertalks.connpass.com/event/120987/)というカンファレンスがありました。  
このカンファレンスの概要は明日から始まる[try! Swift Tokyo 2019](https://www.tryswift.co/events/2019/tokyo/jp/)というSwiftのコミュニティでさらには日本のカンファレンスでは一番デカイイベントになりますが、
そのカンファレンスのLTの選考で落ちてしまったCfPを拾い上げるイベントでした。  
このカンファレンスに私初めて登壇してきました。  

今回はそこでお話ししたLTでは話せなかった細かいことも含めて登壇者目線でエントリーを書いてみたいと思います。  
(昨日は一日中緊張で胃が痛かったので本家に拾われなくて幸いでした。)

## 登壇資料と前振りについて

[Swift4.2で追加されたDynamic Member Lookupを使ってみよう](https://speakerdeck.com/tamappe/swift4-dot-2dezhui-jia-saretadynamic-member-lookupwoshi-tutemiyou)

今の現場のエンジニアさんからtry! Swiftは基本英語でのスピーチだからpre talksもきっと英語での登壇だと思うよ  
という素敵なアドバイスを頂いていましたので英語でのプレゼンを予定していました。

今回は登壇資料と共にお話ししようとした下書きを公開したいと思います。  
ええ、今回のプレゼンのために発表内容をプリントアウトして棒読みした人です。  
理由は後書きに書いています。  

## 登壇内容の起こし書

#### 1枚目のスライド

![try_swift_pre_talks_2019.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/44392/c57a5819-abd1-9c84-7291-26cf4f24e86c.jpeg)


Eng: Today I am going to talk about the dynamic member lookup in my session.

日本語: 今回の私のLTはSwift4.2で追加されたDynamic Member Lookup を使ってみよう!というテーマでお話ししていこうと思います。
よろしくお願いします。

#### 2枚目のスライド

![try_swift_pre_talks_2019.002.jpeg](https://qiita-image-store.s3.amazonaws.com/0/44392/9660a386-e25e-cc28-d8c2-e9412779ff28.jpeg)



Eng: Before talking about my talk, let me introduce myself.  
My name is Tamappe, this is Nickname.  Full name is Yosuke Tamaoki.  
I am Freelancer of mobile engineer, and working XXX corporation.  
My hobby is to play Splatoon2.  This is Nintendo Switch Game, and every day I play the game after a work.  
My favorite language is Swift of course.  

That's all my explaination.  I will proceed next step.

日本語: さて、LTの前に簡単に私の自己紹介をしようと思います。  
Twitterアカウント名はTamappeですが、名前はYosuke Tamaokiと言います。  
所属はSummerという会社ですが、フリーランス的な活動をしています。  
今はXXXさんの会社のお手伝いをしています。  
開発担当はiOSとAndroidをメインにしています。  
趣味はスプラトゥーン2で仕事が終わったらだいたい2時間ほどプレイしています。  
好きな言語はもちろんSwiftですが、Objective-C, Java, Kotlinも書いています。  

#### 3枚目のスライド

![try_swift_pre_talks_2019.003.jpeg](https://qiita-image-store.s3.amazonaws.com/0/44392/05699365-ffef-898e-ccab-d5f1ba81d218.jpeg)



Eng: In my session, I will talk about the four points below.
first is Power of dynamicMember.
second is How to implement.
third is explanation using 4 Sample codes.
last is Conclusion.

So I will explain one by one.

日本語: 今回のテーマはdynamicMemberLookupを使おうという事で
dynamicMemberLookupの機能から使い方まで紹介して行こうと思います。

目次はこのように
1. 機能について
2. 実装の仕方
3. 4つのサンプルコードを書いてみました
4. 最後の結論になりますがスライドはありません。

では始めていきたいと思います。

#### 4枚目のスライド

![try_swift_pre_talks_2019.004.jpeg](https://qiita-image-store.s3.amazonaws.com/0/44392/2fde5a1a-f8bb-2f4c-02a0-a4dc0990ce65.jpeg)



Eng: First one is Power of dynamicMember.
For example, suppose there is a variable named classroom here.

Before using @dynamicMmeber,
You can access keys of classroom by writing them in brackets, but you can not access them using dot syntax.

But after using it,
You can access these keys using brackets, and dot syntax.
This is the power of it.

日本語: まずはdynamicMemberの機能について紹介します。

と言ってもこのスライドに書いたことがすべてなのですが、
例えばこのようなDictionary型のインスタンスがあったとします。
Dictionaryのkeyへのアクセスは中括弧で書くことで通常アクセスでき、ドット構文ではアクセスできませんね。  

それがドット構文でアクセスできるようにすることがDynamicMemberLookupの大きな機能になります。
それ自体は大した機能はないかなと思っていたのですが、去年のiOSDC2018でkoher さんの発表でDynamicMemberLookupは将来pythonなどの多言語との連携ができるようにするための機能だと発表されていて改めてこの機能のインパクトを感じました。

それを考えると今のうちからこれに慣れて置くことは得策だろうなと考えました。

#### 5枚目のスライド

![try_swift_pre_talks_2019.005.jpeg](https://qiita-image-store.s3.amazonaws.com/0/44392/a1f44e3a-aaea-c379-3e44-290cb2105533.jpeg)



Eng: the next is how to implement.
There are 3 steps to implement the dynamicMembeLookup.
In order to implement it,

First is to add the anotation before the class or struct.
Second is to add the function of subscript.
lastly, is to add the label: dynamicMember to the argument of subscript.

if we implement all of 3 steps, we can use the power of it.
It is easy, isn't it?

日本語: 次に実装の仕方ですが、

1. アノテーションである@dynamicMmeberLookupをclassやstructなどの前に宣言します。
2. そして、subscriptを実装します。
3. 最後に定義したsubscriptに"dynamicMember"のラベルを追加します。

これだけでこの機能が使えます。

#### 6枚目のスライド

![try_swift_pre_talks_2019.006.jpeg](https://qiita-image-store.s3.amazonaws.com/0/44392/6f0cf807-7361-aa90-c90c-3ee4578930fd.jpeg)



Eng: next, I prepared four of sample code for this Lightning talk.
From now on I will explain one by one.

日本語: では、これを元にして4つのサンプルコードを書いてみましたので紹介していきたいと思います。
class, struct, protocol, enumでそれぞれ試しに実装しています。
ですが、protocolとenumは時間がないと思いますので省略すると思います。

では、一つ目から始めます。
classで適用させています。

#### 7 / 8枚目のスライド

![try_swift_pre_talks_2019.007.jpeg](https://qiita-image-store.s3.amazonaws.com/0/44392/f8fbaef6-41fc-fa4e-1d56-2690d77d0bba.jpeg)

![try_swift_pre_talks_2019.008.jpeg](https://qiita-image-store.s3.amazonaws.com/0/44392/f7f94338-528f-31cb-82a9-958ba51607ce.jpeg)



Eng: The slide is User class.
The User class has three properties and initializer, and subscript definition.
There are firstName, lastName of String type, and age of Integer type in properties.

And I also write the subscript definition.
There is a switch - case statement such as upperFirstName, upperLastName, adalt, children cases.

and move to the next slide,

日本語: スライドにあるのはUserクラスです。
Userクラスには3つのプロパティとイニシャライザ、そしてsubscriptの定義が入っています。
プロパティはfirstName, lastName, そしてageがあります。

それに対してsubscriptの定義を書きました。
書き方はswitch構文を使ってupperFirstName, upperLastName, adalt, children,と言ったcase文があります。

このように実装することで次のスライドに移りますが、

#### 9枚目のスライド

![uploading-0]()




Eng: I create an instance named hanakoYamada.
Of course, hanakoYamada can access each of the firstName, lastName, age.  
And hanakoYamada also can access upperFirstName, upperLastName, adalt, children written in the switch - case statement.
As you can see, we can access each of key like we accesss properties.  
Each output is in the comments.

日本語: 例えば、hanakoYamadaと言った名前のインスタンスを作成します。

前回のスライドでsubscriptを定義したことでこのhanakoYamadaからfirstNameやlastName, ageだけでなくswitch-case文で書いたupperFirstName, upperLastName, adalt, children にもプロパティと同じような書き方でそれぞれにアクセスできるようになりました。
それぞれの出力はコメントに書いてある通りになっています。

実際はstoryboardで挙動を確認しながら書きましたので間違いありません。

#### 10 / 11枚目のスライド

![try_swift_pre_talks_2019.010.jpeg](https://qiita-image-store.s3.amazonaws.com/0/44392/c4d948c5-cede-a19c-cab6-596c916862bf.jpeg)

![try_swift_pre_talks_2019.011.jpeg](https://qiita-image-store.s3.amazonaws.com/0/44392/7079b179-946e-2d1e-a619-bf166bf5373f.jpeg)


Eng: Next is structure case.
I wrote a Person structure with no propeties here.
In Person structure, I defined a subscript definition.
And also I have defined a String type "name" as an argument of subscript.
I set the return value to string.


日本語: では次にstructで書いてみます。
ここにプロパティが何もないPersonの構造体を書きました。
このPersonにsubscriptを定義してみます。
subscriptの引数にString型のnameを定義しています。
返り値をStringに設定しています。

#### 12枚目のスライド

![try_swift_pre_talks_2019.012.jpeg](https://qiita-image-store.s3.amazonaws.com/0/44392/0cb85ae6-b20e-9a8c-5e2a-cba61b815c80.jpeg)


Eng: Now I create an instance of Person.
and also write person.swift using dot syntax.
Then compile will output "Hello, swift".
I don't define property in struct, but I an access the key by dynamicMember's power.
Also I can access hanako and taro using dot syntax.
You will be able to do like this.

this is the power of it, too.


日本語: これでPersonのインスタンスを生成してみましょう。

仮にpersonというインスタンスを生成してみます。
このpersonでドットシンタックスで試しにswiftと書いてみましょう。
するとコンパイルでは「Hello, swift」と出力されます。
これはstructで何もプロパティを定義していませんがdynamicMemberLookupの機能でアクセスできるようになったわけです。
同じようにstructで定義していないhanakoやtaroにアクセスしようとするとアクセスできてしまいます。
こう言ったことができるようになるのです。


#### 名目上最後のスライド

![try_swift_pre_talks_2019.013.jpeg](https://qiita-image-store.s3.amazonaws.com/0/44392/6da0df85-a6d6-00f0-aa88-23cd35d5cb05.jpeg)


Eng: That's all my explaination.
Thank you for listening very much.


日本語: 今回説明したかったのはこのdynamicMemberLookupはclassやstructだけでなくenumやprotocolにも使えるということです。
私は今回のプレゼン資料を作るまではこれはclassやstructにしか使えないと勝手に思っていましたがenumやprotocolにも使えることが分かって非常に驚きました。

こんな感じでpythonやrubyなどの多言語連携の機能だけでなくてもこれが使える場所が多いと思いますので
ぜひ皆さんも今回のセッションで使い方を学んで実戦で使ってもらえればなと思いました。

以上でLTを終わりたいと思います。
ご静聴ありがとうございました。


## あとがき

この時点で文字数が6000字ですし、前日にプレゼンの練習で時間を測定しても6分や7分ほど時間がかかってしまって5分を切ることができませんでした。
そのためそれ以降のenumやprotocolの資料の説明ができないと悟り話す要点だけをまとめて紙にプリントアウトしました。 
Pre Talks 2019を主催して頂きましたスタッフの皆さま方、このような大変なイベントを開催して頂き、  
また誘って頂きありがとうございました。
緊張はしましたが非常に楽しみました。

## 終わりに

本家の try! Swift Tokyo 2019 カンファレンス自体は明日から 3日間`連続`で開催されます。
今年も英語の聞き取りとSwiftのレベル感で苦労することが分かりきっていますがとりあえず本家の方も楽しみたいと思います。
スタッフの皆さま、3日間は大変だと思いますが頑張って頂ければと思います。

## 参考

英語でのLTだと思っていましたので伊藤さんのこのブログを参考にしました。

[RubyConf 2018で初英語LTしてきました 〜登壇の準備から当日話した英文まで全部公開します！〜](https://blog.jnito.com/entry/2018/12/17/054044)