このところ一気に春の暖かさが訪れて花粉症に負けそうな 2018年3月17日(土)東京(神奈川)から講師に熊谷友宏さんをお迎えして、NSEG(Nagano Software Engineer Group)主催で開催された『みんなで Swift 復習会 GO! in 長野 – 7th′ with NSEG』に参加させていただきました。
場所は長野県長野市にある”GEEKLAB.NAGANO”。株式会社日本システム技研さんが入居しているビルの一室、勉強会会場やコワーキングスペースとして開放されているお部屋で開催されました。長野県庁のはす向かい、長野市中心市街地に位置する便利な場所でした。
約10名の参加者のうち、Swiftプログラミングの経験者は私を含めて三人だけ。ということで、もう少し初心者寄りの内容になるかな?と思っていましたが、私が煽ってしまったのが悪いのか? 「参照型(class)と値型(struct)の違い」や「mutable, non-mutable(immutable)の違い」などSwiftの言語仕様の深いところのお話を聞くことができました。
また “Swift API Guideline” の解説もいただいてて、いままで気にもしていなかった関数名や引数ラベルの命名規則も勉強することができました。やはり、やっつけ仕事で「動けばいい」、「コンパイルが通ればいい」とコードを書いていてはいけませんね。 😀
いつものTweetのまとめです。
GEEKLAB.NAGANOなう! これから「みんなで Swift 復習会 GO! in 長野 – 7th′ with NSEG」に参加します! どのビルに入って良いのやら若干迷いましたが無事に到着しました! ? #NSEG pic.twitter.com/ug3OVs6IlF
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
「Swiftでは関数の引数にラベルをつけましょう!」というお話。私は引数ラベルを省略した関数を大量に作っていてSwiftのバージョンアップのときに移行でハマった人です。最初からAppleが言ってくれていれば… ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
メソッドが "Mutating" か "Non-muttating" かを識別するための命名規則があるのですね。 "!" じゃダメなんだ! って、それはRuby… ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
そうか! 値型の構造体(struct)で "Mutating" と "Non-mutating" を意識するのですね。たしかに参照型のクラスインスタンスでは見かけないですものね。 ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
Swiftにプリミティブ型は存在しない。Int型も構造体(struct)で宣言されています。 Rubyと一緒だ! 「大切なことはすべて "Ruby" が教えてくれた」 ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
Swiftの "Memberwize Initializer" は、構造体(struct) / 値型の性質を反映しているのですね。クラス(class) / 値型はメンバーがどういう値を持つか明確ではないから "Memberwize Initializer" は存在しない、という解釈でいいのでしょうね。たぶん… ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
初心者向けの話だったはずがクラスのextensionの話題に広がっている… extensionは新しい(派生)クラスを作るのが「面倒な」ときに、なんとなく使っているだけでした。 ?
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
extension の使い方が腑に落ちたような… Rubyでも組込みクラスの振る舞いも書き換えることができるので同じといえば同じだけれど黒魔術的であまりやらない?と思うのですが、Swiftだとextensionが度々登場してソースコードだけを追いかけていると面食らいます。やはりXcodeのサポートが必須????
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
「人が作ったものを【勝手に】拡張(extension)する」ということを是とするか否とするかは、やはりプログラミング言語の文化なのでしょうね。 ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
参照型(class) と 値型(struct) の性質の混乱?するところの解説中。では、参照型の値渡し(inout) と 値型の参照渡しの組み合わせを試して見ましょう! ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
自分でつくった immutable value を書き換えることはありませんが、「誰かが作った immutable value が書き換えられない!」と頭をかかえることが時たまありますね。それを作った誰かが「そのように設計した!」というのが正解なのですが、そうは言っても… と元々の設計を壊したくなる衝動。 ?
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
setterとgetterが暗黙的に用意されているというのは "C#" で学んだのかな? 「大切なことはすべて "C#" が教えてくれた」 willSet, didSet, computed property とか、新しい言語は次々と便利な記法が取り入れられますね。 ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
"setter" は「明示的に指定しなくても」 "mutating"。 「当たり前」といえば「当たり前」なのでしょうが、普段意識しないですよね。 ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
GUI(ボタンやアイコン)を操作していると、一つの対象を「あっちのスレッド」、「こっちのスレッド」と、あちこちからいじり倒すので参照型が多いのでしょうね。 ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
引数ラベルに前置詞("with" や "into")が使われるというのは Objective-C から引き継がれた文化なのでしょうね。おじさんは中々慣れることができません… ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
「タプル」を扱えるというのは Swift の一つの特徴なのでしょうね。というかモダンなプログラミング言語の特徴なのでしょうね。? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
英語の文書として流れるような関数名が Swift の特徴。だから「だらだら」と長い関数名になるんだ… とITRONの三文字に短縮されたプレフィックスや関数名に慣れていると違和感があります。関数名が長くなると必然的にフォントの大きさが小さくなって老眼では見えなくなるし… ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
型の変換は「変換イニシャライザ」をつかうのがSwiftの流儀。 as や as! を使いまくっていた私は Swift のバージョンアップのときにメタメタにされました。こんちきしょう、Apppleめ! ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
第一引数の引数ラベルが省略されているものは(たいてい)変換イニシャライザー。しらなかった。タイピングが面倒だから横着をして第一引数の引数ラベルを省略していました… ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日
Swiftのジェネリック・プログラミングのおはなし。プロトコルを使いこなせれば簡単になるのでしょうね。たぶん… ? #minna_de_swift
— Takehiko YOSHIDA (@chihayafuru) 2018年3月17日