Guild icon
swift-developers-japan
開発以外 / zatsu
雑談
Avatar
omochimetaru 8/14/2017 3:59 AM
iosディスコに #zatsu チャンネルがあったらいいなって思った
3:59 AM
@omochimetaru わからんけど今度この勉強会いきますとかこのコンパイラの壊れ方初めて見たとかどこのCIコンテナがおせえとかXcode落ちたとか
4:00 AM
@omochimetaru こんど東京行くので誰か飲みませんか、とかそういうのあったらコミュニティ敵に楽しいなっておもう
Avatar
general?
4:00 AM
でもないのか
Avatar
omochimetaru 8/14/2017 4:00 AM
@hiragram あとはよろしく
Avatar
@hiragram あ〜 generalが運用管理とか挨拶部屋になっちゃってるからそういうのが書き込みづらいのか?
Avatar
雑って雑談のことだよね
Avatar
そう
Avatar
Chris Lattner, one of the key creators behind the Apple programming language Swift, is on the move again. After a short six-month stay at Tesla, which he..
3:04 AM
Chris Lattnerの次の職場はGoogle
Avatar
omochimetaru 8/15/2017 3:04 AM
ソリ!
Avatar
SwiftもAndroidのファーストランゲージになったりして
Avatar
omochimetaru 8/15/2017 3:05 AM
I'm super excited to join Google Brain next week: AI can't democratize itself (yet?) so I'll help make it more accessible to everyone!
Retweets
351
Likes
1383
Avatar
Google Brainていうのは子会社みたいなやつかな
Avatar
omochimetaru 8/15/2017 3:05 AM
Google Brain is a deep learning artificial intelligence research project at Google. It combines open-ended machine learning research with system engineering and Google-scale computing resources.
3:05 AM
Google Brain is a deep learning artificial intelligence research project at Google.
3:05 AM
本社の中のチーム?
Avatar
研究事業みたいなやつね
3:06 AM
多分そう
Avatar
Tesla に続きそういう系に行くのね
Avatar
omochimetaru 8/15/2017 3:06 AM
Androidには関わり無さそうだね
3:06 AM
クリスラトナー、機械学習ニキだったのか・・・
Avatar
自動運転といい、 Chris Lattner は機械学習系のものに興味があるのか。
Avatar
SiriにChris Lattnerのこと聞いたらなんか面白いこと言ったりしないかな
3:07 AM
(今職場なのでできない)
Avatar
Swift 関係なさそうだけど、もし Swift ×機械学習が進められるならいいなぁ。
😋 1
Avatar
今のSwiftで機械学習の障壁ってどういうところにあるんでしょう
Avatar
omochimetaru 8/15/2017 3:10 AM
pythonがクソ
Avatar
ライブラリの充実度ですね
Avatar
omochimetaru 8/15/2017 3:10 AM
あ、質問を読み違えた
Avatar
言語そのものの問題ではなくというかんじか
Avatar
斜め上の回答だw
Avatar
omochimetaru 8/15/2017 3:11 AM
言語自体はむしろ向いてると思うわ。
Avatar
cuda呼べるようにしたライブラリあるから作ることはできそう https://github.com/rxwei/cuda-swift
cuda-swift - Parallel Computing Library for Linux and macOS & NVIDIA CUDA Wrapper
Avatar
データの前処理とかで色々データをいじるので、 map とか filter とか簡単に書ける Swift で書けたらすごくうれしい。
Avatar
Rubyはまさに機械学習をRubyでやっていくぞのためにまずPythonとのブリッジを作ろうとしていて、たしかに全部自言語で成熟するのを待つよりは筋が良いのかなと思った
3:12 AM
Swiftはどうなるかな
Avatar
データの前処理は個人的には学習プログラムを走らせる前に通すので swiftで書いても良い
Avatar
omochimetaru 8/15/2017 3:13 AM
Rubyはまさに機械学習をRubyでやっていくぞのためにまずPythonとのブリッジを作ろうとしていて
すごいアプローチだな・・・
Avatar
ニューラルネットとか画像とかでテンソル触るところは Swift でも中途半端にしか型付けできないから、 Python でなく Swift でもイマイチ。
Avatar
高階テンソルは無理ですね
Avatar
データの前処理は個人的には学習プログラムを走らせる前に通すので swiftで書いても良い @t.ae#5802 もうちょっと学習に近いところで、一部のデータをいじったり変換したりフィルタしたりするところのイメージ。
3:15 AM
最初に大掛かりな変換するなら Swift でもいいけど、個別にちょこちょこいじらないといけなかったり。
Avatar
動的にオーグメンテーションかけるのはまぁやりますね
Avatar
学習のコードと分けると管理が面倒だし、 Python でも内包表記があれば結構なんとかなるから Python でやっちゃう。
Avatar
images = augmentation(images) みたいにやってる
Avatar
あと、どの問題に特有のクラスとかも全部 Python で作っておかないと境界で面倒なことになるし・・・。
3:17 AM
シンプルな問題だったら画像の変換とかだけで済むけど、もっと複雑なデータ構造をしてたら、結局そのデータ構造を扱うクラスとか作らないといけなくて
3:18 AM
一部を Swift に切り出そうとしても結局 Python と二重実装が必要だったりになっちゃう。
3:18 AM
↓これができたらうれしいんだけどなぁ。 let tensor: Tensor<N, 480, 640, 4> = ...
Avatar
c++のライブラリだったらそれ対応してるやつあるんですかね
Avatar
omochimetaru 8/15/2017 3:19 AM
-1の場合は可変長扱いで特殊化ってできない?
3:20 AM
C++だとそういうのがある
3:20 AM
ああ
3:20 AM
整数すら入らないか。
Avatar
-1 は Swift 的に微妙では。せめて nil だと思う。
Avatar
omochimetaru 8/15/2017 3:21 AM
C++だと型パラが intかtypenameしか取れないからそうなる
3:21 AM
でもswiftはそもそもintが無理だった
Avatar
let tensor: Tensor<nil, 480, 640, 4> = ... ↑この方がいいかな。
Avatar
Nで良いと思いますけどね 結局T<10, 480, 640, 4>とかを代入するんですよね?
Avatar
おっと。 #swift っぽくなってきたw
Avatar
3:23 AM
ゆるい話題から気づくとガチ話になるのこのディスコでありがち
Avatar
convolutionとか引数によって出力の型が変わるけどそのへんってどうなるんですかね?
Avatar
omochimetaru 8/15/2017 3:24 AM
C++なら型パラに対するconst計算ができるからいろいろできるよ
Avatar
swiftだとできないですからね…まぁ変数付きの型もできないですが
Avatar
omochimetaru 8/15/2017 3:24 AM
ウム
3:25 AM
その手の行列とかのサイズでミスってても
3:25 AM
実行時エラーでだいたい困らない気もするけどそうでもないんですか?
3:25 AM
学習をぶん回す前にすぐに落ちるから
3:25 AM
あまり時間のロスは無い気がする
Avatar
機械学習って基本ループなんで実行時エラーを地道に治すのでもべつに問題ないんですよね
Avatar
コード書いてて混乱することがある
3:26 AM
あとは可読性?
Avatar
omochimetaru 8/15/2017 3:26 AM
実行時エラーを地道に治すのでもべつに問題ないんですよね
そういうイメージ
3:26 AM
なるほど
3:26 AM
コメントで書くぐらいなら構文で書いて静的検証しろやって気持ちにはなりそう。
Avatar
特に transpose とかでゴリゴリ入れ替えたりしてると・・・
Avatar
僕は4月からRuby学び始めたばかりです笑
Avatar
Swift for Arduino とな https://swiftforarduino.wixsite.com/home (edited)
Avatar
直しましたー
Avatar
Python, 行列演算とかの型はそこまで辛くなさそうですけど (正直型は欲しいけど), pip 周りが辛そうなのであまり触りたくないですね... requirements.txt とか...あの辺りの運用どうしてるんだろう.
Avatar
omochimetaru 8/21/2017 7:33 AM
前やったときはpyvenvを使うと
7:34 AM
言語とライブラリを環境に閉じ込めて、環境に名前をつけられるという感じで
7:34 AM
まあまあなんとかなりそうでした
7:34 AM
bundlerとかnpmみたいにディレクトリローカルなインストールでは無かったんで
7:34 AM
アプリケーションデプロイ単位じゃなかったけど
7:35 AM
なんかそういうのもありそう
Avatar
なるほど.
7:39 AM
こういうのもあるみたいですけど, このリポジトリだけ見る限り最近動きなさそうですね https://github.com/pypa/pipfile (edited)
Contribute to pipfile development by creating an account on GitHub.
Avatar
gybについてちょっとちゃんと理解したいんだけど良さげなキーワードとかあったらください
8:58 AM
@tarunon
Avatar
ええ~~~
8:58 AM
とりあえず動かせとしか
Avatar
@hiragram とりあえず一つ見てみたらわかりますよ。
Avatar
omochimetaru 8/23/2017 8:58 AM
$ gyb --help
Avatar
俺とかおもちのリポジトリでgyb使ってる部分見て、
Avatar
みんなやさしい(やさしくない(やさしい))
Avatar
改造してみたらはやい
Avatar
omochimetaru 8/23/2017 8:59 AM
A GYB template consists of the following elements: - Literal text which is inserted directly into the output - %% or $$ in literal text, which insert literal '%' and '$' symbols respectively. - Substitutions of the form ${<python-expression>}. The Python expression is converted to a string and the result is inserted into the output. - Python code delimited by %{...}%. Typically used to inject definitions (functions, classes, variable bindings) into the evaluation context of the template. Common indentation is stripped, so you can add as much indentation to the beginning of this code as you like - Lines beginning with optional whitespace followed by a single '%' and Python code. %-lines allow you to nest other constructs inside them. To close a level of nesting, use the "%end" construct. - Lines beginning with optional whitespace and followed by a single '%' and the token "end", which close open constructs in %-lines. Example template: - Hello - %{ x = 42 def succ(a): return a+1 }% I can assure you that ${x} < ${succ(x)} % if int(y) > 7: % for i in range(3): y is greater than seven! % end % else: y is less than or equal to seven % end - The End. - When run with "gyb -Dy=9", the output is - Hello - I can assure you that 42 < 43 y is greater than seven! y is greater than seven! y is greater than seven! - The End. - '''
8:59 AM
↑ヘルプ自体もソースの中に入ってるからソース読めば同じことやな 😋
Avatar
俺とかおもちのリポジトリ
これどれ?
Avatar
おお
Avatar
やさしい(やさしくない(やさしい)) (edited)
Avatar
omochimetaru 8/23/2017 9:00 AM
cpp-rhetoric - small fundamental library for modern C++ programming.
9:00 AM
↑C++だけど、まあ、同じっしょ
Avatar
トゲナシトゲアリトゲナシトゲトゲみたいなのやめて。脳みそショートする
Avatar
↑の @tarunon さんの Swift だしわかりやすい。
Avatar
みんな教えてくれてやさしい(黙ってソース嫁でやさしくない(しかしそれは本質的なのでやさしい))
Avatar
文章が脳に優しくなった
Avatar
やさしさ推論してよ
Avatar
gyb でよくわかってないのが、 continue とか break がうまくいかないんだけどどうすればいいかわかります?
Avatar
EnumConvertibleは数値に対してループ回すだけなので比較的優しいコードですね、多分。
9:02 AM
ループの中で、ですかね?
Avatar
omochimetaru 8/23/2017 9:02 AM
if で分岐しかしてないからやったことないや。
Avatar
↓みたいな。 % for x in xs: % if x == 0: % continue % end ... % end
Avatar
pythonのcontinue/breakって何か記述違ったかな
9:04 AM
真面目にやってたの5年以上前だからあやふやすぎる
Avatar
omochimetaru 8/23/2017 9:04 AM
いや、これ結構ややこしいことしてて
Avatar
@hiragram そうだ、これだけは知っておいた方がいいのが、 % 以下のところのコードは Python だということです。
Avatar
9:04 AM
パイソンなんですねなるほど
Avatar
@koher パッチなげましょう!
Avatar
それ知らないと意味不明になるとこだったw
Avatar
gybってジブ?ギブ?ジーワイビー?
Avatar
omochimetaru 8/23/2017 9:04 AM
部分ごとにevalしたりするかんじだから
Avatar
あー
Avatar
omochimetaru 8/23/2017 9:05 AM
で、ループ展開とかがAST的なデータ構造になってて
Avatar
@rintaro バグなんすか?w使い方間違ってるのかと思ってた・・・。
Avatar
omochimetaru 8/23/2017 9:05 AM
再帰的に評価していく感じだから
9:05 AM
breakとか実際大変そう。
9:05 AM
単純に一個のpythonにしてからえいやっと実行してるわけではなくて。
Avatar
% { } % の中なら breakcontinue できるけど、それだと間でコード生成できず・・・
Avatar
暗黒みてきた
9:06 AM
変数にぶち込んで展開するとかになりそう
Avatar
continue できなくて if で全体囲んでるからネストが辛い・・・。
9:08 AM
Swift 4 の """ によって、 Swift コードとして有効な gyb 的なものが作れないだろうか?
Avatar
omochimetaru 8/23/2017 9:08 AM
コンテキストが反転してるからきつくないですか?
9:08 AM
これはテキストがメインで、エスケープした領域がコード
Avatar
そこは反転しちゃうね。
Avatar
omochimetaru 8/23/2017 9:09 AM
Swiftコードとしてvalidな時点で、コードがメインで、エスケープしたがわがテキストになることは避けられない
9:09 AM
多分そこがテキストがメインになってるのが
9:09 AM
この手のツールの一番魅力的なところなんじゃないかと
9:09 AM
おもっている
Avatar
https://github.com/apple/swift/blob/master/utils/gyb.py#L828-L829 こういう感じのコードに展開されるから、 break とかは実際厳しいですね。
swift - The Swift Programming Language
Avatar
omochimetaru 8/23/2017 9:14 AM
パースして裏表ひっくり返してまるまる一個のSwiftに変換してからバッサリ実行するやつ作ったら面白そうだな
Avatar
if __children__[0].execute(__context__): break になるようにしておいて、 continuereturn False , breakreturn True に変換すればいいかな。 (edited)
Avatar
omochimetaru 8/23/2017 9:16 AM
forの中ってchildrenは1個なんですっけ? 普段のforの中の文は break / contiune / 次に進むの3択ですけど
9:17 AM
あ、 return に変換するってそういうことか
Avatar
python は for ... else あるからきちんとやるならもっと複雑になりそう。
Avatar
omochimetaru 8/23/2017 9:21 AM
あ〜そういうのもありますね・・・なるほど。
Avatar
お、できた
Avatar
omochimetaru 8/23/2017 9:30 AM
お?
Avatar
まず、↓の魔法の extension を用意して prefix func +(string: String) { print(string) }
9:31 AM
for n in 1...20 { let inTypes = (1...n).map { "T\($0)" } let commaSeparated = inTypes.joined(separator: ", ") let arrowSeparated = inTypes.map { "(\($0))" }.joined(separator: " -> ") let nestedClosuresBegin = inTypes.map { "{ \($0.lowercased()) in " }.joined() let nestedClosuresEnd = (1...n).map { _ in " }" }.joined() +""" public func curry<\(commaSeparated), R>(_ f: @escaping (\(commaSeparated)) -> R) -> \(arrowSeparated) -> R { return \(nestedClosuresBegin)f(\(commaSeparated.lowercased()))\(nestedClosuresEnd) } """ }
9:31 AM
swift ファイルとして実行可能
9:32 AM
↓実行結果 public func curry<T1, R>(_ f: @escaping (T1) -> R) -> (T1) -> R { return { t1 in f(t1) } } public func curry<T1, T2, R>(_ f: @escaping (T1, T2) -> R) -> (T1) -> (T2) -> R { return { t1 in { t2 in f(t1, t2) } } } public func curry<T1, T2, T3, R>(_ f: @escaping (T1, T2, T3) -> R) -> (T1) -> (T2) -> (T3) -> R { return { t1 in { t2 in { t3 in f(t1, t2, t3) } } } } public func curry<T1, T2, T3, T4, R>(_ f: @escaping (T1, T2, T3, T4) -> R) -> (T1) -> (T2) -> (T3) -> (T4) -> R { return { t1 in { t2 in { t3 in { t4 in f(t1, t2, t3, t4) } } } } }
Avatar
omochimetaru 8/23/2017 9:32 AM
print(""" ... """) が見かけ上 +""" ... """ になっっているだけ?
Avatar
はい
9:32 AM
だけど
9:32 AM
コンテクスト反転でも
Avatar
omochimetaru 8/23/2017 9:32 AM
嬉しさがあまりわからない・・・
Avatar
""" """
9:33 AM
で囲む外と中の話だから
9:33 AM
いちいちprint って書くのは面倒だけど
9:33 AM
+""" """
9:33 AM
で済ませられるならコンテクスト反転してても対して問題ない気がする。
Avatar
omochimetaru 8/23/2017 9:33 AM
>""" """ とかのほうがそれっぽい気がする (edited)
Avatar
それは新規 prefix operator を作成しないといけない。
Avatar
omochimetaru 8/23/2017 9:34 AM
あ〜
9:34 AM
+は既存のやつだからヘッダが短いと・・
Avatar
+""" <html> ... <table> """ for user in users { +""" <tr> <th>\(user.id)</th> <td>\(user.name)</td> </tr> """ } +""" </table> ... </html> """ (edited)
9:36 AM
↑みたいな感じでも使える。 (edited)
9:37 AM
まあツールにするなら > 作ってもいいかも。
9:38 AM
gyb でやりたいこと大体できそうじゃない?
Avatar
omochimetaru 8/23/2017 9:40 AM
できそうではありますね
Avatar
お、 users さえ定義してやれば↑動いた。
9:40 AM
<html> ... <table> <tr> <th>123</th> <td>Chris Lattner</td> </tr> <tr> <th>456</th> <td>John McCall</td> </tr> </table> ... </html> (edited)
9:45 AM
この """ はうれしいなぁ。 Swift 5 で async/await も入ったらめちゃくちゃ使いやすい言語になりそうだ・・・。
9:46 AM
Swift の """ はインデントとか改行とかよく考えられてるのもうれしい。
Avatar
blacklist / whitelist という用語が人種を「連想させる可能性」があるから除去する。 https://github.com/apple/swift/pull/11687
The etymology of these terms isn't about race, but "black" = "blocked" and "white" = "allowed" isn't really a good look these days. In most cases we weren't using these terms particularly precisely...
Avatar
omochimetaru 8/30/2017 2:04 AM
ポリコレニキだ
Avatar
ポリポリがコレコレしてきた
Avatar
omochimetaru 8/30/2017 2:05 AM
何かのライブラリでも、「master/slave」が奴隷制度を連想させるから「leader/follower」に書き換えるっていうPRが飛んだ話があった。
Avatar
ルネサンス初頭を繰り返してることにこいつらいつになったら気づくんやろか
Avatar
最近の シャーロッツビル の件でナーバスになってますねー
Avatar
omochimetaru 8/30/2017 2:06 AM
- bool isPrivateStdlibDecl(bool whitelistProtocols=true) const; + bool isPrivateStdlibDecl(bool treatNonBuiltinProtocolsAsPublic = true) const;
2:07 AM
-/// Checks if a given mangled name could be a name of a whitelisted -/// specialization. -bool isWhitelistedSpecialization(StringRef SpecName); +/// Checks if a given mangled name could be a name of a known +/// prespecialization for -Onone support. +bool isKnownPrespecialization(StringRef SpecName);
2:07 AM
動機はともあれdiffとしては可読性が上がってる気がするw
Avatar
MacProでビルドしてみたらSwiftの初回ビルド15分くらいだった
Avatar
omochimetaru 8/30/2017 2:31 AM
はや
Avatar
15分ははやいのか。
Avatar
omochimetaru 8/30/2017 2:32 AM
macminiで6時間とか
2:32 AM
かかる
Avatar
6時間やばw
Avatar
なんじゃそれは
Avatar
omochimetaru 8/30/2017 2:32 AM
ビルドじゃ
2:32 AM
まあいろいろ端折るかどうかにもようrけど。
Avatar
-Rtだの
Avatar
macminiっていつのやつ?
Avatar
omochimetaru 8/30/2017 2:33 AM
結構前
Avatar
omochimetaru 9/1/2017 3:02 AM
SRってなんだっけ?スナイパーライフルって答えなかったの偉い
Avatar
AR はアサルトライフルですね
Avatar
Kotlinとかでもこのディスコみたいな激ヤバプログラミングモンスターの集いみたいな場あるんですかね
7:00 AM
「Kotlinスタートブック」の著者で事実上のKotlinエバンジェリスト。エムスリー株式会社のソフトウェアエンジニア。日本Kotlinユーザグループ代表。講演・執筆の依頼お待ちしております〜!共通持ち陸派
Tweets
46332
Followers
2396
7:00 AM
↑JPだとこの人が建てたこれだけ知ってる
Avatar
コトリンモンスターだ
Avatar
omochimetaru 9/4/2017 7:01 AM
@hiragram ところでさっきgist付きでリプライ送ったんだけどスルーされてる
Avatar
見てなかったわ
7:02 AM
みるわ
Avatar
ラトナの肩書は Director of Engineering, Tensor-Flow Developer Experience だそうで。
8:28 AM
ML そのものというよりは、tooling のほうに興味があるっぽい印象。 (edited)
Avatar
使いやすい Swift API に期待。
Avatar
omochimetaru 9/7/2017 1:25 AM
Swift4から3に書き換える作業しま〜す😂
😖 4
Avatar
omochimetaru 9/7/2017 1:49 AM
うお!何も書き換えなくてもいけた!
🎉 2
1:49 AM
3 / 4 クロスコンパイルコードだw
Avatar
ConditionalConformanceが入ってたら出来なかったことだw
Avatar
omochimetaru 9/7/2017 2:32 AM
たしかに・・・
2:32 AM
ConditionalConformanceありで書いたコードを無しに持っていくのはめちゃつらそうだな・・・
Avatar
Autolayoutで書いたコードを手計算になおす気持ちになりそう
Avatar
omochimetaru 9/7/2017 4:10 AM
$ swift run 便利じゃのう
Avatar
チャットみたいなUIをtableviewでやるときにtableviewとcellを両方180度反転させるのってあり?
4:34 AM
LINEみたいなUI
Avatar
CSS Hackみたいな荒技ですねw
Avatar
LINE のようなメッセージアプリのように下から新しい順に並べたいと思ったのでやり方を調べてみました。

UITableView をそのまま表示する

まず UITableView にそのまま表示をしてみました。上から順に新しい...
4:44 AM
一応理にはかなっていてできそうって感じはするんだけど
4:44 AM
こういうケースで困りそうみたいなのが思い浮かんだら教えてほしく。
Avatar
俺やったことあるよw
Avatar
こまったことない?
Avatar
RefleshControlが無能になるから自作することになる
Avatar
下に出て来るの?
Avatar
そうそう、あと計算が一部怠かった気がする
Avatar
計算。
Avatar
なんかでハマった気がするけど忘れちゃった
Avatar
はまるならやめとこう
Avatar
これ何か知恵ないですか https://twitter.com/hiragram/status/906900482186108928
なんかUIカクカクする気がするなーってときにどこのコードがメインスレッドブロックしてるかどうやってしらべるのが効率いい?
Avatar
omochimetaru 9/10/2017 3:24 PM
Time Profilerは?
Avatar
instrumentsだよね
3:25 PM
Time profilerでみれるのか
Avatar
omochimetaru 9/10/2017 3:25 PM
うん メソッドごとに消費してる秒数がわかる
Avatar
それはしらなかった
3:25 PM
やってみよう
3:26 PM
なんかXcodeのどっかのビューでMain thread block detectionみたいなのを見たような見てないような記憶があるんだけど夢かもしれない
Avatar
omochimetaru 9/10/2017 4:05 PM
それは俺は知らないけどまた別の機能だと思う
Avatar
Xcode 9でschemeのRunアクションのDiagnosticsにMain Thread Checkerってのが追加されてます。
😃 1
Avatar
UIKitへの操作がMainスレッド以外から呼び出されると警告出してくれる奴でしたっけ?
Avatar
norio_nomura 9/11/2017 2:02 AM
そう。詳しくはSession 406を。 https://developer.apple.com/videos/play/wwdc2017/406/
Learn how to use Xcode 9 runtime tools to help find issues and bugs, ranging from missing and unintended UI updates to integer overflows...
Avatar
norio_nomura 9/11/2017 3:08 AM
あ、そっか。逆か。
3:14 AM
メインスレッドで呼ばないといけないAPIの情報ってどこにあるのだろう。
3:15 AM
Important Use UIKit classes only from your app’s main thread or main dispatch queue, unless otherwise indicated. This restriction particularly applies to classes derived from UIResponder or that involve manipulating your app’s user interface in any way.
Avatar
norio_nomura 9/11/2017 3:16 AM
Main Thread Checkerが元にする情報のことです。
Avatar
omochimetaru 9/11/2017 3:18 AM
UIKitとかのSDK側にアノテーションみたいな形でついてるんでしょうかねえ
Avatar
触っている感じだと、UIKitのどのAPIもメインスレッドで呼ばないといけないのかな?と思っていました。 例: UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert]) { granted, error in logger.error(error) if !granted { return } // これまで直に呼んで問題なく動いていたがチェッカーに指摘されたので、対応 DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } (edited)
Avatar
omochimetaru 9/11/2017 3:20 AM
@mono norioさんが言っているのは、その知識をどうやって Main Thread Checkerの実装に与えているか、ということだと思います
Avatar
norio_nomura 9/11/2017 3:20 AM
https://developer.apple.com/videos/play/wwdc2017/406/?time=160 The main thread checker is a completely new tool in Xcode 9 and it detects violations of some commonly used APIs. And specifically it focuses on UI updates and multithreading. Some APIs require that you only use them from the main thread. (edited)
Learn how to use Xcode 9 runtime tools to help find issues and bugs, ranging from missing and unintended UI updates to integer overflows...
3:21 AM
Some APIs
Avatar
norioさんが言っているのは、その知識をどうやって Main Thread Checkerの実装に与えているか、ということだと思います
UIKitのどのAPIが対象なのだろうか?という意味と受け取ってしまいました。
3:23 AM
僕は有効時は実行時にどのフレームワークに属しているかチェックしているのだろうな程度に思っていました。
Avatar
norio_nomura 9/11/2017 3:24 AM
アノテーションの様に情報を持たせられるなら、メソッドに「メインスレッドで呼んではいけない」という情報を持たせられたら便利なのかな?と思ったり。
Avatar
ですねー
Avatar
omochimetaru 9/11/2017 3:25 AM
自分たちでも使えるようになってたら良いですね
Avatar
今は無理そうですね。定義とか見てもそれっぽいのが無いので、何と無く将来的にも厳しそうな気がしつつ、どうでしょうね 🤔
Avatar
AndroidStudioに同様の機能乗ってませんでしたっけ
Avatar
norio_nomura 9/11/2017 3:34 AM
/Applications/Xcode-beta.app/Contents/Developer/usr/lib/libMainThreadChecker.dylib
Avatar
norio_nomura 9/11/2017 3:53 AM
MTC_VERBOSE=1とかすると、Main Thread Checkerがログを吐く様になる。
👀 1
3:55 AM
… Swizzling class: WKWebInspectorWKWebView Swizzling class: WKWebsiteDataStore Swizzling class: WKWebView Swizzled 9839 methods in 324 classes. みたいな。
Avatar
omochimetaru 9/11/2017 4:02 AM
メソッド Swizzling でスレッドアサーションを注入するのかな?
Avatar
やべえ
Avatar
norio_nomura 9/11/2017 5:06 AM
特定のクラスたちを含むフレームワークたちに含まれるクラス全てで、selがハードコードされた条件に一致しないメソッド全てをswizzleしてるぽい。
5:07 AM
API側に情報を持たせるとかはしていない。 (edited)
Avatar
omochimetaru 9/11/2017 5:08 AM
なるほど
5:08 AM
.dylibだけからそこまでわかるんですか
Avatar
norio_nomura 9/11/2017 5:10 AM
__library_initializerの中身を見ました。
👀 1
Avatar
omochimetaru 9/11/2017 5:11 AM
アセンブリですか?
Avatar
norio_nomura 9/11/2017 5:11 AM
そう。Xcodeでシンボリックブレークポイントを__library_initializerに仕掛けてざっと読んだ感じ。
👀 1
Avatar
omochimetaru 9/11/2017 5:12 AM
おおすごい・・
Avatar
norio_nomura 9/11/2017 5:18 AM
シンボル名とかXcodeがしっかり表示してくれるので、そんなに難しくないと思います。 (edited)
👀 1
Avatar
さっきのtableView反転のやつつぶやいたら、ハマリポイント教えていただきましたhttps://twitter.com/takecian/status/907103997714096128
@_ha1f @Qiita Peek and pop やろうとすると view が元に戻っちゃうみたいなので検討されてたら回避策考える必要はありそうですー https://t.co/IObxbKOaYm
Avatar
やはりCSS Hackはやめましょう(戒め
Avatar
iOS11のDrag and Dropも死にそう
Avatar
norio_nomura 9/19/2017 6:02 AM
Processのドキュメントを見たらcurrentDirectoryPathdeprecatedで、ソースを見たら@availableとかなくて、Original sourceを見たらカテゴリで書かれてた… https://developer.apple.com/documentation/foundation/process/1413110-currentdirectorypath objective-c @interface NSTask (NSDeprecated) @property (nullable, copy) NSString *launchPath; @property (copy) NSString *currentDirectoryPath; // if not set, use current - (void)launch; + (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray<NSString *> *)arguments; // convenience; create and launch @end (edited)
Avatar
ほほう、カテゴリごとdeprecatedなんですね。
6:04 AM
Swiftでextensionごとってできましたっけ?
Avatar
omochimetaru 9/19/2017 6:04 AM
? Process と NSTask は同じクラス・・・?
Avatar
typealias Process = NSTask とか生えてるのかしら
Avatar
omochimetaru 9/19/2017 6:05 AM
それだと依存性的にまずいきが
Avatar
apinotesでClangImporterがリネームしてるのかな。
Avatar
norio_nomura 9/19/2017 6:06 AM
Swiftでextensionごとってできましたっけ? 出来ないからSwiftのインターフェイスには反映されていない感じ。
Avatar
class My { } @available(*, unavailable) extension My { func hello() { print("hello") } } My().hello() コンパイル通るけど何も怒らない
😩 1
Avatar
norio_nomura 9/19/2017 6:08 AM
- Name: NSTask SwiftName: Process Methods: - Selector: 'launchedTaskWithLaunchPath:arguments:' SwiftName: launchedProcess(launchPath:arguments:) MethodKind: Class - Selector: 'launchedTaskWithExecutableURL:arguments:error:terminationHandler:' SwiftName: run(_:arguments:terminationHandler:) MethodKind: Class - Selector: 'launchAndReturnError:' SwiftName: 'run()' MethodKind: Instance
Avatar
SwiftName!
Avatar
omochimetaru 9/19/2017 6:08 AM
邪悪すぎるwww
6:08 AM
あれか、NS除去名系のやつか
Avatar
norio_nomura 9/19/2017 6:09 AM
Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/Foundation.apinotesに書かれてる。
Avatar
objcの、なんだっけ
Avatar
omochimetaru 9/19/2017 6:09 AM
↑たしかに上のところで ObjCに切り替えると NSTaskになったw
6:09 AM
それだと依存性的にまずいきが
ProcessはSwift STDかと思ったけどそもそもFoundationか。STDにあるのは CommandLine だった。
6:11 AM
Class Factory Methods If the Swift compiler fails to identify a class factory method, you can use the NS_SWIFT_NAME macro, passing the Swift signature of the initializer to have it imported correctly. For example: + (instancetype)recordWithRPM:(NSUInteger)RPM NS_SWIFT_NAME(init(rpm:)); If the Swift compiler mistakenly identifies a method as a class factory method, you can use the NS_SWIFT_NAME macro, passing the Swift signature of the method to have it imported correctly. For example: + (id)recordWithQuality:(double)quality NS_SWIFT_NAME(record(quality:));
6:11 AM
このへんかしら
Avatar
ObjCヘッダでもSwift名指定できるから、apinotesは中間措置ではあるんですが
6:12 AM
ヘッダに手をつけられない外部ライブラリ使うときに便利なので、spmも対応してほしい。
6:14 AM
CGRectとかのImport as memberでも使われてるはず。
Avatar
norio_nomura 9/19/2017 6:15 AM
ドキュメントを読まないとわからないdeprecatedとかやめてほしい…
Avatar
ObjCのcategory deprecatedが@availableとして降ってくるのが理想っぽい
Avatar
omochimetaru 9/19/2017 6:15 AM
なるほど apinotes
Avatar
Kishikawa Katsumi 9/19/2017 6:16 AM
ObjCも@interface NSTask (NSDeprecated)って書くだけではコンパイラは何もしないと思いますね。これはそれぞれのメソッドにdeprecatedのアノテーションがいるはず。
Avatar
omochimetaru 9/19/2017 6:17 AM
NSDeprecated は単にそういうカテゴリ名ってことですか?
Avatar
Kishikawa Katsumi 9/19/2017 6:17 AM
はい。違うかな。
6:18 AM
Deprecatedをカテゴリやエクステンションにまとめるのは後で消しやすい(Obsolete)という実装上のテクニック。(Appleがそれをする意味はあまりないと思いますが。)
Avatar
omochimetaru 9/19/2017 6:20 AM
[omochi@omochi-iMac swpr]$ cat b.m #import <Foundation/Foundation.h> @interface Cat : NSObject @end @interface Cat (NSDeprecated) - (int)nya; @end @implementation Cat @end int main() { Cat * cat = [[Cat alloc] init]; return cat.nya; } [omochi@omochi-iMac swpr]$ clang -fobjc-arc b.m
6:20 AM
警告は出なかった
6:21 AM
(検証がこれであってるか不安)
Avatar
Kishikawa Katsumi 9/19/2017 6:22 AM
ちょうど私もNSTaskのコードをXcodeで確かめて警告も何も出ませんでした。なので、
Avatar
omochimetaru 9/19/2017 6:22 AM
ObjC側も何も出ないw
Avatar
NS_DEPRECATEDならちゃんと降ってくる、カテゴリは降ってこないですね
Avatar
ほんとに ドキュメント上だけってことですかねぇ
Avatar
NSDeprecated(Deprecatedとは言っていない)
6:23 AM
🤔
🤔 1
Avatar
Kishikawa Katsumi 9/19/2017 6:23 AM
まあよくあること。アップルの怠慢です。
Avatar
ところで #zatsu
Avatar
Kishikawa Katsumi 9/19/2017 6:24 AM
私的なランクづけでいうと、これは下から3番目か4番目で、ドキュメントにも書かれてないけどヘッダのコメントにだけ書いてあるとか (edited)
6:24 AM
WWDCのビデオでだけ言っているとかがその下にあります。
Avatar
omochimetaru 9/19/2017 6:25 AM
ビデオだけは難易度高いですね・・・
Avatar
Kishikawa Katsumi 9/19/2017 6:25 AM
まあ地道にレポートしたらじきに反映されるんじゃないかと。
Avatar
norio_nomura 9/19/2017 6:27 AM
#swift#objc か迷ったけど #zatsu に書いた。
Avatar
Kishikawa Katsumi 9/19/2017 6:28 AM
Deprecatedをカテゴリやエクステンションに分けておいて、メジャーバージョンアップなどで消すというのはよくあるテクニックで(アップルはそれをたぶん消すことはないと思うけど)さっきのはさらに
6:29 AM
@interface NSTask (NSDeprecated) @property (nullable, copy) NSString *launchPath __attribute__((deprecated("..."))); @property (copy) NSString *currentDirectoryPath __attribute__((deprecated("..."))); - (void)launch __attribute__((deprecated("..."))); + (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray<NSString *> *)arguments __attribute__((deprecated("..."))); @end
6:30 AM
と書いてないとダメだけどそれを忘れている。Swiftでもカテゴリがエクステンションに変わるだけでほぼ同様のやり方を取ることはよくあると思います。
Avatar
omochimetaru 9/19/2017 6:32 AM
なるほど。
Avatar
@interface NSValue (NSDeprecated) /* This method is unsafe because it could potentially cause buffer overruns. You should use -getValue:size: instead. */ - (void)getValue:(void *)value; // This method will likely be deprecated in a future release @end https://developer.apple.com/documentation/foundation/nsvalue/1415141-getvalue?language=objc 見てみるとこっこうあるもんですね。
Avatar
Kishikawa Katsumi 9/19/2017 6:37 AM
アップルのドキュメントジェネレータは、NSDeprecatedみたいなのもアノテーションとして扱ってるっぽいですね。
6:43 AM
ClangImporterへのバグをbugs.swift.orgへも書いておくと良いのかな?
Avatar
(NSDeprecated) カテゴリを @available(*, deprecated) として扱うっていうことですか?
6:46 AM
@available(*, unavailable) extension My { これが通るけどnoopなのは書いておくべきだとおもいます。ClangImporterじゃないけど。
Avatar
norio_nomura 9/19/2017 6:47 AM
テストインプットとしては(NSDeprecated)カテゴリにも__attribute__((availability(…があることを前提にしているぽい。 https://github.com/apple/swift/blob/master/test/Inputs/clang-importer-sdk/usr/include/AppKit.h#L49 (edited)
swift - The Swift Programming Language
Avatar
ObjC コンパイラが NSDeprecated を特別扱いしない以上、Swift だけでそれをやるのは違う感じですね。
Avatar
norio_nomura 9/19/2017 6:48 AM
ですよね。
Avatar
Kishikawa Katsumi 9/19/2017 6:49 AM
NSDeprecatedをドキュメントジェネレータが特別に扱うのはともかくとして、正しい修正は各メソッドとプロパティにDeprecatedアノテーションをつけることだと思います。
👍 2
Avatar
I made an iOS app architecture generator
Retweets
141
Likes
392
😂 2
Avatar
w
6:20 AM
知らないのばっかりだ〜と思ったら適当に生成してるだけかw
Avatar
略語ついてるのうけるw
Avatar
皮肉が効いてて好き
Avatar
Kishikawa Katsumi 9/21/2017 6:21 AM
Singletonが入るとなぜか強そうな感じがしてしまう
Avatar
Singleton Functional View-model Router良い
Avatar
Coordinatorという単語も追加してもいいかもしれない。Singleton Functional Coordinatorとか😜
😂 1
Avatar
そういえば先週チームにDangerが導入されたのですが各社のDangerfileどうなっているんですか便利な設定ありますか
Avatar
warningがなければLGTMがつきます
Avatar
現状SwiftLintぐらいしか走ってない
6:37 AM
自動レビューだ
Avatar
あとZenHub使ってるので、octokitから直接参照はできないんですけど、PRに対応するIssueがEpicだったらwarningを吐くというローカルルールがあります。
6:41 AM
入れる際ぎぎにゃんにも色々聞いたので、御社だと彼がくわしいと思いますよ。
Avatar
確かに国内版のコード見て見たらこまやかな対応入っていた
6:46 AM
残業中のコミットに警告が飛んでくるっぽい
Avatar
こんな時間に仕事させる気?みたいな人間味のあるコメントが飛んでくるみたいですね
Avatar
Dangerたん
Avatar
午前中にPR来たらWarning出したい
Avatar
以下Danger大喜利です
Avatar
VC名をどっかに指定したら勝手にSS撮って貼り付けてくれるとか出来たら便利そうだなぁ
Avatar
単体で立ち上がるDIフリーなVC…!
6:56 AM
理想郷だ
Avatar
つよい
Avatar
Reduxみたいにグローバルな状態が持てれば出来そう
Avatar
TCぶち込んで動けばいいから
6:57 AM
VCのテストを書こうという話と合致しますね
Avatar
現状UIテスト上でSS取れるんだっけかな。PR関係する画面が変更された時だけPRにアップロードしてくれるぐらいならDangerでできそう。
Avatar
beforeとafterのスクショのdiff示してほしい
Avatar
FBSnapshottestcaseとか
Avatar
Kishikawa Katsumi 9/21/2017 7:11 AM
UIテストは以前までは画面が変わったときに自動的にスクリーンショットが撮られるだけでコントロールできなかったけどXcode 9から好きなときに撮れてファイルも自由に残せるようになりました。
Avatar
UITableViewControllerのtableViewのdidSetが呼ばれないのなんなんだろう
10:32 AM
UITableView! だけど実はイニシャライザで付けてるのかな
Avatar
initからセットしてるからでは
Avatar
ほげ〜
10:32 AM
じゃあなんでビックリついてんねん〜
Avatar
まあobjcだし
Avatar
太古の昔はUIViewControllerが非表示かつメモリ少量の場合にviewだけ解放されてviewDidLoadで再セットみたいなのあったし、これを正しく表現するならIUO適切かなと言う気がする
10:37 AM
今どうなってるかは知らない
Avatar
あー
10:37 AM
didReceiveMemoryWarning
10:37 AM
あー。
Avatar
viewDidUnloadのあった頃の話
Avatar
UIVIewControllerのviewも UIView! か。
Avatar
そっちはinitじゃなくてviewDidLoadの直前だね
10:38 AM
動きとしてはlazy varに限りなく近い
Avatar
じゃあdidSetよばれんのかな
Avatar
viewDidLoadつかおうね
Avatar
override var view: UIView! { didSet { print("aaaa") } } これ書いたらそのVCに遷移する時にアプリがまるごとハングするようになった。
Avatar
やべぇよやべぇよ
Avatar
CPUが100%なってるな。
10:42 AM
aaaaはprintされない。
Avatar
果たしてviewDidLoadは呼ばれるのか
Avatar
呼ばれない気がする
Avatar
見てみる
10:43 AM
よばれないね
10:44 AM
viewのdidSetの中にブレーク貼っても止まらないからもう一個手前で様子がおかしくなってる
10:45 AM
should not overrideみたいなのは書いてないね
Avatar
willSetは呼ばれたりして
Avatar
Kishikawa Katsumi 9/25/2017 10:45 AM
どうもStackOverflowが起きてるみたいですね。
Avatar
そうですね 最後はSOでオチました
10:46 AM
お、willSetは呼ばれたぞ。
Avatar
UIKitとswiftどっちが壊れてるんやろか
Avatar
didSetを書かずにwillSetだけにしたらviewDidLoadに到達した。
10:46 AM
普通に画面も遷移した。
10:46 AM
didSet壊れてそう?
Avatar
えーっと
10:47 AM
多分だけど、UIViewController.view自体は本来はcomputed propertyのはずで
Avatar
そうね
Avatar
それをoverrideしてdidSetやら生やせるのが完全におかしい
10:47 AM
lazy varもdidSet生やせない
Avatar
lazy varなんでdidSet生やせないんですか
Avatar
現状はサポートしていない、理論上可能かはちょっとわからない。 lazy varはコンパイル時にcomputed propertyとして展開されてるみたいなのは @omochimetaru が指摘してた気がする
Avatar
willSetが呼ばれたのを見るとComputedPropertyではないのでは、という気もしてきた。
Avatar
Objective-Cで@propertyを宣言しつつ、内部ではゴニョっとやってるものを作って
10:51 AM
Swiftとつなげたらどういうことになるかを確かめてみると謎が解けるかも?
10:52 AM
#swift みてきたぞ
10:52 AM
#objc かな?
Avatar
computed propertyでもsetget が両方用意されてればwillSet呼ばれるか
10:56 AM
↓これだとwillSet実行されるけど override var view: UIView! { willSet { print("willSet") } } ↓これだとwillSetも呼ばれなくなる override var view: UIView! { willSet { print("willSet") } didSet { print("didSet") } }
Avatar
class Foo { lazy var bar: Int = 0 } class Foo2: Foo { override var bar: Int { didSet { print("a") } } } Foo2().bar = 2
10:57 AM
あれ?これまじかw
10:57 AM
いけるやんけ
10:58 AM
まじか~~
Avatar
lazy varはコンパイル時にcomputed propertyとして展開されてるみたいなのは @omochimetaru が指摘してた気がする
これは事実で、
computed propertyでもset と get が両方用意されてればwillSet呼ばれるか
これなんじゃない?
Avatar
overrideしてlazy var didSetが正しく動くのはバグかどうか
11:00 AM
これいけるならlazy var didSetをサポートしない理由がよくわからなくなってくる
11:02 AM
続きは #swift
Avatar
前回はスレ警察しても無視されたので今度はパワるぞ
11:04 AM
スレ警察したら議論止むのやめろ
😘 2
Avatar
https://twitter.com/rintaro/status/912329050789601281 一部の方にはお知らせしてましたが、やっと正式に決まりまして、Appleに入ることになりました。
I'm super excited to share that I'm joining Apple to work on Developer Tools next week!
👏 22
Avatar
🍎 🎉
❤ 2
Avatar
omochimetaru 9/27/2017 7:35 AM
#deleted-channel を作ったので Swiftの雑なものはそちらへ
Avatar
消えたw
Avatar
きえた
Avatar
omochimetaru 9/27/2017 7:39 AM
何もなかったよ
👀 4
Avatar
チャンネルが消える瞬間を見れた😆
Avatar
「消しまーす」に👍 付けた瞬間に消えた
😆 1
Avatar
(つд⊂)ゴシゴシ
Avatar
あ、おいしそうなご飯が消えた
Avatar
強烈な飯テロだった
2:17 PM
画像通知は来なかったですね
Avatar
サーロインステーキ丼(つд⊂)ゴシゴシ
Avatar
norio_nomura 10/5/2017 3:47 AM
coremltools - Converter tools for Core ML.
🙂 2
Avatar
func foo<T: P>(a: T) -> T.A { fatalError() } struct B {} protocol P {} extension P { typealias A = B } これがコンパイル通らないのなんでですかね 🤔 'T' does not have a member type named 'A'; did you mean 'A'? になる (edited)
1:17 PM
struct B {} protocol P {} extension P { typealias A = B } func foo<T: P>(a: T) -> T.A { fatalError() }func foo<T: P>(a: T) -> T.A { fatalError() } struct B {} protocol P { associatedtype A } extension P { typealias A = B } にすると通るようになるんですが。。 (edited)
Avatar
extension P { typealias A = B } これだと、Tに生えてるわけじゃない、のかと思ったけど2番めのは通るのか。
Avatar
定義する順番によってコンパイル結果が変わるっていうのが不思議
Avatar
別ファイルのコンパイル順についてのissueはあったけど、同じファイル内での定義順については見当たらないかな。 https://bugs.swift.org/browse/SR-1960
Avatar
筋肉.swiftというのを知ったw https://kinniku-swift.connpass.com/event/69438/
いい肉の日(11/29)に開催決定!! 記念撮影時に上裸OKでました!! ## イベント概要 * 筋肉エンジニア主催の普通のiOS勉強会。 * プロテインで乾杯するのと、飲食物はヘルシーなものが多いのが特徴。 ## 内容 ### プロテインで乾杯 * 主催者kboyの挨拶とスポンサー様の紹介の後、プロテインで乾杯するところから会をスタート。 * こちらで紙コップ等を用意して配布しますが、シェイカーを持参していただくとスムーズです。 * できるだけシェイカーを持参して下さい。 ### iOSに関する発表 * 抽選で選ばれた7人のスピーカーに10分ずつ...
Avatar
シェイカー持参おすすめだったり、プロテインで乾杯だったり、ベストスピーカー賞にプロテイン贈呈だったり、濃過ぎてもはや何が何だか…
Avatar
どこで聞くのが適切かわからないので #zatsu で。 ( Swift の Codable とかではなく一般論として、) JSON でキーが存在しない場合とそのキーに null が設定されている場合を区別するのってありだと思いますか?
5:24 AM
{ "foo": null, "bar": 42 }{ "bar": 42 } を違うものとして良いか。 (edited)
Avatar
オプショナルなキーにnullが入ってるのはOKでキーなしはパースエラーにしたいみたいな感じでしょうか
Avatar
ありだと思います、個人的にはキー無しはErrorにしたいけど
Avatar
違うものとしたい気がする
Avatar
JSONライブラリ次第で区別できなくなってしまうような気も。
5:25 AM
あー、えっと、キーなしの場合はデフォルト値としてデコードしたいです。
Avatar
1. キーの有無は違う型として分離し、混ざっている場合は親の型をEnumで分別する 2. キーの有無を意味する型(オレオレOptional)を作る
5:26 AM
あー
Avatar
Kishikawa Katsumi 10/16/2017 5:26 AM
現実的にはやめた方が良いことの方が多いと思います。
Avatar
JSONのオブジェクト自体Dictionaryみたいなものだから区別したい ( subscriptだと曖昧だけど containsKey() とかで判別できる
Avatar
いやsubscriptでも、Valueの型がOptionalなら
5:26 AM
.noneと.some(.none)で違いは出るのでは?
Avatar
そうね
Avatar
現実的にはやめた方が良いことの方が多いと思います。
そうですよねぇ・・・
Avatar
いやsubscriptでも、Valueの型がOptionalなら
それもあり
Avatar
まーでもJSON APIのレスポンスをパースした時って[String: Any]とかだろうし現実にはどうだろうってかんじする
5:28 AM
koherさんのケースだと、キーが無かったらデフォルト値で、キーありnullだったらnilになるんでしょうか
Avatar
let x: [String: Any] = ["a": 1, "b": Int?.none] let k = x["b"] switch k { case .some(let x): print("some") // here case .none: print("none") }
5:28 AM
問題ないかと
Avatar
経緯としては、元々は JSON の設定項目ではなくて一種類しか存在しなかったものに対して、新しく enum Foo として設定できるようにしたい、けれども、これまでとの互換性を考えると "foo" が省略された場合は Foo.hoge にしたい。でも、セマンティクス上 Foo がないということも表現したくなったので let foo: Foo? にしたいって感じです。
5:29 AM
キーが無かったらデフォルト値で、キーありnullだったらnilになるんでしょうか
そうです。
Avatar
ひらりがいってるのはJSON側で Optional が表現されてないってことだと思うけどたるのんがいってるのはデコードした後にデータ構造として表現はできるって話しかな・・・
Avatar
Kishikawa Katsumi 10/16/2017 5:30 AM
ライブラリ作るとか、APIとしてキーの有無、値の有無を区別できる能力を持たせるのはアリだけど、それを活用するのはできるだけナシにしたいですね。
Avatar
@koher JSON仕様上「fooPresented: Bool」を足して今回は逃げ切るとか
Avatar
Kishikawa Katsumi 10/16/2017 5:30 AM
で、>これまでとの互換性を考えると "foo" が省略された場合は Foo.hoge にしたい。でも、セマンティクス上 Foo がないということも
Avatar
具体的に話すと、画面をダブルタップしたときに起こるイベントがあったんですが、これまではダブルタップすると起こるイベントは一種類だけだったので特に設定はなかったんですが、
Avatar
あ、ボクのはSwiftのデータ構造として[String: Any]にデコードする過程で、型をInt?なりOptionalとして保証していれば、JSONの{"b": null}も.someになるよという話
Avatar
新たに、イベントが起こらないとか、別のイベントが起こるとかを設定できるようにしたくなって
5:31 AM
enum Event { ... } を作って let event: Event? というプロパティを足したくなりました。
5:34 AM
しかし、 JSON にこれまで "event" は存在しなかったので、 "event" を省略したときは { "event": "doubleTap" } のように解釈したいということです。 (edited)
5:35 AM
一方で、 Event?nil のケースも表現したいので { "event": null }"event" の省略と区別したくなった、と。
Avatar
Eventのnil許可をやめて、enum Eventの中に case noneを入れれば解決すると思う
Avatar
一応デコードできるんですが、トリッキーだし将来的に禍根を残さなければいいなぁと。
5:36 AM
@tarunon それもあるんですが、意味上は Event? だと思うんですよねぇ。
5:37 AM
JSONを忘れてコードだけ考えれば Event? であるべきケースだと思うんですよ。
Avatar
JSONのデコード時とそれ以外で使う型を変えてコンバートすれば良いのでは?
Avatar
↓的な話で。 < JSONを忘れてコードだけ考えれば Event? であるべきケース https://speakerdeck.com/takasek/sorewoenumrunante-tondemonai-swift-enum-antipattern
Avatar
{ "version": 2, "event": null // いべんとがない } { "version": 2, "event": "doubleTap" // ダブルタップ } { "event": null // ダブルタップ } (edited)
Avatar
ううっ、メンテが辛い・・・
Avatar
移行が終わって古いJSONがなくなることがあれば version3で "version" を廃止できる
Avatar
Kishikawa Katsumi 10/16/2017 5:39 AM
将来的に禍根 でいうと、キーのあるなしで区別するのは確実に将来に禍根を残しますね。
5:40 AM
キーの無しとnull
Avatar
やっぱ良くないですよねぇ・・・。
5:41 AM
JSONのデコード時とそれ以外で使う型を変えてコンバートすれば良いのでは?
そこにだけ導入するのもコードがいびつになっちゃうんですよねぇ。とはいえ、どこかをいびつにするしかないのも事実・・・。
Avatar
Eventのnil許可をやめて、enum Eventの中に case noneを入れれば解決すると思う
これがマシな気がしてきた
5:42 AM
あれ、どっちの話かわかんなくなってきた・・・
5:43 AM
json上では明示的に "event": "none" とやるようにすると
5:43 AM
JSONデコーダ上で キー無しと null があいまいでも
5:43 AM
"none" が設定されていることは取り出せて
5:43 AM
過去のキー無しの仕様は1通りのままで保てて
5:44 AM
その "none" を含むのがあれか、tarunonの言ってる2種類の型の事か
Avatar
  • "event": null"event" の省略を区別する
  • Event? をやめて Event.none を作る
  • JSON に "version" を足してデコード時に区別する
  • 一時的に別の型にデコードしてから Event? に変換する
5:45 AM
コードとJSONの仕様をキレイに保つためには、既存のJSONをすべて変換する( "event": "doubleTap" を足す)という方法もあるか。
5:46 AM
ちょっとどれがマシか考えてみます。みなさんありがとうございました。
Avatar
switch文でそのenum型の全てのcaseをバコッと一発で入力する方法とかないですよねー
Avatar
REafcator -> ADd missing switch casesは違うのかな
Avatar
お?
Avatar
xcode9からなんか Refactor メニュー増えてるからワンチャンできないかな
8:23 AM
それっぽいのあるけどグレーアウトしていてどうすれば有効になるのかがわからない
Avatar
カーソルの場所によっては黒になる
8:23 AM
みぎくりっくしてや
8:25 AM
Refactorメニューはどこ右クリックしてもグレーアウトしてたけどエラーメッセからガツッと追加できた
8:25 AM
@omochimetaru ありがたや
Avatar
黒いけど押しても何も起こらないけど↑のエラーのFixはいけるね。
Avatar
いろんなとこ右クリックしたけどRenameしか黒くできんかったや。
Avatar
ww
Avatar
関係ないけど caseでlet使うとき前に書くかカッコの中に書くかみたいな話どっかで前にあったけど、この自動で挿入されるコードはカッコのなかにletがあるタイプのやつだな
Avatar
なるほど・・・
Avatar
assoc valueにfugaというラベルがついてると case .hoge(let fuga): ってしてくれるけど、ラベルついてないと case .hoge(_): ってなってる。 (edited)
Avatar
前の rintaro さんの話聞いて中派に鞍替えした。
Avatar
おー
8:31 AM
前から中派だったのでイェイという感じです
Avatar
try も中がいいのかもしれないけど、 () が面倒で結構前に書いてしまいます。
8:32 AM
case のときは () が元からあるからいいけど。
Avatar
あー、tryも同様にどっちにもかけるのか。
8:34 AM
意識してなかったですが前に書いてますね
Avatar
式が複雑だとどの API が throws なのかぱっと見でわかんなくなっちゃうんですよね〜。
Avatar
Kishikawa Katsumi 10/17/2017 9:26 AM
caseのletは複数のときにスッキリするから私は外に1つだけ書く派だけど、中に書く人の方が多そうな印象があります。
Avatar
僕もそうだったんですが、 @rintaro さんの↓で意見を変えました。 --- let x = 12 switch ee { case let .a(x, y): print(x, y) default: break } みたいなときに x が何を指しているのか不安になるので 内側派。
Avatar
これを出されるとグヌヌ・・・ってなる
9:30 AM
外側派に改宗するすんでの所でこれを見て思い止まった
Avatar
まだそれ踏んだ事無いし見なかったことにしてる
Avatar
Kishikawa Katsumi 10/17/2017 9:30 AM
これはletの場所の問題かなあ
Avatar
往生際が悪いぞ
Avatar
Kishikawa Katsumi 10/17/2017 9:31 AM
稀に同じ名前にしたくなることがあるのはあると思います。
😖 1
Avatar
sakurapleasure 10/18/2017 10:46 AM
どこでポストすればいいかわからないので #zatsu でやります 3D TouchとFelicaをサポートしていてSuicaをiPhoneに登録している方に試してほしいんですが、 WalletのSuicaの取引のリストで、カード読み込みの履歴を強く押すとアプリが落ちますか? 僕のiOS 11.1 Beta 3, iPhone 7 Plusでクラッシュするので他の環境ではどうか気になります
Avatar
その画面ForceTouchの機能なさそうですが…
Avatar
sakurapleasure 10/18/2017 1:11 PM
1:11 PM
こういう感じででます。めっちゃ出なさそうな顔して実は出ます
Avatar
iOS11だと出ないっぽいので追加された機能ですかね
Avatar
sakurapleasure 10/18/2017 1:40 PM
ホントですか…Betaで初めて試したら可能だったのでその不具合か
Avatar
これは完全に雑談ですがExpressibleByNilLiteralって実際アプリケーションのレベルで使うことってあるんですかね
Avatar
Kishikawa Katsumi 10/20/2017 6:10 AM
ソースコードが見られる会社のリポジトリでざっと検索した限りでは、ライブラリのコードしかヒットしないですね。
6:11 AM
私の感覚でもライブラリでしか使わないと思います。
Avatar
Catみたいな普通の型が対応すると、 Catnil のときと Cat?nil のときがめちゃくちゃわかりにくくなりそう。
Avatar
@Kishikawa Katsumi ライブラリでも自分は見たことないと思うんですが、どんなライブラリですか?
Avatar
Kishikawa Katsumi 10/20/2017 6:16 AM
SwiftyJSONと、、、ちょっと待ってね閉じてしまった
Avatar
おおSwiftyJSON
Avatar
あー、Null Object パターンで使うのか。
Avatar
あーSwiftyJSONみたいなのだと確かにnilは直感的に扱えて良いのかしら。
Avatar
Kishikawa Katsumi 10/20/2017 6:17 AM
SwiftyJSONはまあ理解できる。
Avatar
OptionalのSome/Nilを自前のenumの中に取り込む場合 (enum JSONのcase Null など)
Avatar
ふむふむ
Avatar
Kishikawa Katsumi 10/20/2017 6:17 AM
それとMockingjayなんだけどこれはちょっとよくわからない
Avatar
An elegant library for stubbing HTTP requests with ease in Swift
6:18 AM
Mockingjay - An elegant library for stubbing HTTP requests with ease in Swift
Avatar
結構メタ寄りというか、普通にアプリケーション内のモデルオブジェクトとかで使う感じじゃないですよねやっぱり
Avatar
public enum Download: ExpressibleByNilLiteral, Equatable { public init(nilLiteral: ()) { self = .noContent } // Simulate download in one step case content(Data) // Simulate download as byte stream case streamContent(data:Data, inChunksOf:Int) // Simulate empty download case noContent } (edited)
6:18 AM
noContentで使うようだな。
Avatar
さっきおもちが言ってたのとまさに同じだね
Avatar
Kishikawa Katsumi 10/20/2017 6:19 AM
あとRealmでExpressibleByNilLiteral.Typeを見てるところがありますが、これは完全にメタプログラミングのためのハックなので参考にしてはいけない。
Avatar
おお。
Avatar
Kishikawa Katsumi 10/20/2017 6:20 AM
まあExpressibleByNilLiteralを実装するのはほとんどの場合分かりにくくなるだけだと思うので、使うことはないと思いますよ。
6:20 AM
と、ドキュメントにも書いてあった。
Avatar
HogeがExpressibleByNilLiteralのとき let hoge: Hoge? = nil とかするともう可読性破壊される
6:23 AM
.some(nil) とかいう激ヤバなやつもできる
Avatar
.some(nil)はやべぇ
Avatar
let hoge: Hoge? = nil のとき hogeHoge?.none になった。 (not Hoge?.some(nil) )
Avatar
外側優先マッチかな
6:26 AM
いや、暗黙の型変換の候補探索が後回しってだけかな
Avatar
暗黙の型変換はこの場合どこのことだろ?
Avatar
Hoge から Hoge? への変換だね
Avatar
あなるほど
Avatar
T is Optional<T> の変換。 T? = x の形のとき、xがT?でなければ、x: T とみなしたうえで T -> T? の変換ができるか試行する
Avatar
元々は NULL ポインターも nil で表現されてましたよね。今はなくなったけど。そういうのならありな気が。
6:37 AM
これは完全に雑談ですが
余裕で #swift でいける気がする🤔
Avatar
Kishikawa Katsumi 10/20/2017 6:39 AM
Discordはチャンネルを抜けるっていう概念はあるんですか?
Avatar
なさそう
Avatar
チャンネル自体には参加/不参加の概念は無いっぽいですね
6:40 AM
未読通知はチャンネルごとに各自でミュートできます
Avatar
Kishikawa Katsumi 10/20/2017 6:40 AM
なるほど。
Avatar
久しぶりにTravisでmacOSのCIが走るPRとか書いたのだけど、バックログが酷い事になってるんだね。 https://www.traviscistatus.com (edited)
Avatar
Kishikawa Katsumi 10/20/2017 10:14 AM
Travis CIはMacビルドがすごい増えて大変だそうです。ちょっと前に大規模に詰まったことがあって、それからいろいろ対策されたのですが、根本的にMacのVMをホストしなければならないというのがどうにもならない感じですね。
10:14 AM
現在無料プランの並列実行が2つに減ったこともあって、いつかは終わるからのんびり待つという感じで使ってます。
10:15 AM
公開リポジトリで使うぶんにはそれでもTravis CIがいちばん自由度が高いのは変わらないですね。 (edited)
Avatar
12時間経ってもジョブ終わってなかった… (edited)
Avatar
ISUCON参加しました。来年はサーバーサイドSwiftで参加できると良いですね…
🙂 1
Avatar
こんにちは。今日から discord を使い始めたのですが、さっそく音声ボタン?のようなものを押してしまったようです。何かご迷惑をかけてしまっていたら教えてください 🙇
👌 1
Avatar
😋 1
8:39 AM
多分だれにも迷惑かかってないですよ 🙆
Avatar
←のスピーカーのアイコンが音声チャット部屋で同じ部屋に入っている人同士で通話できます
Avatar
このあたりをとりあえずクリックした記憶が
Avatar
確認取らずに接続するのやめてくれ~ってなる
Avatar
一応設定でマイクレベルを0にしておけば事故って音が通る事は防げるよ。
Avatar
@koogawa ちら見してきたけどwwdcチャンネルに閉じ込められているような感じではなかったので大丈夫そうでした
😁 1
Avatar
さっきまで @koogawa さんのアイコンがチャネルリストの一番下に表示されてたんですが、スピーカーマークのチャネル(?)を押したらそうなるんですか?
Avatar
ああ、マイクミュートでも良いな
Avatar
@koher そうです
Avatar
なるほど。
Avatar
ボイスチャットチャンネルは開いた瞬間音声通話が開始されます
Avatar
なるほど、なんかすみません!
🙆 3
Avatar
ワークアラウンドじゃなくてUIの導線わかりにくいのに凶悪じゃないという話をしても毎回ワークアラウンドを提供されてしまう現象について
Avatar
なるほど、危険だ・・・。 @tarunon さんの言う通り確認のアラート出してほしい・・・。
Avatar
でもこれ話題の出し方としてはちょっとハイコンテキストだな
Avatar
UIの導線は直すまで時間がかかるから(治るとも限らん
Avatar
wwdcスピーカーは初見殺しな気がする。初めて入った人が気になって押しちゃいそう・・・。
Avatar
チャンネル名がアルファベット順ってことは
8:44 AM
全角文字は一番下になるかな?
8:44 AM
#ここから下は音声通話
Avatar
アルファベット順じゃないよ
Avatar
っていうチャンネルを
8:44 AM
駄目か~
Avatar
順番は自由に並び替えられるけど音声は必ず↓になる
Avatar
じゃあ #ここから下は音声通話 チャンネルを一番下に置けば悲劇は回避できるのでは
Avatar
カテゴリ機能が最近入ったから音声チャットカテゴリにしてみた
👍 5
Avatar
おー
8:45 AM
音声チャットになった
Avatar
おお、素晴らしい。
8:46 AM
これで事故が大分防げそうだ・・・。
Avatar
サーバー参加者がswtws前後で20人ほど増えて250人になった。
👏 9
Avatar
ほんと絵文字の話題見るたびに思うけど、よくこんなのをUnicodeの仕様として規定しようとか考えたなぁ… https://t.co/agqpX53b0r
Avatar
この MakeFamily って何やってるの?ただの join ?
Avatar
きいてみる
Avatar
ZWJかな
4:05 AM
zero-width-joinnerを間に挟んでjoinだと思います
4:05 AM
\u+200dだったかな?
Avatar
@omochimetaru https://t.co/GGEk6vs2YL この行。 単に zero width joiner で Join するだけ。
Avatar
tarunon さんの読み通りだ。
Avatar
Swiftで試してみようと思って。
Avatar
swiftはユニコードで指定できますよね
4:10 AM
文字列
Avatar
1> ["👩", "👩", "👧", "👧"].joined(separator: "\u{200d}") $R1: String = "👩‍👩‍👧‍👧" (edited)
Avatar
いい加減iOSに嫌気がさしてきたので違うことやりたい気持ちがでてきたんだけどWebAssembly+Swiftって今どんな感じなのか追っかけてる人とかいませんか
Avatar
@hiragram そういえばそれ追いかけているというかウォッチしてるスレがあって https://github.com/kripken/emscripten/issues/2427
Hi team, playing around with Emscripten in earnest for the first time, not my usual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swift p...
3:35 AM
Swift4で標準ライブラリがstatic linkできるようになったことと
3:36 AM
xcode9のclangがwasmターゲットでビルドできるバージョンになっていることがあるので
Avatar
ほう
Avatar
大きめの技術的ハードルは解消された感じがするけど
3:36 AM
誰もやってないからその先の壁がそもそも観測されてない感じがする。
3:39 AM
個人的にはwindowsネイティブビルドのほうが気になっている そっちのほうが簡単そうだから。でもそっちもまだゴールとはいえない
3:39 AM
以外とそうでも無いのかな
Avatar
CircleCIも申請して通ればOSSのmacOSビルドに使えるのね。
4:54 AM
申請してみよう。
Avatar
ちょっと前に絵文字の話題が出てましたけど、変数名に絵文字を使うのも面白いかも?と考えたことがあります😅
10:55 AM
ゴルフは楽しくなるかも?
Avatar
http://www.emojicode.org 🐇 🙋 🍇 🍰 name 🔡 🐈 🆕 🍼 name 🔡 🍇🍉 🐖 🌕 🍇 😀 🍪🔤Good night, 🔤 name🍪 🍉 🐖 ☀️ 🍇 😀 🍪🔤Howdy, 🔤 name🍪 🍉 🍉 🏁 🍇 🍦 greeter 🔷🙋🆕 🔤Spencer🔤 🌕 greeter 👴 Prints “Good night, Spencer” to the console 🍉
🙃 1
10:56 AM
絵文字プログラミング言語
Avatar
可読性悪すぎるw
Avatar
定数は 🍦 で 冷たい 変数は 🍮 で柔らかい
10:58 AM
のように、わかりやすく工夫されている
Avatar
white space よりはマシかもですw < 可読性
11:02 AM
昔VBのマクロで変数が漢字だったのを見てうげ、と感じたのですが、今考えると日本語ローマ字よりはアリなんじゃ?とかw
11:04 AM
migemo で補完できれば…
Avatar
実際 discord とかも 👀 とかできるし入力方法は問題ないかもですね
11:05 AM
あー
11:05 AM
:eyes: -> 👀
Avatar
ひと昔前はもうオッサンだし、絵文字とか使うの恥ずかしいかなと感じてましたが、規格になったので採用の方向ですw
Avatar
可読性最悪と言えば(絵文字じゃないけど)↓の最後の方に載ってるJotがおもしろいですよ。二つの記号だけで表せて、あらゆるコードがシンタックスエラーにならず有効なコードになります(そういう意味で機械語とは違います)。 http://blog.livedoor.jp/dankogai/archives/51524324.html (edited)
Avatar
初めて知りましたけど、面白いですね < Jot 最悪の極北にはやはり whitespace を推しますがw https://ja.m.wikipedia.org/wiki/Whitespace
Whitespace(ホワイトスペース)は、プログラミング言語のひとつであり、またそれを動作させるインタプリタを指している。WhitespaceはGPLにより配布されている。実用言語ではない難解...
Avatar
CircleCIも申請して通ればOSSのmacOSビルドに使えるのね。 問い合わせたらfree OSS Seed plan適用してもらえた。
👍 1
10:19 AM
こういうダイアグラムを生成する便利なソフトってありますかしら? (edited)
Avatar
https://github.com/yoshimkd/swift-auto-diagram こんなのは見つけました(ruby製)
swift-auto-diagram - A Ruby script that scans all swift code from the specified folders and files and automatically generates an entity diagram (similar to a class diagram) which can be viewed in a...
Avatar
SourceKittenの出力を使うものみたい。 https://github.com/Sumolari/swift-relationship-graph
swift-relationship-graph - A simple tool to create relationships graphs for Swift codebases
11:07 AM
Swift で定義されたオブジェクト間の依存関係を可視化する flock というツールを作った。これによって、 Swift で書かれたコードベース全体を把握しやすくなったり、リファクタリング時に影響範囲を把握しやすくなる。 Usage Homebrew からインストールできる。 $ brew tap naoty/misc $ brew install flock flock は指定したディレクトリ(何も指定しなければカレントディレクトリ)以下の Swift のソースコードを解析して dot 形式のソースコードを出力する。これを Graphviz 等を用いて画像に出力して使う。 $ flock …
Avatar
おぉ、ありがとうございます!!!
Avatar
CircleCIでswiftlintをdockerベースで簡単に実行出来るよう、swiftlintを含むdockerイメージを作成した。 https://hub.docker.com/r/norionomura/swiftlint/ (edited)
1:19 AM
linux_swift_4: docker: - image: norionomura/swiftlint:swift-4.0 steps: - checkout - run: swift test - run: mkdir -p build/reports/ - run: swiftlint lint --strict --reporter junit > build/reports/junit.xml - store_test_results: path: build/reports/
1:20 AM
Swiftコンパイラも含むのでビルドもできる。
1:21 AM
linuxでobjc関連を含むコードのlintがどうなるのかよく知らないので、iOSプロジェクトでも使えるのかどうかは不明。
👀 1
Avatar
Swiftでの、classとstructの使い分けについての雑談ネタです 状態を持っているものはclass、ステートレスで静的に扱いたいものはstruct が原則になるかと自分は思ってます。 なお 状態 とは メンバにアクセスした時、返る結果が冪等でなくなる要因 。 つまり、ある型のメンバにアクセスして、その結果が常に同じでないならば、それは「状態を持っている」。 状態は必ずしもプロパティであるとは限らず、👇も「状態を持っている」といえる。 struct Hoge { var date: Date { return Date() } } ……となると、Hogeはclassであるべきなのか? どうなの? という部分で、ちょっと悩んでしまいまして。 みなさんはどうお考えかなーと聞いてみたくなりました。
Avatar
Arrayは append すると count の返り値が変わりますけど、どっちになります?
Avatar
var date = Date() でないのは何か理由がありますか
Avatar
var date = Date() だと date が冪等になります (edited)
Avatar
ああ、だからボクの意図としては
9:10 AM
そんなものをそこに入れるのはどうなんだ、ということか
Avatar
varされたものは、同じ変数をコピーで上書きされてると捉えるのがよいのでは structなら基本letでimmutability(状態が変わらない)を表現できる
Avatar
mutating以外で冪等性が壊れかねないものはclassのほうが良い気がします。
Avatar
やはり
Avatar
僕はそのオブジェクトを共有したいかどうかで決めてます
Avatar
class C { var i: Int = 0 } struct S { private let c = C() var num: Int { c.i += 1; return c.i } } let s = S() // letでimmutableにしてるはずなのに、 print(s.num) // 1 print(s.num) // 2 print(s.num) // 3 structでもimmutabilityを保証できるとは限らないので、 そこも含めて、「mutating以外で冪等性が壊れかねない」意図は classにすることで表現する原則がよさそうかな、と思いました
Avatar
このケース var date: Date { return Date() } は、システムの時計にアクセスしているから結果が変わっているので、参照透明じゃない、外部のステートを参照しているのでステートフル、ということにはなるかと
9:16 AM
グローバル/static , 関数/変数はいつでも見れるんでそこを触ると汚染する例
Avatar
>そのオブジェクトを共有したいかどうか 共有というのは、同時に複数箇所から参照されること、でしょうか となるとViewControllerとViewModelは1:1だという前提がある場合、ViewModelはstructであるべき?
Avatar
そうですね、複数箇所から参照共有したいならクラスにする。 逆は必ずしもそれだけで決めてないです、1箇所で保持する想定でもクラスの場合はある。 けど、↑のViewController / ViewModel は struct がうまくハマるやつな気がする。
9:22 AM
そこも含めて、「mutating以外で冪等性が壊れかねない」
これを実現しようとすると、 struct のプロパティには 参照型を持てなくなりそうだ。
9:22 AM
CoWの内部ストレージみたいに完全に隠蔽されている場合は別として
Avatar
んー、そうなんですよねー…
Avatar
structのプロパティにclassを持って嬉しいことって具体的に何かあります?
Avatar
例えば僕が時々やるのはなんかの型のinner classとかで struct Entry { var name: String var view: XxxView } みたいに、ほぼタプルとして使う時とか
Avatar
それがclassじゃないのは、initの自動生成が嬉しいからでは?
Avatar
いや、無駄にヒープ退避させるメリットが無いかなと
9:25 AM
遅くなる。
Avatar
そうか
Avatar
状態を持つか ベースの世界観で考えると、ViewModelは状態を持つのでclassなんですけど、 共有したいかどうか ベースのomochiさん世界観ならstructが嵌まるんですね
Avatar
そうですね。インスタンス同一性(identity)に意味のあるオブジェクトなのかどうか。
9:28 AM
↑の例なら、nameとviewのペア組だけに意味があるので、同じペアは同じ概念を表してるんで、 identityに興味はない。equalityだけに興味があるのでstructでOK。
Avatar
struct ViewModel { enum State { ... } let state: Variable<State>(.initial) } VMをstructにするのであれば、👆みたいなの普通に起こりますね Variableはclass
Avatar
あ、非同期でselfを書き替えたい場合structだと破綻する?
Avatar
確かにそうですね、キャプチャ共有できないから
Avatar
非同期処理の結果を自身の状態に反映させたい つまり「自身」を特定(=identify)する必要がある であればclass か
Avatar
ですね
9:45 AM
そのパターン、 async / await が入ったときにちょっとわかりにくいエラーになりそうだな
9:46 AM
struct Stone { async mutating func addWeight() { let addValue = await readAddValue() self.weight += addValue } }
Avatar
もしかしてasync mutating自体できない?
Avatar
ダメな気がする
Avatar
最初のawait前なら書き換えできるはずだけどわかりにくいしできなくて良さそう
Avatar
ですな
Avatar
実際困ってるわけではなくてふと思ったことなんですけど、「Hogeのサブクラスなんだけど、Hogeではない」ことってチェックできるんでしたっけ
Avatar
omochimetaru 11/1/2017 8:25 AM
できる
Avatar
type(of: fuga) == Hoge.self これしか思いつかなかった
Avatar
omochimetaru 11/1/2017 8:26 AM
それじゃ逆じゃね
Avatar
!=か
Avatar
omochimetaru 11/1/2017 8:26 AM
それと is も使って
8:26 AM
継承関係をチェック
Avatar
fugaはHogeのサブクラスFugaね
Avatar
omochimetaru 11/1/2017 8:26 AM
それならそれだけでいい
Avatar
class Animal {} class Cat: Animal {} let cat = Cat() cat is Animal type(of: cat) === Animal.self こうかにゃ
Avatar
omochimetaru 11/1/2017 8:27 AM
ObjectiveCでabstract classを自力で作るときに init にもそれ入れておくと安全なやつね
Avatar
typeofとの比較ってイコール2こと3こで違いある?
Avatar
そもそもTypeを比較できるのを初めて知った
Avatar
omochimetaru 11/1/2017 8:28 AM
ルートメタクラスの定義って見れないよね?
Avatar
Mirrorで遡っていけばたどり着くんじゃない?
8:28 AM
SwiftObjectまではいけないけど
Avatar
omochimetaru 11/1/2017 8:28 AM
あー
Avatar
Mirror(reflecting: cat).superclassMirror!.subjectType これはAnimal.Typeだよ
Avatar
omochimetaru 11/1/2017 8:29 AM
func f<X: Equatable>(_ x: X) {} f(Int.self) error: TempGround.playground:2:3: error: argument type 'Int.Type' does not conform to expected type 'Equatable'
8:29 AM
Equatableじゃないけど == が定義されてそう
Avatar
メタメタしくなってきた
Avatar
また #swift#zatsu が伸びてるw
Avatar
class Animal {} class Cat: Animal {} class Robot {} func isSubclass<T>(_ object: Any, of: T.Type) -> Bool { return object is T && !(type(of: object) == T.self) } isSubclass(Cat(), of: Animal.self) isSubclass(Animal(), of: Animal.self) isSubclass(Robot(), of: Animal.self)
8:32 AM
あい。できあがり。
Avatar
非同期でselfを書き替えたい場合
これは DispatchQueue.main.asyncViewModel の外側でいい気も?
(edited)
🙆 1
Avatar
omochimetaru 11/1/2017 8:33 AM
isSubclassをどうやって壊そうか
Avatar
いじめだ
Avatar
omochimetaru 11/1/2017 8:34 AM
isSubclass("aaa", of: NSString.self) //true isSubclass("aaa" as NSString, of: String.self) // true
Avatar
数秒で破壊されてしまった
🙄 1
Avatar
Avatar
func isSubclass< U: AnyObject, T: AnyObject>(_ object: U, of: T.Type) -> Bool { return object is T && !(type(of: object) == T.self) } String fuck の対策を入れたぞ
Avatar
omochimetaru 11/1/2017 8:37 AM
たしかに値型はこれ使える必要無いね
Avatar
mutating以外で冪等性が壊れかねないものはclassのほうが良い
それってこのケースみたいに static にできるものがほとんどな気がする。冪等性が壊れたものを外部から持ち込まない限り mutating でないあることと冪等性が保たれることはほぼイコールだし。 @omochimetaru の言うように参照型の値を保持する場合くらい?
Avatar
やべえ会話が2スレッドになってる
Avatar
コツはAnyObjectだとautoboxingによって粉砕されるがU: AnyObjectだと通らないところ。
8:38 AM
swiftに退避しようね
Avatar
#swift#swift2 にw
Avatar
僕のやつはもう満足したけど続きある?w @tarunon @omochimetaru
Avatar
omochimetaru 11/1/2017 8:39 AM
無い
Avatar
ok
Avatar
#zatsu の説明に「 Swift の雑談は #swift でどうぞ」と書いておいた方が混乱がなさそう。
Avatar
omochimetaru 11/1/2017 8:40 AM
現状は雑談チャンネルがあったほうが投稿しやすいというメリットがある
Avatar
わしのさっきのやつみたいなのは #swift のほうがええんか?
Avatar
omochimetaru 11/1/2017 8:40 AM
そもそも zatsu を希望したのはもともとヒラリだったし俺にはわからん
8:40 AM
zatsuってなんだ
Avatar
厳密な雑
🤔 1
Avatar
別にあってもなくても困らないんだけどこういうときってどうするの〜だよね〜満足❗で終われる話だとおもったからざつにした
Avatar
omochimetaru 11/1/2017 8:41 AM
終われる話
おわったことない
Avatar
9割方 #swift 化してる気がw
Avatar
ひらりが満足してもガヤ勢が満足しないので…
Avatar
ガヤ勢の延長戦には僕だいたいついていけなくなってしまうので2次会は#swiftでどうぞって感じがするけど
Avatar
omochimetaru 11/1/2017 8:43 AM
二次会w
Avatar
#swift に障壁を感じてる人が多いってこと?
Avatar
omochimetaru 11/1/2017 8:44 AM
そういう事だと思っています > 障壁 (edited)
8:44 AM
障壁というか、それほどのネタでもない、みたいな。
8:45 AM
でも、周りが「いやコレは実は深い話があって・・・」みたいになっていきがち
Avatar
#swift に投げたほうがいいならそっちにするが、そっちで盛り上がった高度な議論に対するアンサーを僕は多分持たないので、話題だけ投げておいてほったらかしかよみたいになってしまうんだったらここに置いておこうかなという感じ
8:45 AM
それほどのネタでもないはまさにそう
Avatar
話題の提供者が答えを有している義務は無いという前提が共有できれば幸せっぽい
8:46 AM
そもそも話題にするのは答えが見えないからなんで
Avatar
うーん、 #swift は気軽な Swift の話題も含むイメージだったんだけどそう受け取られてないのか??
Avatar
わしがzatsuに書くときはその答えも別に僕は持ってないし欲してもいないことがほとんど
Avatar
norio_nomura 11/1/2017 8:46 AM
#swift#swift-2に「雑談OK」って書くしか
Avatar
@koher 気軽な場という印象はないっすw (edited)
Avatar
omochimetaru 11/1/2017 8:47 AM
(気軽な場にして行きたい)
Avatar
norio_nomura 11/1/2017 8:47 AM
#swift-zatsuを作るか
Avatar
もしくは #swift-gachi を作る?
Avatar
Avatar
ガチwww
Avatar
omochimetaru 11/1/2017 8:48 AM
これはあり > #swift-zatsu
Avatar
話題のステージ感がチャンネル名から読み取れるようになってたら良さそうです
Avatar
でも僕は大体雑談気分なんで #swift-zatsu に投稿しちゃいそうです・・・
Avatar
omochimetaru 11/1/2017 8:48 AM
整理することよりも投稿しやすくすることを重視したい、個人的には (edited)
Avatar
norio_nomura 11/1/2017 8:48 AM
#swift-zatsu大繁盛の未来が…
Avatar
公園でみんなわいわいしてるのが #swift-zatsu、戦士が殴り合うコロシアムが #swift-gachi
Avatar
↑の structclass かとか、普段の #swift でされてる話と変わらないような?🤔
Avatar
@hiragram まず認識のズレがあって、別に殴り合ってるつもりではなくほぼ雑談なのだという
8:50 AM
雑談のしきい値の問題で多分ガチとかザツとかそういう話じゃない
Avatar
まあドラゴン同士のじゃれ合いで島が一つなくなるみたいなやつはあるとおもう
Avatar
問題は #swift に雑談を投稿しづらいことなので #swift-zatsu はありな気がするけど、 #swift-zatsu が投稿しづらい場にならないように、投稿しづらさを感じてない人は #swift に投稿するとかでいいのかな??
Avatar
人間味でてきた
Avatar
もしくは #swift-3 くらいまで作ればどこか空いてて投稿しやすくなったりするのかな?
Avatar
norio_nomura 11/1/2017 8:52 AM
チャンネル名に?とか使えないのかな #swift? みたいな
Avatar
omochimetaru 11/1/2017 8:53 AM
英数字ハイフンアンスコだけ。今試した。 (edited)
😞 2
Avatar
#swift-tweet
8:53 AM
ひとりごと
Avatar
それか #swift の説明に、「雑談・質問・どんなくだらない内容でも OK 」とか付けるとか?
8:54 AM
@Biacco42 Swift Tweetsとややこしいw
Avatar
tweetup と名前がかぶってしまったな…
Avatar
omochimetaru 11/1/2017 8:57 AM
#swift-zatsu をつくってみました
👍 1
Avatar
前似たような話題でチャンネルが1個消滅した気がするんだけどなかったっけ
Avatar
omochimetaru 11/1/2017 8:58 AM
それがswift-zatsuやね
Avatar
ww
8:59 AM
歴史繰り返してた
Avatar
ドラゴン同士のじゃれ合いで消滅した島ってもしかして旧swift-zatsu...
🐉 4
Avatar
carthageで
4:35 PM
ビルドしたフレームがlipoのチェックでこけはじめた 環境何も変えてないのに・・・・・
4:35 PM
ハンマーで画面叩き割りたいくらいハマっている
Avatar
Kishikawa Katsumi 11/1/2017 4:35 PM
どうやったら再現できますか?
Avatar
オープンソースじゃないので,再現チェックを提供できない・・・・
4:36 PM
copy-frameworkでこけるんですよね・・・・・
4:37 PM
lipoで,ターゲットのアーキテクチャのバイナリがないとか,xcodeで実行中にバイナリが変更されたとかで文句言われる その都度,carthageとxcodeのキャッシュを全部削除して,carthageでupdateしなおしてるんですが・・・・・
4:38 PM
再現できそうな環境を作ることも考えて見ます.
Avatar
Kishikawa Katsumi 11/1/2017 4:38 PM
ログとか見せられませんか?
4:38 PM
ちょっとまって
Avatar
Kishikawa Katsumi 11/1/2017 4:39 PM
あと、それはAppStoreに申請するプロジェクトですか?
Avatar
まだ開発途中です
4:39 PM
ユニットテストが動かない
Avatar
Kishikawa Katsumi 11/1/2017 4:40 PM
とりあえずまだ先ならcopy-framework使わなければ回避できますよ。それが必要なのは申請のときだけなので。
Avatar
あーそうか
Avatar
今度はフレームワークがないとか言い出した・・・・なんじゃこれw
Avatar
Kishikawa Katsumi 11/1/2017 4:51 PM
エラーメッセージとかありませんか?
Avatar
/Users/sonson/code/2tch.swift/Carthage/Build/iOS/CommonCrypto.framework/Modules/module.modulemap:2:12: error: header '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h' not found header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h" ^ /Users/sonson/Library/Mobile Documents/com~apple~CloudDocs/code/2tch.swift/Core2ch/CommonCrypto.swift:10:8: error: could not build Objective-C module 'CommonCrypto' import CommonCrypto
4:53 PM
なぜか,フレームワークをデフォルトのシステムフレームのパスに探しに行ってる
Avatar
Kishikawa Katsumi 11/1/2017 4:54 PM
CommonCryptoはシステムに含まれているライブラリなのであってると思いますけど。
Avatar
あれ?
Avatar
Kishikawa Katsumi 11/1/2017 4:55 PM
CommonCryptoはCの静的ライブラリなので直接Swiftからインポートできないので、module.modulemapでモジュールを作ってて、おそらく /Users/sonson/code/2tch.swift/Carthage/Build/iOS/CommonCrypto.framework/Modules/module.modulemap ファイルにそのパスが書いてあると思います。
Avatar
そうそれ
4:56 PM
だ,それだ
4:56 PM
なんでや・・・・
4:56 PM
ちょっと一旦,お風呂はいって,寝るかも
4:56 PM
頭くらくらしてきた
4:56 PM
ログ整理して,相談させてください
Avatar
Kishikawa Katsumi 11/1/2017 4:57 PM
1つだけ、 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h はありますか?
Avatar
ある
4:57 PM
Avatar
Kishikawa Katsumi 11/1/2017 4:57 PM
なるほど。謎ですね。
Avatar
うわーん,もう一回ビルドした違うエラーになったw
4:58 PM
今度は,carthage を--no-use-binariesしてなかったパターンだ
4:59 PM
Module compiled with Swift 4.0 cannot be imported in Swift 4.0.2: /Users/sonson/code/2tch.swift/Carthage/Build/iOS/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64.swiftmodule
Avatar
Kishikawa Katsumi 11/1/2017 5:00 PM
それはソースからビルドすればOK。たぶん環境問題っぽいのでリモートで解決するのは大変そう。プロジェクト送ってくれたらみますよ。私が見るぶんには問題なさそうなプロジェクトだし。
Avatar
thx
5:02 PM
repositoryの権限を一時的に開示しようか
Avatar
Kishikawa Katsumi 11/1/2017 5:02 PM
手段はなんでも。
Avatar
送った
5:03 PM
こいつのdevelopぶらんち
5:04 PM
ただ,carthageのパスをソースコード内にしていない ことにチュウしてくだされ
Avatar
Kishikawa Katsumi 11/1/2017 5:05 PM
わかりました。とりあえずクローンしてビルドしてみます。
5:06 PM
carthageのパスをソースコード内にしていない
5:06 PM
というのは?
Avatar
icloud desktopにソース置いて作業してる
5:07 PM
Carthageの中にあるバイナリファイルをそこに置いとくと,なぜか知らないけど,作業中にバイナリが壊れて,同期するたんびに別のマシンでcarthage updateをかけないといけないという問題に・・・・・
5:07 PM