Guild icon
swift-developers-japan
コミュニティ / swift-zoomin
Avatar
今週の土曜日( 10 月 20 日)の 21 時から、本チャネル #swift-zoomin で Swift Tweets 2018 Fall https://swift-tweets.connpass.com/event/94689/ を開催します。これまで Swift Tweets は Twitter 上で開催されていましたが、 Twitter の制約や、元々想定していた双方向コミュニケーションが思ったようにうまく機能していなかったため、今回は試験的に Discord 上で開催してみることになりました。よろしくお願いします!
# 概要 Swift Tweets はこれまで Twitter 上で開催されていましたが、 Twitter の制約や、元々想定していた双方向コミュニケーションが思ったようにうまく機能していなかったため、今回は Discord の swift-developers- ...
😀 9
swift 7
12:47 AM
内容についても、これまでの発表形式ではなく、より双方向性の高い Interactive Round Table ( iOSDC Japan 2018 で行われていた催し https://blog.iosdc.jp/entry/2018/07/24/100415 )のような形を考えています。
こんばんは。 iOSDC Japan 2018 実行委員長の長谷川です。 先日、iOSDC Japan 2018 のタイムテーブルを公開しました。 その中に「IRT」という時間がありますが、今日はそのIRTのご紹介です。 IRT: Interactive Round Table IR...
Avatar
30 分後、 21 時から Swift Tweets を始めます。
👀 7
👌 4
😀 2
Avatar
あと1分ー
👍 7
Avatar
参加者のみなさん、今からSwift Tweetsを始めます。よろしくおねがいします!
🎉 14
👏 8
12:00 PM
本日、総合司会を担当します @koogawa です。どうぞよろしくお願い致します。
swift 1
Avatar
よろしくおねがいしますー!
Avatar
まず最初に、今回TwitterではなくDiscordでの開催になった経緯を主催者の @koher さんからお話していただきます
12:01 PM
@koher さん、よろしくおねがいします!
Avatar
よろしくおねがいします!
12:01 PM
前回、前々回と発表中に Twitter の制約に引っかかり
😩 5
12:01 PM
発表途中にアカウントを凍結されてしまうというトラブルがありました。
12:02 PM
また、 Twitter の規制は厳しくなっている傾向がありました。
12:02 PM
Organizer の @koogawa さんと @takasek さんと話し合ったのですが、
12:03 PM
Twitter では結構一方公的な発表になってしまっていて
Avatar
当初見込んでいた、みんなで Swift についてわいわい話そうということもなかなか実現できてなかったので
12:03 PM
思い切って今回は Discord でやってみてはどうかという結論に至りました。
12:04 PM
新しい試みでどうなるかわからないのでドキドキですが、ワクワクもしてます!
12:04 PM
みなさん、よろしくおねがいします!
👍 5
🙆 3
🎉 3
12:04 PM
Twitter のときよりも発言しづらいかもしれませんが、
Avatar
ワクワク
😊 2
Avatar
↑に書かれてる通り絵文字リアクションも有効活用してみて下さい。
😊 1
Avatar
発言しづらいかもけど絵文字リアクション投げやすいので良さそう
😊 5
Avatar
図だ
Avatar
DIscord 慣れてない人もいるかもしれませんが
swift 2
🐥 1
12:05 PM
↑の図の赤丸のところから新しい絵文字リアクションを、
12:06 PM
緑丸のところから既存のリアクションに自分も乗っかることができます。
🐥 1
12:06 PM
ちなみに、今参加してるよって方はどれくらいいますか?この発言に絵文字リアクションつけてみて下さい。
😃 4
👌 4
🐥 2
🍓 2
🙌 2
🙋 6
🐶 2
🤗 3
🐕 2
🎯 2
rust 2
💯 1
swift 2
swift 17
Avatar
いろとりどりー
🐥 1
Avatar
ということで、今日はよろしくおねがいします!僕からは以上です。
😊 1
👏 5
Avatar
koherさん、ありがとうございます!
12:08 PM
では、今回の流れをざっくり説明します
12:08 PM
今回のSwift Tweetsでは、特定のテーマについてディスカッションを行います テーマは「オブジェクト指向」「値型」の2つで、各テーマについて30分で議論をします
12:09 PM
各テーマには「テーマ司会者」がいます。テーマ司会者はディスカッションをリードします。  ・テーマ1:オブジェクト指向 @takasek さん  ・テーマ2:値型 @koher さん
12:09 PM
ディスカッション参加者は聞いているだけでも良いですし、可能であれば質問したり、回答したり、議論に参加します。
🙋 1
Avatar
今のオンライン人数80くらい👀
😆 5
8⃣ 2
0⃣ 2
👀 1
Avatar
Yeah!
12:09 PM
2つのテーマについて、ディスカッションが終わったあとは、ボイスチャットでのディスカッションも予定しております。それまでに挙がったトピックについてより深く議論できればと思います(進行状況によってはやらない場合もあります)
12:10 PM
本会の終了時刻は23:00です。
12:11 PM
それでは、最初のテーマ「オブジェクト指向」に移りたいと思います。テーマ司会の @takasek さん、よろしくおねがいします
Avatar
どうもtakasekです
👏 16
😄 1
12:11 PM
今日は「オブジェクト指向」について、みんなで話してみたいなあと思いました
12:12 PM
(あっ、原稿どこだ)
12:12 PM
(あわわ)
😂 3
😮 3
😇 1
Avatar
Avatar
お見苦しいところお見せしました
👌 2
12:13 PM
takasekです。最近PEAKSで「iOS設計パターン入門」を書いてます
12:13 PM
アーキテクチャ設計のすべてを濃縮! すべてのiOSアプリ開発者が待ち望んでいた、アプリケーション・アーキテクチャ解説本の執筆プロジェクト! 近年ますます大規模&複雑化しているiOSアプリ開発に...
😀 4
👀 4
🆒 3
12:13 PM
この本、けっこうがんばって書いてまして、設計の歴史とか超調べてるんですよ
12:13 PM
アーキテクチャの歴史とか、1980年あたりからがっつりあたってます
12:14 PM
今、自分の章では「設計するということ」「設計にパターンを適用する前に」という章が公開されている
12:14 PM
Clean Architecture, Fluxの章も公開されています
12:14 PM
というわけで、今購入すると、いちはやくそこらへんが読めます!
12:14 PM
と宣伝はおいといてですね
12:14 PM
なのでオブジェクト指向についても調べてみてまして、まあ本には別にその話はあんま出てこないんですけど
12:14 PM
そんな折に、最近Qiitaとかでも「オブジェクト指向」の話題が盛り上がって、
12:14 PM
みんな、この話題好きだなーと
Avatar
盛り上がってますねー
Avatar
というわけで、こういう双方向の話題にはピッタリなんじゃないかと
12:15 PM
そう思ってテーマを選びました
👍 1
Avatar
そうそうそう
Avatar
あれ?これは古い記事だった。
Avatar
よい記事ですねー
12:16 PM
(ネタバレされた!)
😅 1
😂 3
Avatar
タイムラインに流れてきたので最近書かれたのかと思ってました。
Avatar
まず最初のトピックなんですが 「オブジェクト指向」って何? という話をしたいなと
12:16 PM
オチを言ってしまえば、今の記事の話になっちゃうんですがw
12:17 PM
いくつかみなさんに質問します まずは、このリンクを見ないで答えてみて下さい
🙈 3
12:17 PM
Q1. Swift好きな人ー 🙋🙅
😋 5
🙋 24
swift 3
Avatar
すみません😂
Avatar
Q2. Objective-C好きな人ー 🙋🙅
😄 1
😅 7
🤔 2
🙋 11
🙅 5
12:17 PM
Q. どっちのほうがオブジェクト指向的だと思う? 1⃣Objective-C 2⃣Swift (edited)
1⃣ 19
2⃣ 6
🤔 11
3⃣ 1
Avatar
2が二つある、
Avatar
直ったw
Avatar
おー、Obj-Cの票が多い!
Avatar
3w
Avatar
3とは
Avatar
3とは
Avatar
Kishikawa Katsumi 10/20/2018 12:19 PM
私は両方に入れました
Avatar
選択肢が増えてるw
Avatar
同じく両方にいれました 🙂
Avatar
3 は @d_date さんだ。意見を聞いてみたい🙂
Avatar
あ、聞いてみたい
Avatar
3は両方ですw
😮 3
💡 1
Avatar
そういう解釈ww
Avatar
なるほどw
Avatar
Kishikawa Katsumi 10/20/2018 12:20 PM
1+2=
3⃣ 5
Avatar
@swift-4.2.4 print(1+2)
Avatar
takasek、この手の質問答えは1でも2でもないとか言いだしがちなのでひねくれてみました
Avatar
3
3⃣ 2
Avatar
鋭い
12:21 PM
そう 実はオブジェクト指向って、ひとつのものを指すものではないんですよね
😳 2
12:21 PM
ひとつはObj-C的なオブジェクト指向 もうひとつはSwift的なオブジェクト指向
😮 1
👀 1
12:22 PM
前者は、アランケイが目指した、いわば「メッセージング」を中心とした概念です
12:22 PM
そして後者は、ストラウストラップという人が道筋をつけた、抽象データ型をベースにしたオブジェクト指向
12:22 PM
てことで、世界にはいろんな開発コミュニティはあるけど、オブジェクト指向って何か?を理解するにあたっては、Swift界隈のみなさんが一番真実に近い立場にいると思ってるんです
😲 2
😮 1
12:23 PM
…実はこれ、音声でやろうかと思ってまして
12:23 PM
今テキストでぱちぱち打つのが結構遅くてテンポ悪い感があります
12:24 PM
なので、さっきのリンクを解禁します!
12:24 PM
忙しい人のためのまとめ一般に「オブジェクト指向プログラミング」と呼ばれる考え方には発案者が異なる二..
12:25 PM
アランケイのオブジェクト指向は、 「すべてのものはオブジェクト」と捉えて、それぞれがメッセージを送り合うという世界観です
12:25 PM
なので、それぞれのオブジェクトが何をやっているかはそれぞれは知らない
12:26 PM
逆に、抽象データ型のほうは、可能な限り静的に「できることだけをできるようにする」ものでした
Avatar
Obj-C が「メッセージング」の方のオブジェクト指向だというのは良く聞くんですが、「抽象データ型」の方の代表格の Java ととても近いような気がするんですが、違いは動的に解決されてる部分ですか?
Avatar
というと、Obj-CとSwiftの、それぞれの雰囲気でなんとなく分かるかと思います
12:27 PM
Javaは歴史的には「抽象データ型」の代表格としては微妙らしいですねー
😲 2
Avatar
runtimeapiによるメッセージングと、vtableの差みたいなとこ
Avatar
メイヤーは「オブジェクト指向入門」という本の中で、Javaは中途半端に色々取り込んだけれど実現できていないものが多い、と批判しています
12:28 PM
初期のJavaにはGenericsもありませんでした
12:29 PM
さて、この話のオチをどこにもっていきたかったかなんですが
12:29 PM
@dynamicMemberLookupの話に繋げたかったのです
😮 2
12:29 PM
全地球100億人のSwifterな皆さん、コンバトラーっ! tobi462 でーっす! え、いつもとノリが違う?まぁ、そういう日もあるんじゃないでしょうか。 そんなわけで、前回・前々回と続き Swift 4.2 の記事です。 今...
🐧 4
12:30 PM
Swift4.2で、@dynamicMemberLookupという機能が導入されました
12:30 PM
@swift-4.2.4 @dynamicMemberLookup struct Employee { subscript(dynamicMember member: String) -> String { let properties = ["name": "Taylor Swift", "city": "Nashville"] return properties[member, default: ""] } subscript(dynamicMember member: String) -> Int { let properties = ["age": 26, "height": 178] return properties[member, default: 0] } } let e = Employee() let name: String = e.name // "Taylor Swift" let city: String = e.city // "Nashville" let age: Int = e.age // 26 let height: Int = e.height // 178 let city_wrongType: Int = e.city // 0 let height_wrongType: String = e.height // ""
Avatar
no output
Avatar
(printしなきゃ意味がなかった…!)
😂 3
😅 2
Avatar
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
この機能は、抽象データ型側のオブジェクト指向にゴリゴリに寄っていたSwiftに、
Avatar
dynamicMemberLookup気持ち悪い
Avatar
メッセージ指向的な考えをもたらすものでもあるのかなあと
Avatar
たしかに。
Avatar
そんなことを思って見たのですが、みなさんどう思いますか、というかんじの
12:32 PM
そういうお話でした。
12:32 PM
おわり。
Avatar
その機能、interopのためにいれた機能という認識なんですが、そういうメッソージ指向的な意向もあったんでしょうか
Avatar
@takasek はDMLを外部言語バインディング以外にも使うことを想定しているんですか?
12:33 PM
こいつを使えばたしかにUIKitのtarget-actionパターンみたいなものも実装できそう。
Avatar
基本的には、同じ型表現ができるなら静的型付けのほうが利点があると思います アランケイも、静的型付けを否定してはいなかったはず
Avatar
@dynamicMemberLookup 自体はメッセージ指向のために入れたわけじゃないけど、そういう捉え方をしてみるとおもしろそうってことでしょうか?
Avatar
そういう捉え方をしてみるとおもしろそうってことでしょうか?
はい、そうです
Avatar
逆に、動的型付けのオブジェクト指向言語はメッセージ指向と言えるんでしょうか?
Avatar
気持ち悪かったのでアホな記事かいたのだ https://qiita.com/masakihori/items/c2686e25bfc448400e0e
Swift 4.2 で Dynamic member look up というものが導入されました。 これを使うことで Key が String の Dictionary で下のコードのようにプロパティを使うように要素にアクセスでき...
👍 3
Avatar
@masakihori JSON をプロパティでアクセスする例が Proposal に書かれてますね。
👍 1
Avatar
Javaは歴史的には「抽象データ型」の代表格としては微妙らしい
Avatar
動的型づけだと主語がでかすぎる気はしますが、そういう主張をしてる言語はある気がしますね
12:36 PM
Rubyとか
Avatar
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
というのはJavaがObjective-Cの影響が強いからかな。
Avatar
アラン・ケイは「Ruby は Smalltalk-76 に似ている」と言っていたそうです
12:37 PM
おお、 @rizumita さんがいた
Avatar
皆さんもこれを使ってtypoに苦しんでください。
Avatar
rizumitaさんは、まさにJavaとオブジェクト指向の話をQiitaで挙げられていました https://qiita.com/guitar_char/items/8f526416a7649cd2c2be#comment-267bffec225fa1d1b68f
オブジェクト指向を勉強していたところに、なんかブームがきているっぽいので便乗します。 基本的にこちらのwikiの背景部分を、自分なりにざっくり編集して、時々コメントを追加しています。 https://ja....
Avatar
なんか、 Erlang くらいまでいかないと、実際使ってる上では Ruby でも Python でも Java でも Obj-C でも大した違いは感じないような気がするんですけどどうでしょう?
Avatar
nominalなsubtypeかどうかはだいぶ違うなって感覚があります
Avatar
返り値の同期的な待機をやめると、一気にメッセージング感が出ますね
😃 3
🙂 1
Avatar
https://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang
Armstrong博士は、... Erlangは「唯一のオブジェクト指向言語かもしれない」と考えているようだ。
とありますね
QCon London 2010のインタビューで、Erlangの最初の開発者であるJoe Armstrong博士とSmalltalk、OOP、パターンに長い間関係しているRalph Johnson博士に、オブジェクト指向に関して、私たちは長年「間違った道」を下って...
Avatar
nominalなsubtypeかどうかはだいぶ違うなって感覚があります
確かに、ダックタイピングかどうかは結構大きな違いですね。
Avatar
同期的・非同期的の話になると、今度はオブジェクト指向とアクターモデルの話になってきそう(詳しくないですが) 当初のメッセージ指向の実装としてのSmalltalkは、同期的だったと聞きます
Avatar
非同期をいれるとプロセス代数とかの並列処理をあつかう体系に近づく気がしますね
Avatar
多分僕が動的型付け言語を使ってるときでも静的型付け言語的な考え方をしてるから違いを感じづらいのだと思います。でも、 Obj-C だからメッセージ指向ともあまり感じないような・・・。黒魔術を使うときくらい?
12:42 PM
Swift Concurrency Manifesto. GitHub Gist: instantly share code, notes, and snippets.
Avatar
lldbでデバックするときは型がわかんなくてもメッセージおくればなんとかなるって性質つかいますね
Avatar
非同期というとNSConnectionとかが出てきそう。deprecatedだけど。
Avatar
macOSのobjcにはdistributed objectってあって,普段のobjcと同じ構文のまま,相手先のオブジェクトは別プロセスにいるとかネットワーク越しにいるとか,そういうのできたので,だいぶメッセージ送信ぽさあった気はします
Avatar
なるほどです。
Avatar
最近、セキュリティの関係でプロセスを分割してく文化ありますけど、それがオブジェクト指向っぽいかというと、どうなんでしょ
12:44 PM
ボクの感覚的には別って感想です
Avatar
そもそも書いてる側でメッセージ指向っぽいなあって思うプログラムってどんなものなんでしょう?
🤔 3
Avatar
オブジェクト指向といえばGUI Toolkitというイメージ
Avatar
@IBOutlet@IBAction をつなげてるときは
Avatar
とりあえずFirstResponderに投げとけ
Avatar
そういう気分になりますね
12:46 PM
コード側の変更にXIBが追従してなくてメソッド名がなくなってたりすると
😂 1
12:46 PM
実行時に落ちるし。
Avatar
あと伝統的にはシミュレータなんですけど、あんま経験はないですね
Avatar
型を無視した呼び出しができちゃう点ですかね。メッセージ指向っぽさ。
Avatar
それだと動的型付けと何が違うんでしょう?
Avatar
セレクターオブジェクトが実行時に存在してるってところもかなあ。
12:48 PM
静的リンクされたメソッド呼び出しにおいてはメソッドはただの番号でしかないから
Avatar
動的型付けとメッセージパッシングは直行した概念なんじゃないんですかね
Avatar
いや、まさに動的型付け的な点がメッセージ指向っぽいのかなと思ったわけですけど。
Avatar
@koher 個人的には、classやprototypeが実行時に書き換えられる、rubyやJavaScriptは、 そういう意味でメッセージング指向的だと思います
😀 1
12:50 PM
シェルスクリプトとかは静的に型はつかないけど、オブジェクト指向っぽくはないですし
😮 1
Avatar
動的束縛と動的型付けは区別する必要があって、
Avatar
なるほど。
Avatar
動的束縛は必要だけど、動的型付けは必要ではないはず
Avatar
動的束縛の束縛ってどういう概念ですか?
Avatar
(定義引っ張り出してきてます、ちょっとお待ちを)
Avatar
メソッドディスパッチの事か。
Avatar
じゃあvtableみたいなのがあれば動的束縛ってことです?
Avatar
vtableは動的束縛の一つ ってことで、そうなりそうですね
Avatar
なるほどー
Avatar
vtableは動的束縛の一つ ってことで、そうなりそうですね
JavaScript とかは vtable がない例かな。
Avatar
出た、prototype chain
Avatar
@takasek さんの「動的束縛は必要だけど」は、何を満たすのに必要っていう意味ですか?
Avatar
Swift の witness table は動的束縛?
Avatar
の一種だと思いました > witness table
🙂 1
Avatar
witness tableは動的束縛っぽいですね。
Avatar
そういう実装の話につっこむと、SwiftとかのLint time optimizationとかが進んでコンパイル時には静的に解決されてる、とかになるとどうなるんですかね
Avatar
witness table ってインスタンスに紐付いてないからオブジェクト指向っぽくなくないですか?
Avatar
ん、あれ、すみません、メッセージング指向の話ではなかったかも<動的束縛が必要
Avatar
existential container からは参照されてるけど。
Avatar
Kishikawa Katsumi 10/20/2018 12:57 PM
動的束縛はオブジェクト指向に必要ってことを言いたかったのでは?
Avatar
オブジェクト指向入門によると、動的束縛の実現手段として多相とサブタイプによる再定義があって、…という話の流れでした (edited)
Avatar
インスタンスに紐付いてないけど、 元の型に紐付いたテーブルが、アップキャストされる抽象的な型とペアにされるという意味で、 vtableと同じ感じがする (edited)
Avatar
で、この本を書いたメイヤーが論じているのは抽象データ型の話なので
Avatar
@koher 言語の内部実装は、言語がオブジェクト指向っぽいかどうかにはあんまり関係ないんじゃないですかね。
Avatar
@hironytic それはそうなんですが、さっきの
セレクターオブジェクトが実行時に存在してるってところもかなあ。
>静的リンクされたメソッド呼び出しにおいてはメソッドはただの番号でしかないから みたいな話もあったので。
1:00 PM
元記事に書かれてたように論文読まないとふわふわした議論になりそう? 同じ理由で、オブジェクト指向という概念を特定の言語の(俗に「オブジェクト指向」向けと称される)機能から外挿して学ぶのは難しいし、間違った「オブジェクト指向」を創造してしまう危険がある。少し遠回りに思えても、それぞれの考案者自らがその主張を綴った論文を読んで理解を試みるほうがいい。
1:01 PM
ちなみに、論文読んだことのある人いますか? 🙋 読んだ 🙅 読んでない
🙅 18
Avatar
だれもいない..
😮 1
😅 1
😂 1
Avatar
(メイヤー本しか読んでおりません…メッセージ指向は雰囲気でしかわからない) (edited)
Avatar
ぼくは、言語上では、プロトコルで抽象化されたメソッドを呼ぶと、実行時のオブジェクト型に応じて振る舞いが変わるから、オブジェクト指向っぽいと思ったわけです。
Avatar
いまから急いで読むしか
Avatar
みなさま!
🙂 1
🙋 1
1:03 PM
盛り上がってきたところ大変申し訳ないのですが、
1:03 PM
いったんこの辺りでテーマ1を終了させていただきたいと思います 🙇
🙂 2
👌 6
1:04 PM
話足りない点もあると思いますので、続きはぜひ、テーマ2のあとに予定しておりますボイスチャットにてお願い致します!
1:04 PM
ここで5分のインターバルを取りたいと思います。22:10 から次のテーマに移ります。
Avatar
お付き合いいただき感謝します。オブジェクト指向の話でわいわいできて楽しかったです、ありがとうございました!
👏 17
😀 2
Avatar
takasek さん、ありがとうございました!
Avatar
テーマ2も盛り上がって終了時間になると予想 🤔
Avatar
うーむ、たしかに 🤔
Avatar
盛り上がったらボイスチャットは次回のお楽しみでもいいかも?
🙂 1
👌 1
Avatar
ですね!
Avatar
休み時間中にアンケートです。 1⃣ Discord の方が Twitter より良さそう 2⃣ やっぱりいつもの Twitter の形の方がいい
🤔 2
1:08 PM
次回開催の参考までに。
1⃣ 13
2⃣ 1
3⃣ 9
1:10 PM
3⃣ 出たw
Avatar
Twitter の形式も割と好きだったので選ぶのが難しい! 😂
1:11 PM
なので3
🙂 2
Avatar
絵文字リアクションはツイッターよりも反応人数が多くて良いですね
👌 6
Avatar
リアクションのしやすさとか、わいわい感とかがあってDiscordすごくいいんですけど、Twitter形式は整ってる感じがあって…
Avatar
Discord 、人がいる感じはありますね。
Avatar
さて!!
1:12 PM
では、2つ目のテーマ「値型」に移りたいと思います。
👍 2
Avatar
わーわー 🎉 (edited)
Avatar
テーマ司会の @koher さん、よろしくおねがいします!
Avatar
はい、始めます!よろしくおねがいします。
👏 16
1:14 PM
あまり僕から話すことは用意してなくて、自由に話し合いたいんですけど、
1:14 PM
最初に若干だけ僕が考えていることを話すと
1:14 PM
すごく単純化して考えると、 Swift の値型はミュータブルクラスと
1:14 PM
イミュータブルクラスのいいとこどりをしたような存在だなと考えてます。
1:15 PM
参照型と値型はインスタンスが共有されるかどうかという違いがあるわけですが
1:15 PM
それ自体はどっちが優れているというわけではないんですが、
1:15 PM
ミュータブルクラスだと振る舞いが型で表現できないケースがあるのが微妙に思ってます。
1:16 PM
class Group { ... } class User { ... } let group: Group = ... let owner: User = group.owner owner.age += 1 // 何が起こる?
1:16 PM
Group が内部に保持してるインスタンスをそのまま返してたら Groupownerage もインクリメントされますけど
🎂 3
1:17 PM
もし防御的コピーをしてたりすると owner.age += 1group に影響を与えません。 (edited)
Avatar
🎂
😂 2
Avatar
だれか誕生日?
Avatar
誕生日ですからね
Avatar
センス高
Avatar
そういうことかw
1:18 PM
値型だとインスタンス共有が存在しないので、振る舞いが定まります。
1:18 PM
これをドキュメントやコーディング規約(たとえば必ず防御的コピーをする)とかで管理しようとしても
1:18 PM
巨大なコードベースでは次第にそれが破られてきて、そのうち何が起こるか確信できないコードの塊が生まれるんじゃないかと思います。
1:19 PM
イミュータブルクラスだとそういう問題はないですが、
1:19 PM
状態の更新が大変です。
1:19 PM
class User { let name: String let age: Int ... } var user = User(name: "Swift", age: 4) user = user(name: user.name, age: user.age + 1) (edited)
1:19 PM
インスタンスを作り変えないといけないです。
1:20 PM
ミュータブルクラスなら楽なのに。 // ミュータブルクラス class User { var name: String var age: Int ... } let user = User(name: "Swift", age: 4) user.age += 1 // 楽 (edited)
1:21 PM
これを struct でやると // struct struct User { var name: String var age: Int } var user = User(name: "Swift", age: 4) user.age += 1 // 楽 (edited)
1:21 PM
楽だけどインスタンス共有もされなくて挙動が定まってうれしい
❤ 7
1:22 PM
と両者のいいとこどりをできます(単純化すれば)。
1:22 PM
で、とは言っても普通の言語だとコレクションが参照型なので
1:22 PM
値型でできることの範囲が結構狭いんですが、
1:23 PM
Swift だとコレクションも値型なので、やろうと思えば全部値型で書くこともできなくはないです。
1:23 PM
標準ライブラリもほとんど値型しかないですし。
1:23 PM
というわけで、値型って Swift にとってとても重要だと思うんですけど、
1:23 PM
実際にはいろいろ限界があって難しいこともあり、
1:24 PM
みなさん実際使っててどうですか?ということを話し合ってみたいです。
1:24 PM
こういうのは値型は難しいよね、とか、ここが値型でおもしろいよね、とか何かありますか?
Avatar
値型にした箇所に関しては共有仕様の悩みが無いから書くときも使うときも楽でいいですね
Avatar
インスタンスをコピーしつつ、一部フィールドを更新する文法自体は、他言語にもわりとあるんですけど
Avatar
@mzp Kotlin とか JS とかそうですよね。
Avatar
ネストしてるフィールドを一発で更新できるのはなくて、Swiftすごいなーって思ってる機能ですね
1:26 PM
ない->ボクは知らない
Avatar
それ僕もおもしろいと思ってるとこで、ネストした先の mutating func とかおもしろいですよね。
Avatar
参照型だとコピーコストがGCコストにもなっちゃうんで、防御的コピーだらけにするのも神経を使う
Avatar
↓とか。 foo.bar.baz.isEnabled.toggle() (edited)
❤ 4
Avatar
そのへん、値型だと気楽で良い Arrayの場合もCOWが効くから気楽
Avatar
mutating funcinout が使いやすさのキーになってる気がしてて
Avatar
参照型でプログラマが意識的に気遣っていた部分をSwiftの値型が意識しなくて済むようにしてくれた気がします。
Avatar
C# とかも struct あるけど、途中で computed property が挟まったりしたら更新できないんですよね。
😀 1
Avatar
C#の値型はプリミティブなもの以外ほとんど使いませんね。
Avatar
似たようなのでは、 Obj-C でできなかった view.frame.origin.x += 10; とか。 (edited)
1:30 PM
これ辛かった・・・。
😱 5
❓ 1
😣 3
Avatar
え、それダメなんですか
😂 1
Avatar
一度はやってしまうやつだ。。。
Avatar
でたーw
Avatar
Kishikawa Katsumi 10/20/2018 1:31 PM
それがダメなのはObjecitve-Cのドット記法の問題ですけどね。
Avatar
@mzp view.frameが返すCGRectがstructで、最終的にviewのsetFrameは呼ばれないです
Avatar
なるほど
Avatar
toggle でおもしろいのは、
1:33 PM
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
Kishikawa Katsumi 10/20/2018 1:34 PM
view.frameが返すCGRectがstructで、最終的にviewのsetFrameは呼ばれないです
厳密には view.frame.origin.x += 10; はコンパイルエラー
(edited)
1:34 PM
CGRect frame; frame.origin.x += 10; はOK 話外れました 🙏 (edited)
👍 1
Avatar
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
あれ、そうでしたか。記憶違いでした。>コンパイルエラー
Avatar
このあたりの mutating func とか inout は機能としてはあったけど、
Avatar
lvalueかな
Avatar
それを十分に有効活用した API を用意できてなかったのは
1:35 PM
設計した側でもこれらの挙動が新しくて十分使いこなせてなかったのかなと思ったり。
1:36 PM
reduce(into:...) って inout な引数を持つ高階関数(メソッド)ですけど
1:37 PM
そういうことができる言語を Swift の他に知ってる方いますか?
Avatar
C++は似たような事ができる部分がありますね
💪 1
Avatar
↓みたいなことができる。 let idToUser = users.reduce(into: [:]) { idToUser, user in idToUser[user.id] = user } (edited)
1:38 PM
C++は似たような事ができる部分がありますね
たしかに C++ は大概のことはできそう・・・
(edited)
Avatar
Swiftは値型を使ってオブジェクト間のつながりを薄めてるみたいな感じがしてて、Objective-C的オブジェクト指向とは別世界にいる感覚になる。 そういう意味では前の話と関連するけど、メッセージ指向っていうのは「相手の状態を気にしない」というのがあると思ってて、
let owner: User = group.owner owner.age += 1 // 何が起こる?
というのはメッセージの境界を超えてるっていう感じがする。ために、そういう実装するなら値型がふさわしいんじゃないかって思う。
Avatar
@rizumita Swift の値型はメッセージ指向的だということですか?
Avatar
いや、メッセージ指向からはなれるというか。
Avatar
だいたいのことは、「それ、C++でも(がんばれば)できるよ」 ってなりがちなんだけど、 ドットチェーン代入はSwiftじゃないとできなくて、すごいと思ってる
Avatar
Rubyのeach_with_objectがちかそう > reduce(into:)
Avatar
Ruby って参照渡しあるんですっけ?
1:42 PM
あー、参照型だからできるのか。
1:43 PM
参照渡し( inout )って時代遅れの遺物的な扱いされてた(主観)けど、値型で見事に活用されてるのとかもおもしろいと思います。
Avatar
参照型がメインだと、into:じゃないreduceで何も問題ないんですよね。
Avatar
そうなんですよ。値型だからこそ活きる。
Avatar
Rubyでは「すべてが参照である」って肯定的に言われてた気がしてて(要出典)
Avatar
既存の概念をうまく組み合わせてる感じがしてすごいですよね、Swiftの値型
👍 1
Avatar
参照型に寄せていくのが良いパラダイムシフトとされていたが、 Swiftはその点逆方向を向いてる部分があって新しい
👍 1
Avatar
「すべてがオブジェクトである」と「オブジェクトは参照型である」と合わせ技かな
😀 2
1:44 PM
Ruby
Avatar
いちおう突っ込んでおくと、inout は概念上は call by copy-restore です。
Avatar
一方で値型の限界があって、前に @takasek さんが言ってたんですけど、非同期処理と相性が悪い・・・
😢 2
Avatar
おっ、そうなんですか
Avatar
@rintaro そのまま参照されてるわけではなくて、最後に書き戻されるって意味ですよね?
1:46 PM
で、最適化によって問題がない場合は参照になる。
Avatar
はい、たいていの場合は最適化で参照になります。
👀 6
1:47 PM
computed property とかも inout で渡せますが当然参照できないので、 get で読み出されて set で書き戻されます。
swift 3
Avatar
rintaroさんが言ってるのは、computed property...あ、かぶった
Avatar
mutating func であっても、コールバックで self を書き換えることはできないですし、 mutating func foo() { DispatchQueue.main.async { self.bar += 1 // できない } }
1:48 PM
これ、今提案されてる async/await で結構問題になる気がしてて
🤔 1
Avatar
そうすると、概念上は、into:付きのreduceもinto:なしのreduceも(最適化がなければ)一緒。。。 (edited)
Avatar
mutating func foo() async { await baz() self.bar += 1 // コンパイルエラー } (edited)
Avatar
get で読み出されて set で書き戻されます。
ここでコピーコストが2回かかるのを最適化するために、 途中状態オブジェクトをコルーチンで保持したまま参照で扱える、 readアクセサ, modifyアクセサがSwift5で入るぞ
👌 1
🙌 4
‼ 7
5⃣ 3
😍 1
swift 4
Avatar
↑のコードが mutating func なのに self 変更できないのとか、初見でとまどいそう。
1:52 PM
あと、↓とかもミュータブルクラスだと簡単だけど値型と inout だと自分同士でできない。 // ミュータブルクラス func sendMoney(from user1: User, to user2: User) { user1.money -= 100 user2.money += 100 } sendMoney(from: user1, to: user2) // OK sendMoney(from: user1, to: user1) // OK
Avatar
うおお、リアクションがすごい。 実はmaster版だと試せます↓ #swiftbot-sandbox に実行例を貼っておきました。 https://gist.github.com/omochi/b31f4916fda78e9a2e804c4b2233370d
GitHub Gist: instantly share code, notes, and snippets.
swift 3
Avatar
// struct func sendMoney(from user1: inout User, to user2: inout User) { // これ自体は OK user1.money -= 100 user2.money += 100 } sendMoney(from: &user1, to: &user2) // OK sendMoney(from: &user1, to: &user1) // コンパイルエラー
1:54 PM
他に、こんなときに値型辛かったとかありますか?
Avatar
全然別の例なんですが、 varlet の間にもうちょいなんかほしいなーと思うことはあって、 struct User { let name: String var age: Int } do { let group = Group( id: 1, owner: User(name: "hoge", age: 16) ) // groupがletなのでこれはできない // group.owner.age += 1 } // というのはいいんだけど do { var group = Group( id: 1, owner: User(name: "hoge", age: 16) ) group.owner.age += 1 print(group) // Group(id: 999, owner: __lldb_expr_1.User(name: "ほげほげぴよぴよーー", age: 65536)) // 👆!!?? } // 実はこうなってました struct Group { let id: Int var owner: User { didSet { self = Group(id: 999, owner: User(name: "ほげほげぴよぴよーー", age: 65536)) } } }
Avatar
sendMoney(from: &user1, to: &user1) // コンパイルエラー は、 @rintaro さんの話を聞いてから見ると納得感はありますね。
Avatar
みなさま!
🐶 1
1:57 PM
そろそろお時間がきてしまいました! 🙇
1:57 PM
このあとボイスチャットを予定していたのですが、やはり時間が足りなくなってしまいました。 申し訳ないのですが次回のお楽しみということで宜しくお願い致します! 🙏
😊 6
🗓 1
😂 2
👏 11
🎙 1
1:58 PM
次回の開催日は未定ですが、もしテーマ司会をやってみたい方がおりましたら @koher さん宛にご連絡ください!
Avatar
サイクル的には多分 1 月でしょうか。
1⃣ 2
Avatar
ですねー 3ヶ月後
1:59 PM
Discordでの開催は第1回目ということもあり、不慣れな点もございましたが、最後までご参加いただきありがとうございました!
👏 10
1:59 PM
それでは、今日はこれでクローズしたいと思います。おつかれさまでした 😀
👏 16
Avatar
おつかれさまでしたー!ありがとうございました!!
👏 16
2:00 PM
ノーテーマでフリートークとかもおもしろそう😁
Avatar
88888888888888888888 (って書く必要がもうない)
👍 2
8⃣ 12
Avatar
2020年4月24日(金)の19:30より、こちらで『Swift Zoomin' チャレンジ』を開催します。 https://swift-tweets.connpass.com/event/171382/
# Swift Zoomin' チャレンジ Swift Zoomin' チャレンジはプログラミング言語 Swift に関するオンラインイベントです。 Zoom を使って音声やスライド・画面共有でコミュニケーションを取りながら、 Swift に関係した課題に取り組みます( Zoom アプリは無料でインストールできます)。 # 課題『 Fat View Controllerを倒せ!』 本イベントは、主催者が用意した Fat View Controller をリファクタリングし、どれだけクリーンな設計とコードを実現できるかというコンペティションです...
👏 6
2:31 PM
こちらのテキストチャット用チャネルは補足的に利用します。メインは『音声チャット』の swift-zoomin チャネルなので、そちらにアクセスして下さい。 (edited)
👍 3
Avatar
聞こえてますー(今米炊いてるからROMります)
🍚 4
Avatar
そろそろ始めます!
👏 15
10:31 AM
最初の10分は接続確認を行います
👍 4
10:31 AM
もし、音声がうまく聞こえない方がいましたら教えてください
Avatar
ここです。
Avatar
聞こえてます! (edited)
Avatar
🙋‍♀️
Avatar
聞こえてます!
Avatar
聞こえてます
Avatar
Yuto Mizutani 4/24/2020 10:35 AM
b
Avatar
ゆきむら(古) 4/24/2020 10:35 AM
(`・ω・´)ゞ
Avatar
聞こえてます!
Avatar
b
Avatar
聞こえています!
Avatar
聞こえてます!
Avatar
聞こえてます
Avatar
🙋‍♂️
Avatar
うほーい
Avatar
聞こえています!
Avatar
聞こえてまーす!
Avatar
聞こえています!
Avatar
聞こえてます
Avatar
聞こえてます。
Avatar
sugigami(susieyy) 4/24/2020 10:35 AM
😋
Avatar
聞こえてます
Avatar
花芽尋かすみ 4/24/2020 10:35 AM
hi
Avatar
聞こえてます!
Avatar
⭐ 1
Avatar
🙋‍♀️🙋‍♂️
Avatar
hamayokokuririn 4/24/2020 10:35 AM
聞こえてます!
Avatar
聞こえます!
Avatar
ありがとうございます!
Avatar
kashihararara 4/24/2020 10:36 AM
🤙
Avatar
ちょっと部屋うるさいのでミュートしますw
Avatar
Kishikawa Katsumi 4/24/2020 10:37 AM
聞こえてます 👍
Avatar
すみません。どこから画面みれるでしょうか。(discord初めてなもので。。。)
Avatar
音声テスト中です。19:40 〜開始します
Avatar
今日は音声のみです!
10:38 AM
「Screen Sharingもできるけど50人までしかできないみたいなので」
10:38 AM
「今日は発表ではなくコードを書くイベントなので、画面がなくてもできるかなと思ってます」
Avatar
あ、音声のみに変わったとかいてあいました。失礼しました
😆 1
👌 1
Avatar
888888
Avatar
はじめます!!!
Avatar
Q. ボイスチャンネルはどう使うんですか? A. 説明とか、何か質問があったら聞いてもらうために使います
👍 1
Avatar
すみません、音声なんですが、koogawaさんに通話する感じで合っていますか...?(こちらも初心者ですみませんがどなたか...) (edited)
Avatar
チャンネルリストの下の方、「音声チャット」に swift-zoomin というのがあります
10:41 AM
Avatar
ありました!!ありがとうございます。🙇‍♀️
Avatar
こちらの「Swift-zoomin」から音声チャットにログインできます!
🙇‍♀️ 1
Avatar
キーボード音って「Krispによるノイズ抑制」で抑えられるのかな?
👍 1
Avatar
↑音声チャットは左メニューの下の方にあります (edited)
Avatar
チャンネルのアイコンがスピーカーなのが音声チャット、「#」なのが通常のチャットだと思います! 「swift-zoomin」は同名で両方ありますね
🙏 1
Avatar
Contribute to refactoring-challenge/reversi-ios development by creating an account on GitHub.
👀 6
👍 53
Avatar
👆今回のプロジェクトのリポジトリです
10:43 AM
「アクセスできた人はリアクションつけてもらえると、どれくらいの人がアクセスできたかわかって嬉しいです」
10:44 AM
「なにかわからないことがあったらいつでも、話してる最中でもミュート解除して聞いてください!」
Avatar
ミュートの解除は左下のこのマイクボタンからできます
Avatar
print("hello")
Avatar
テキストチャットはどんなときに使うのか
  • コードを使って質問したい
  • シンタックスハイライトも使えます トリプルバッククオートの後に言語名で
Avatar
print("hello world") (edited)
Avatar
print("hello")
Avatar
let uhooi = "うほーい"
Avatar
みなさん、Hello world を入力してみてください
Avatar
print("Hello world")
Avatar
print("hello")
Avatar
print("hello, world")
Avatar
print("Hello!")
Avatar
print("hello world")
Avatar
print("Hello World!")
Avatar
print("はろーわーるど")
Avatar
print("hello world")
Avatar
print("hello world")
Avatar
print("Hello World")
Avatar
hamayokokuririn 4/24/2020 10:46 AM
print("hello")
Avatar
swift print("hello")
Avatar
teppei_kikuchi 4/24/2020 10:46 AM
print("Hello World") テスト
Avatar
print("Hello World!")
Avatar
print("Work from home")
Avatar
print("Hello World!")
Avatar
print("Hello, World!")
Avatar
print("yeah!")
Avatar
print("Hello!")
Avatar
print("hello")
Avatar
Yuto Mizutani 4/24/2020 10:46 AM
print("Hello, world!")
Avatar
print("Hello world")
Avatar
'''swift
Avatar
print("Hello World")
Avatar
print("Hello!!!")
Avatar
print("hello")
Avatar
print("Hello World!")
Avatar
print("Hello World")
Avatar
swift print("Hi!")
Avatar
ゆきむら(古) 4/24/2020 10:46 AM
print("Hello")
Avatar
print("Hello, World!")
Avatar
print("ハローワールド")
Avatar
print("hello")
Avatar
@swift-5.2.5 print("Hello World")
Avatar
Hello World
Avatar
print("Hi")
Avatar
print("Hello world")
Avatar
Hello world
Avatar
Kishikawa Katsumi 4/24/2020 10:46 AM
@swiftbot help
Avatar
Usage: @swiftbot [--version=SWIFT_VERSION] [--command={swift, swiftc}] [--options=SWIFTC_OPTIONS] `​`​` [Swift Code] `​`​` Examples: @swiftbot `​`​` print("Hello world!") `​`​` @swiftbot --version=4.0.3 `​`​` print("Hello world!") `​`​` @swiftbot --command=swiftc --options=-dump-parse `​`​` print("Hello world!") `​`​` @swiftbot --platform=mac `​`​` print("Hello world!") `​`​` Subcommands: @swiftbot versions: show available Swift toolchain versions @swiftbot contribute: show repository URLs @swiftbot help: show help
👀 2
Avatar
'''swift print("hello")'''
Avatar
print("Hello World")
Avatar
swift print("Hello World")
Avatar
print("Hello world!")
Avatar
''' print("hello WORLD")
Avatar
print("hello")
Avatar
@swift-5.2.5 print("スターください")
⭐ 12
Avatar
スターください
Avatar
print("Hello")
Avatar
バッククォートを3つ打つ
Avatar
@swiftbot help
Avatar
Usage: @swiftbot [--version=SWIFT_VERSION] [--command={swift, swiftc}] [--options=SWIFTC_OPTIONS] `​`​` [Swift Code] `​`​` Examples: @swiftbot `​`​` print("Hello world!") `​`​` @swiftbot --version=4.0.3 `​`​` print("Hello world!") `​`​` @swiftbot --command=swiftc --options=-dump-parse `​`​` print("Hello world!") `​`​` @swiftbot --platform=mac `​`​` print("Hello world!") `​`​` Subcommands: @swiftbot versions: show available Swift toolchain versions @swiftbot contribute: show repository URLs @swiftbot help: show help
Avatar
こんな感じで書いて下さい。
👍 9
Avatar
swift print("Hello world!")
Avatar
print("Hello World")
Avatar
print("Hello")
Avatar
print("hello world")
Avatar
www
Avatar
print("hello")
Avatar
ゆきむら(古) 4/24/2020 10:47 AM
これ
Avatar
"""swift print("hello") '''
Avatar
@swift-5.2.5 print("Hello")
Avatar
Hello
Avatar
print("hello")
Avatar
ゆきむら(古) 4/24/2020 10:48 AM
入力中でも色変わってくれるの見易くてありがたいですね
Avatar
@swift-5.2.5
Avatar
Usage: @swift52 [SWIFT_OPTIONS] `​`​`​ [Swift Code] `​`​`​
Avatar
@shiz はいってる音声チャットのチャンネルが違いますよ
Avatar
@swift-5.2.5 print("Hello world") (edited)
Avatar
Hello world (edited)
Avatar
@swift-5.2.5
Avatar
Usage: @swift52 [SWIFT_OPTIONS] `​`​`​ [Swift Code] `​`​`​
Avatar
みんなでbotをいじめる会w
Avatar
print("hello")
Avatar
@swift-5.2.5
Avatar
Usage: @swift52 [SWIFT_OPTIONS] `​`​`​ [Swift Code] `​`​`​
Avatar
@swift-5.2.5
Avatar
Usage: @swift52 [SWIFT_OPTIONS] `​`​`​ [Swift Code] `​`​`​
Avatar
@swift-5.2.5 print("hello world")
Avatar
hello world
Avatar
@swift-5.2.5
Avatar
Usage: @swift52 [SWIFT_OPTIONS] `​`​`​ [Swift Code] `​`​`​
koher pinned a message to this channel. 4/24/2020 10:49 AM
Avatar
@swift-5.2.2
Avatar
teppei_kikuchi 4/24/2020 10:49 AM
@swift-5.2.5 print("test")
Avatar
@swift-5.2.5
Avatar
test
10:49 AM
Usage: @swift52 [SWIFT_OPTIONS] `​`​`​ [Swift Code] `​`​`​
Avatar
ゆきむら(古) 4/24/2020 10:49 AM
@swift-5.2.5
Avatar
Usage: @swift52 [SWIFT_OPTIONS] `​`​`​ [Swift Code] `​`​`​
Avatar
@swift-5.2.5 print("Hello!!")
Avatar
@swift-5.2.5 print(1 + 2 + 3 + 4 + 5)
Avatar
Hello!!
Avatar
よっしゃ。こうげきするぞ! @swift-5.2.5 swift print(""" _人人人人人人人_ >  無限ループ <  ̄Y^Y^Y^Y^Y^Y^Y^ ̄ """)
Avatar
15
10:49 AM
_人人人人人人人_ >  無限ループ <  ̄Y^Y^Y^Y^Y^Y^Y^ ̄
Avatar
@swift-5.2.2
Avatar
print("hello")
Avatar
@swift-5.2.5 print("hello world")
Avatar
Usage: @swift52 [SWIFT_OPTIONS] `​`​`​ [Swift Code] `​`​`​
Avatar
@swift-5.2.5 print("Hello WOrld!")
Avatar
Hello WOrld!
Avatar
@swift-5.2.5 print("hello")
Avatar
hello
Avatar
@swift-5.2.5
Avatar
Usage: @swift52 [SWIFT_OPTIONS] `​`​`​ [Swift Code] `​`​`​
Avatar
@swift-5.2.5
Avatar
Usage: @swift52 [SWIFT_OPTIONS] `​`​`​ [Swift Code] `​`​`​
Avatar
@swift-5.2.5 fatalError()
Avatar
exit status: 4 with stderr:Fatal error: file <stdin>, line 1 Current stack trace: 0 libswiftCore.so 0x00007ff43dc62490 swift_reportError + 50 1 libswiftCore.so 0x00007ff43dcd3b50 _swift_stdlib_reportFatalErrorInFile + 115 2 libswiftCore.so 0x00007ff43d9e954e <unavailable> + 1385806 3 libswiftCore.so 0x00007ff43d9e9157 <unavailable> + 1384791 4 libswiftCore.so 0x00007ff43d9e9782 <unavailable> + 1386370 5 libswiftCore.so 0x00007ff43d9e7a20 _assertionFailure(_:_:file:line:flags:) + 520 7 swift 0x00000000004f5d3e <unavailable> + 1006910 8 swift 0x00000000004fa5b2 <unavailable> + 1025458 9 swift 0x00000000004e7d6c <unavailable> + 949612 10 swift 0x00000000004dca99 <unavailable> + 903833 11 swift 0x00000000004d2abb <unavailable> + 862907 12 swift 0x00000000004cf72d <unavailable> + 849709 13 swift 0x0000000000459672 <unavailable> + 366194 14 libc.so.6 0x00007ff43fd0d740 __libc_start_main + 240 15 swift 0x00000000004591c9 <unavailable> + 365001 Stack dump: 0. Program arguments: /usr/bin/swift -frontend -interpret - -disable-objc-interop -I /Libraries/.build/x86_64-unknown-linux-gnu/debug -I /Libraries/.build/checkouts/SwiftBacktrace/Sources/CSwiftBacktrace/include -I /Libraries/.build/checkouts/SwiftBacktrace/Sources/Clibunwind/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOHTTPParser/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOSHA1/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOAtomics/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIODarwin/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOLinux/i
Avatar
USキーボードだと左上でなく右上ですね!
Avatar
@swift-5.2.5 print("hello world")
Avatar
hello world
Avatar
jis キーボードの場合は シフト押しながら @ です!>バッククォート
Avatar
@swift-5.2.5
Avatar
Usage: @swift52 [SWIFT_OPTIONS] `​`​`​ [Swift Code] `​`​`​
Avatar
@swift-5.2.5 print("hey!")
Avatar
hey!
Avatar
@swift-5.2.5 swift print("Hello World")
Avatar
Hello World
Avatar
@swift-5.2.5
Avatar
Usage: @swift52 [SWIFT_OPTIONS] `​`​`​ [Swift Code] `​`​`​
Avatar
あれ?ごめんなさいHHKBだからか…
Avatar
HHKBの場合は右上ですね。
Avatar
US の HHKB は右上でした
Avatar
@swift-5.2.5 print("rm -rf /")
Avatar
rm -rf /
Avatar
@swift-5.2.5 ​ print("Hello WOrld!")
Avatar
Hello WOrld!
Avatar
@swift-5.2.5 print(111)
Avatar
@swift-5.2.2 hello world
Avatar
111
Avatar
print("Hello")
Avatar
botsugoi
Avatar
@swift-5.2.5 hello world
Avatar
exit status: 1 with stderr:<stdin>:1:6: error: consecutive statements on a line must be separated by ';' hello world ^ ; <stdin>:1:1: error: use of unresolved identifier 'hello' hello world ^~~~~ <stdin>:1:7: error: use of unresolved identifier 'world' hello world ^~~~~
Avatar
@swiftbot print("はろー")
Avatar
Author icon
hironytic
print("はろー")
Version:
swift-5.2-RELEASE
Output:
はろー
Error:
Avatar
そんなつもりでは…w 入力できない方はコピペでもいいと思います!
😆 1
Avatar
しまった
Avatar
バッククオートコピペよう ` `
10:51 AM
あ、思ったのと違った
Avatar
swift print("hello")
Avatar
@swift-5.2.5 hello world
Avatar
exit status: 1 with stderr:<stdin>:1:6: error: consecutive statements on a line must be separated by ';' hello world ^ ; <stdin>:1:1: error: use of unresolved identifier 'hello' hello world ^~~~~ <stdin>:1:7: error: use of unresolved identifier 'world' hello world ^~~~~
Avatar
Contribute to refactoring-challenge/reversi-ios development by creating an account on GitHub.
Avatar
print("みえた")
Avatar
「このリポジトリをforkしてください」
10:53 AM
「GitHubアカウントを持ってない人はcloneしてください」 (edited)
10:54 AM
今回の趣旨: このFatViewControllerをリファクタしてみよう!
Avatar
あれ、これ音声チャンネルじゃないです?
Avatar
音声チャンネルです!
Avatar
oh,,,
Avatar
Github アカウントを持ってない方は git clone git@github.com:refactoring-challenge/reversi-ios.git
Avatar
画面共有はないやつですね
🙈 1
Avatar
こちらにいらしてください
koher pinned a message to this channel. 4/24/2020 10:55 AM
Avatar
あ、入れました!
👍 3
10:55 AM
yokattta
10:59 AM
初 commit です
Avatar
sugigami(susieyy) 4/24/2020 11:01 AM
こんばんわー 🙋‍♂️
Avatar
プロ勢揃い
Avatar
花芽尋かすみ 4/24/2020 11:01 AM
こんばんはー
Avatar
koher「今回やりたかった理由
  • 適度な例がほしかった
  • ふつうの勉強会では時間制限ゆえシンプルな例が多い
  • 実務では複雑すぎる
  • (2つめなんだっけ)
  • みんなで見せ合ったら面白そう
  • みんなで取り組むと共通言語ができるのでは。Reversiの○○パターンだね、みたいな
空中戦にならないように、具体的なコードをもとに語れるイベントやれると面白いと思った 」
(edited)
Avatar
あー、これ手に近い方からアニメーションするのか
Avatar
status: リポジトリのcloneはできたかな?できたら実行してみよう!
Avatar
途中から来られた方向け: ・今日は音声のみです。画面はありません ・チャンネルリストの下の方にある「音声チャット」に 🔊swift-zoomin というのがあります。そちらにお入りください ・このテキストチャンネルもコードを共有したり、補助的に使用します 今回のリポジトリはこちら。clone して実行してみてください https://github.com/koher/refactoring-challenge-reversi-ios 何かわからないことがあれば音声かこのチャットで遠慮なく聞いてください
Avatar
細かい仕様はREADMEに書いてあるので確認してください わかりにくい仕様: パスの時はアラートが表示される とか
Avatar
おー、両方Computerにしてたら、Resetのアラート中でも裏で盤面が進んでいく!
😮 6
Avatar
本来は「リファクタリング=壊さないように修正する」ですが、仕様を理解した上で作り直すでもOKです
Avatar
public enum Disk { case dark case light }
Avatar
status: コードの説明中
  • BoardView.swift
  • CellView.swift
  • DiskView.swift
  • Disk.swift
Avatar
// 3 列目・ 4 行目のセルの状態を取得 let disk: Disk? = boardView.diskAt(x: 3, y: 4) // 3 列目・ 4 行目のセルを黒のディスクが置かれている状態に変更 boardView.setDisk(.dark, atX: 3, y: 4, animated: false)
Avatar
花芽尋かすみ 4/24/2020 11:10 AM
このAPI初見したとき、すごくシンプルでわかりやす〜いってなりました
Avatar
boardView.setDisk(.dark, atX: 3, y: 4, animated: true) { isFinished in // アニメーション完了時に呼ばれる }
11:12 AM
extension ViewController: BoardViewDelegate { func boardView(_ boardView: BoardView, didSelectCellAtX x: Int, y: Int) { // x 列目・ y 列目のセルがタップされたときに呼ばれる } }
11:14 AM
Avatar
👆DiskViewが直接使われているところ (edited)
Avatar
Kishikawa Katsumi 4/24/2020 11:14 AM
なるほど!
Avatar
これら4つのファイルは変えなくてもリファクタできるように作っています (変えてはいけないという意味ではありません)
Avatar
👆READMEの「コード概要」セクションへのリンクです。
Avatar
Contribute to refactoring-challenge/reversi-ios development by creating an account on GitHub.
Avatar
👆ViewControllerを読むうえでの手がかりになるコードです。ここから読むのがわかりやすいかもしれません (edited)
Avatar
👆READMEの下の方にある画像です。IBOutletの関係の図なので是を見たらわかりやすいかもしれません ふたつの線が伸びているのはoutletCollectionです (edited)
Avatar
Fatでもわかりやすい…
Avatar
status: コード説明終了!今後の流れの説明
11:19 AM
  • 成果発表会は後日開催。3週間後、5/16です。
Avatar
# Swift Zoomin' Swift Zoomin' はプログラミング言語 Swift に関するオンライン勉強会です。普通の勉強会と同じようにスライドおよび音声で発表を行います。無料アプリのZoom を使う予定ですが、 Zoom 以外での開催の可能性もあります。 今回は Swift Zoomin' チャレンジ 〜Fat View Controllerを倒せ!〜で課題に取り組んだ報告会です。 Fat View Controller として実装されたリバーシアプリをリファクタリングし、どのようにしてクリーンなコードを実現したのかを発表者が説明...
Avatar
「こんなふうに解決したぜ!」と発表したい方は奮ってご参加ください
11:20 AM
(次回Zoomを使うかどうするかは未定です)
11:21 AM
3週間あるので、今日終わらなくても大丈夫!腰を据えて取り組んでみてください。
Avatar
花芽尋かすみ 4/24/2020 11:21 AM
声張ってこ(治安皆無(体育会系
🍴 2
Avatar
今日はもくもく会になると寂しいので、ミュート解除してわいわいやってください。ひとりごとも質問も大歓迎です
Avatar
あ、喋れない人はここを分報がわりに使うとか大丈夫です?
Avatar
花芽尋かすみ 4/24/2020 11:22 AM
僕もわかんないです
Avatar
はい
11:22 AM
🙏
11:22 AM
www
Avatar
花芽尋かすみ 4/24/2020 11:22 AM
なにもわからない
Avatar
会話しながらリファクタリングとかできるものなのみんな・・・
Avatar
AppCode 配信します
11:25 AM
音声は無ですが
Avatar
コードは雄弁でしょう(適当
Avatar
これってもうリファクタリング始まってます?笑
Avatar
テスト書きたくないのでなるべく書きません
11:26 AM
型で防御します
11:27 AM
あ、私も MVC ですね〜
11:27 AM
😏
11:27 AM
Sample App to learn a testable design (Smalltalk flavored MVC) - Kuniwak/TestableDesignExample
11:27 AM
私はこういう感じですねぇ
11:27 AM
テスト書いたら負けです
11:27 AM
型で
11:27 AM
守ります
😆 1
Avatar
設計本に合わせてFlux + MVVMで進めておりますm( )m
Avatar
enum VerticalIndex: Int { case one = 0 case two case three case four case five case six case seven case eight }
Avatar
MVVMになりそうかなあ
Avatar
ご覧ください
11:28 AM
絶対に out of index を起こさないいしを
11:28 AM
感じてください
Avatar
花芽尋かすみ 4/24/2020 11:28 AM
ww
Avatar
Swift Zoomin' チャレンジ の過激派枠で参加を申し込みました! https://t.co/JyGX731QWt #swiftzoomin
Avatar
sugigami(susieyy) 4/24/2020 11:28 AM
設計本の担当章に合わせて Reduxで進めております 🙋‍♂️
Avatar
花芽尋かすみ 4/24/2020 11:29 AM
MVP + クリーンアーキテクチャ脳なのでそれでやっていきます。 とりあえずデータの保存・読み込み周りのコンポーネント切り出しからやってます
Avatar
型の許す範囲に
11:29 AM
ダメな値があるからダメなのです
11:29 AM
ならば型を狭めましょう(過激派 (edited)
Avatar
僕はまず白と黒の星の画像に変えます
⭐ 4
Avatar
そこらへんはふふふ
11:29 AM
ですね!
Avatar
花芽尋かすみ 4/24/2020 11:29 AM
星は草
Avatar
足し算は overflow したら 多分 null とかになる
11:31 AM
あ、それは null にするんですよ
11:31 AM
なので、
11:31 AM
足し算するところで
11:31 AM
overflow するかいなかを検知させます
11:31 AM
なので、どこでおかしく鳴ったのかすぐわかりますね〜
11:31 AM
です!
11:31 AM
まあ死んだら諦めます
11:31 AM
過激派も引き際大事
Avatar
花芽尋かすみ 4/24/2020 11:32 AM
事前にやると言いつつ、昨日コード読んだだけの状態です🙇
Avatar
あ〜 Vim コマンど炸裂したんじゃ〜
11:32 AM
11:32 AM
twitter
11:32 AM
いいですよ〜
11:32 AM
ww
Avatar
なにが永続化されてるか見るか
Avatar
まず我々はドメインを定義する必要があるってやつです(適当
Avatar
花芽尋かすみ 4/24/2020 11:33 AM
アカウントふたつ用意したら
11:33 AM
いける
Avatar
swift の subscript setter のやり方忘れた、、、
11:34 AM
ほんとだwww
11:34 AM
クソザコなのがバレた
Avatar
sugigami(susieyy) 4/24/2020 11:34 AM
事前に取り組みさせてもらいました Reduxはとても相性がいいですよ! あと、コンピューターの考える時間を短くしてDebugしやすくしてます
👍 2
Avatar
MVC -> MVVMってすすめていったらわりとやりやすそう?
Avatar
花芽尋かすみ 4/24/2020 11:38 AM
@Kuniwak 文字がちょっとつぶれてしまっているので、サイズ大きくしていただけたりしますか?👀 (edited)
Avatar
はい?
11:39 AM
はい
11:39 AM
はい
11:40 AM
遅くなるからでしょうね〜
11:40 AM
私はあんま煩雑だとは思いませんねぇ
11:40 AM
人間が確信のある時のみ明示的に force unwrap すればいいのでは派です
Avatar
sugigami(susieyy) 4/24/2020 11:40 AM
ReduxのActionに落としやすかったです ただStateの差分更新をViewに実装するのは大変だったのでReducerで差分を計算しています ただ、いきなりReduxにリファクタリングは動作を保証しながら移行は難しくて 動作を確認しつつシンプルなMVCに移行してから、Reduxへと段階的に移行しました
Avatar
それでは、『SwiftのOptionalのベストプラクティス』というタイトルで発表します。 #swtws pic.twitter.com/OJfz2tk4sP— koher (@koher) 2017年4月15日 2 年程前、 ...
Avatar
リプレイとかUndoとかはReduxじゃないとめんどくさそう
Avatar
花芽尋かすみ 4/24/2020 11:43 AM
あー
Avatar
// Immutable 最高! // index がはみ出さないことを、初期値を Index で保証しているから、force unwrap しても安心だね!
11:43 AM
直近のコメントです
Avatar
sugigami(susieyy) 4/24/2020 11:44 AM
ActionでStateを変更するごとにごとにStateをDiskに履歴を保存して巻き戻すとか
Avatar
アッ、cdoe 思い
11:44 AM
AppCode 固まった
Avatar
稲見さんのHervestを覗くとその辺丁寧に例出してくれてますね (edited)
Avatar
AppCode!
11:45 AM
息をしてくれ!!!!
Avatar
🌾 Harvest: Apple's Combine.framework + State Machine, inspired by Elm. - inamiy/Harvest
Avatar
大事な布教のタイミングなんだ!
😆 1
11:46 AM
テスト書いたら負けです(テストを生業とするものの暴言
Avatar
ミュート・ミュート解除の音を皆に通知したくない場合は Preference >アプリの設定>通知 からオフにできるようです
🙏 1
Avatar
切り離しですねぇ
11:47 AM
AppCode 蘇生
Avatar
花芽尋かすみ 4/24/2020 11:47 AM
無い人だっているんですよ!!!
Avatar
あれ、これどこが (0, 0) だ
11:52 AM
まあ多分左上が 0, 0 であろう(適当)
11:52 AM
もはやあまり振る舞いを買えないを気にしていない
11:53 AM
あー、LLDB にするか
11:53 AM
型最高!
11:53 AM
あ、よかった
11:53 AM
LLDB 開こうと確認しちゃいました
11:57 AM
あれ、ReeactiveSwift だともうちょい簡単かもです?
11:57 AM
私特に困ったことないです(RxSwift でもあんま困ったことない
11:57 AM
私は速攻で ReactiveSewift と MirrorDiffKit を入れました
Avatar
Combineはいいぞ
🙂 5
Avatar
Combine この前入門に失敗したオタクなので
Avatar
型消去に慣れたらいい感じ
Avatar
protocol Foo { associatedtype PublisherType: Publisher where Output == Bar var bar: PublisherType { get } }
Avatar
ぐ、ご飯のため離席、、、また後日
🍚 5
Avatar
とりあえずデータ管理をロジック層に分離するため、現在の状態を返す BoardView.diskAt のfunc丸ごと消してコンパイルエラーを起こすことから始めました ここで起こったコンパイルエラーを新しく作る盤面管理するやつ使ってコンパイルエラー直してやる予定
👍 4
Avatar
あ、モノイド則満たすわあ
12:13 PM
完全に理解した
Avatar
私はフォルダ構成を整えてみました
12:14 PM
ここからどうしよう… MVPぽくしたいので、Presenterを作ってみようかな
Avatar
ところで途中から入ってきた人で、何か困ってる方いらっしゃいますか? なにかありましたらテキストでも音声でもお気軽に! リポジトリ情報などは 📌 アイコンから確認できます (edited)
👍 1
Avatar
今までひたすらソースを眺めていたけどやっと手を動かし始めました。 とりあえず BoardView のAPIをprotocolに切り出して、ロジックを具体的な BoardView から切り離してみたいと思ったけど、 placeDisk がいやらしい 😢
👍 1
Avatar
BoardView のAPIをprotocolに切り出して、ロジックを具体的な BoardView から切り離してみたいと思ったけど
12:36 PM
ですね。僕もBoardViewのAPIだけが欲しいと思いました
🤝 1
Avatar
リバーシの盤面は8x8であるものとするか、任意偶数の正方形サイズを許容すべきか、というどうでもいいことを考えてる
Avatar
sugigami(susieyy) 4/24/2020 12:39 PM
ViewControllerからロジックは切り離しやすいですが、BoardViewから切り離すときに動作も壊さず少しずつつリファクタリングするのに難儀しました
Avatar
var board: Board = Board(""" -------- x------- -o------ --ooo--- ---ox--- -----oox ---ooo-- --o-x--- """) do { try board.place(.dark, atX: 4, y: 5) XCTAssertEqual(board, Board(""" -------- x------- -x------ --xoo--- ---xx--- ----xxxx ---oxo-- --o-x--- """)) } catch let error { XCTFail("\(error)") }
Avatar
Kishikawa Katsumi 4/24/2020 12:48 PM
リバーシの盤面は8x8であるものとするか、任意偶数の正方形サイズを許容すべきか、というどうでもいいことを考えてる
おもしろいですね。なんか実際にもっと大きい・小さい盤面のオセロもあるみたいですね。
Avatar
中央の4x4の範囲の四隅に●の表示がほしいなーとか、リファクタリングと関係ないどうでもいいことを考えてしまったり
Avatar
なんでそんなことを考えていたかっていうと、 widthxRangestatic let でなかったからなんですよね static let でないと、インスタンス毎に違う場合がある(今回は8x8でない盤面が今後追加される計画がある)のではないかと勘繰ってしまう
Avatar
public enum State: Equatable { case beingPlayed(turn: Disk) case over(winner: Disk?) }
Avatar
Kishikawa Katsumi 4/24/2020 12:54 PM
私も大きさが変わっても大丈夫なように作っとくと思いますね。
👍 1
Avatar
Kishikawa Katsumi 4/24/2020 12:57 PM
turn = Disk ^ これも見通しの悪さに影響してるな😅直すぞ〜 (edited)
Avatar
let board: Board = Board(width: 6, height: 4) XCTAssertEqual(board, Board(""" ------ --ox-- --xo-- ------ """))
Avatar
2x2より小さくしたらどうresetするのか気になりますね。
Avatar
public struct Board { // ... public init(width: Int, height: Int, disks: [Disk?]? = nil) { precondition(width >= 2, "`width` must be >= 2: \(width)") precondition(height >= 2, "`height` must be >= 2: \(height)") precondition(width.isMultiple(of: 2), "`width` must be an even number: \(width)") precondition(height.isMultiple(of: 2), "`height` must be an even number: \(height)")
😂 1
Avatar
Kishikawa Katsumi 4/24/2020 1:00 PM
保存データのフォーマットは [現在のターン(黒・白)][先手番が人間かコンピュータか][後手番が人間かコンピュータか] [ボードの状態]
1:00 PM
こうですね。
Avatar
marty-suzuki 4/24/2020 1:01 PM
Viewの入出力を、ViewModelのinputとoutputに対して1対1で紐付けてこんな感じにしてみています。
Avatar
Kishikawa Katsumi 4/24/2020 1:01 PM
これは読みやすい
1:02 PM
動きは同じようになるんですか?
Avatar
marty-suzuki 4/24/2020 1:02 PM
動きも同じになるよにテストを書きつつ進めてました
1:03 PM
リセットを押してアラートは、そのままでますねw
Avatar
リセットは面倒くさいので画面丸ごと作り直しという仕様に落とし込むのが楽・・・?
Avatar
marty-suzuki 4/24/2020 1:07 PM
画面の優先度を仕様として決めてしまって ・表示しているものを閉じて表示する ・何もしない という処理にしてたりします
👀 1
Avatar
Kishikawa Katsumi 4/24/2020 1:07 PM
enum Player { case human case computer }
Avatar
podcastみたいになってるw
📻 1
Avatar
そこで日本語プログラミングですよ https://qiita.com/codelynx/items/9af94d8f9f24cee339e2
Swift に限った話ではありませんが、クラス名や変数名に Unicode が使えるようになってきました。🐶🐱を変数にするのも結構ですが、もっと日本語を積極的に使っていけば、開発や保守が楽になるケースがあると考えていました。今回、日...
Avatar
スピードスター 👀
Avatar
Kishikawa Katsumi 4/24/2020 1:12 PM
enum { case 黒 case 白 }
1:12 PM
これでよかったんや
1:12 PM
struct 手番 { 先手番 後手番 }
1:13 PM
棋譜でテストを書きたい
Avatar
「全取りは64:0扱いという仕様」再現されてませんね (edited)
🙌 2
😮 1
🎉 2
Avatar
Kishikawa Katsumi 4/24/2020 1:18 PM
struct Board { var discs: [Disc?] = [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, .white, .black, nil, nil, nil, nil, nil, nil, .black, .white, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ] }
Avatar
ZWJもskin toneもいけました (edited)
1:25 PM
Avatar
@swift-5.2.5 var 🎲: Int { (1 ... 6).randomElement()! } print(🎲) print(🎲) print(🎲)
Avatar
6 6 6
Avatar
@swift-5.2.5 var 🎲: Int { (1 ... 6).randomElement()! } print(🎲) print(🎲) print(🎲)
Avatar
1 4 6
Avatar
一度全部壊して作り直すならすぐなのですが、真っ当に少しずつリファクタリングをしていくとなると難しい・・・
Avatar
Kishikawa Katsumi 4/24/2020 1:34 PM
enum Disk: CaseIterable
1:34 PM
^ sides はCaseIterableで良さそう
1:40 PM
Disk.allCases()
Avatar
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
22:40 現在 元のViewController: 573行 私のViewController: 620行 https://github.com/uhooi/reversi-ios/blob/feature/refactor/Reversi/GameViewController.swift 泣きそう
Contribute to uhooi/reversi-ios development by creating an account on GitHub.
😂 3
Avatar
「Disk.light, darkを直そうと思ったらInterfaceBuilderで使われてるので駄目でした…」 「ViewController以外の4つのファイルは触らなくていいつもりだったので、触るときには自己責任で」
Avatar
game pieces called disks (often spelled "discs")
(edited)
Avatar
Kishikawa Katsumi 4/24/2020 1:47 PM
増えてる😂
😫 1
1:47 PM
どれだけ長くできるかというのもあり
Avatar
FizzBuzz Enterprise Edition is a no-nonsense implementation of FizzBuzz made by serious businessmen for serious business purposes. - EnterpriseQualityCoding/FizzBuzzEnterpriseEdition
1:50 PM
Avatar
Kishikawa Katsumi 4/24/2020 1:57 PM
override func viewDidLoad() { super.viewDidLoad() boardView.delegate = self messageDiskSize = messageDiskSizeConstraint.constant do { try gameManager.loadGame() } catch _ { gameManager.newGame() } updateUI() }
1:57 PM
^ とりあえずnew/load/saveを分離して初期表示はできるようになったよ
👏 5
Avatar
状態遷移の絵
Avatar
Kishikawa Katsumi 4/24/2020 1:59 PM
基本的にあとはプレイヤーの行動でGameStateが変化して updateUI()で最新の状態とUIをSyncすればOK、とするとツールアプリではだいたいそれでいいけど
1:59 PM
きちんと裏返るアニメーションをやろうとするとそんなシンプルには行かない気がする
Avatar
marty-suzuki 4/24/2020 2:04 PM
差分更新にすると、アニメーションの順番担保が難しかったので諦めました... (edited)
Avatar
[[Disk?]]だけだと差分更新でアニメーションつらそうですね
Avatar
なんだろう、Nextstep.fm復活してほしい
👍 2
Avatar
sugigami(susieyy) 4/24/2020 2:06 PM
基本的にあとはプレイヤーの行動でGameStateが変化してupdateUI()で最新の状態とUIをSyncすればOK、
僕もReduxでGameStateを変化して、updateUI()で最新の状態とUIをSyncする作りにしてます アニメーションだけ差分をRedcuerで計算して、データの差分をアニメーションしてます
Avatar
左上から一回転 let directions = [ (x: -1, y: -1), (x: 0, y: -1), (x: 1, y: -1), (x: 1, y: 0), (x: 1, y: 1), (x: 0, y: 1), (x: -1, y: 0), (x: -1, y: 1), ] ... for direction in directions {
Avatar
PDT 7amなので西海岸の人の気配を感じる
Avatar
Kishikawa Katsumi 4/24/2020 2:12 PM
// MARK: Reversi logics ^ とにかくここをなくす、のが私は重要だとみた
2:13 PM
現状はcountDisks だけなくせた
Avatar
Kishikawa Katsumi 4/24/2020 2:21 PM
// MARK: Game management ^ それとここだな
2:23 PM
たぶんこれらをUIから分離できると、最初の人がやってたみたいにUnit Testで盤面の細かい挙動を検証したりとかができるんだと思う。
Avatar
PRのdiffからwhitespaceを消す方法 あるいはURLパラメータに w=1 をつける
Avatar
sugigami(susieyy) 4/24/2020 2:26 PM
Redux(ReSwift)のViewContollerはこんな感じです Game managementの制御が全部Actionになってます
Avatar
marty-suzuki 4/24/2020 2:28 PM
SPMにしようにとしたんですがテストでRxTest使おうとすると、おそらくstaticビルドされてる関係でlinker errorになって解決に時間かかりそうだったのでcarthageにしました
Avatar
なぜか元のmasterのコードでもここで落ちるシリアライズを吐いてしまった
2:34 PM
loadするとおかしい,そうです (lldb) e print(self.gameState.serialized) o11 xxxxxxxo -ooooxxo ooxoxoxx ooxxooxx oxxxxoxx xxxxoxxx xxoxxxxx xxxxxxxx
Avatar
Kishikawa Katsumi 4/24/2020 2:38 PM
報告会までには続きを書こう。どうもみなさんお疲れさまでした 👋
😀 5
2:41 PM
class func animate(withDuration duration: TimeInterval, animations: @escaping () -> Void, // ここ completion: ((Bool) -> Void)? = nil)
2:41 PM
↑これって @escaping じゃないといけないの?
Avatar
Kishikawa Katsumi 4/24/2020 2:42 PM
animationsはスコープ外に保持されるのでそうですね。