Guild icon
swift-developers-japan
main / swift-zatsu
Avatar
Xcode 9.1で4.0.2がリリースされたけど、リポジトリには4.0.1, 4.0.2のリリースタグが付かないですね。 swift-4.0-branch にはバージョン変更入ってるのに。 https://github.com/apple/swift/compare/swift-4.0-RELEASE...swift-4.0-branch
swift - The Swift Programming Language
Avatar
swift-4.0.2-RELEASE来てた。
Avatar
StringStringProtocol だけど NumberNumeric なんですね… https://developer.apple.com/documentation/swift/numeric
Avatar
omochimetaru 11/6/2017 8:49 AM
XxxProtocol は Xxx をそのままプロトコル化したやつで
8:49 AM
Numeric はまた違うんじゃ?
Avatar
なんか微妙に気持ち悪いというかなんというか…?
Avatar
omochimetaru 11/6/2017 8:50 AM
Numericはもととなる型があるわけじゃなくてそれ単体で設計された何かなのでは
Avatar
StringProtocol 以外の XxxProtocol って何があります?
Avatar
NSObjectProtocol
Avatar
Avatar
omochimetaru 11/6/2017 8:52 AM
(早押しクイズかな
Avatar
一番有名で一番邪悪
Avatar
そw
Avatar
NSObjectProtocolこれ入れるとヘッダーには書いてないけど暗黙的にclass扱いになってる気がするんだよね
Avatar
ん?
Avatar
IteratorProtocol 普通にわすれてたw NSObjectProtocol なんてあるのかぁ(白目
Avatar
@tarunon https://developer.apple.com/documentation/objectivec/nsobjectprotocol
An object that conforms to this protocol can be considered a first-class object. Such an object can be asked about its:
Class, and the place of its class in the inheritance hierarchy. Conformance to protocols. Ability to respond to a particular message. The Cocoa root class NSObject adopts this protocol, so all objects inheriting from NSObject have the features described by this protocol.
8:54 AM
クラスとして振る舞うのに必要な要素がNSObjectProtocolに入ってる、って感じかしら
Avatar
んにゃ、NSObjectとして振る舞う、だね
Avatar
ああ、そうね
Avatar
omochimetaru 11/6/2017 8:55 AM
なんちゃらProtocol、意外と無いな
Avatar
暗黙的にclass扱いってどういうことだろう
Avatar
ヘッダーでは public protocol NSObjectProtocol { ってなってるのに、実際の動きは public protocol NSObjectProtocol: class { なんじゃあないのっていうのが各所で浮き出てくる (edited)
Avatar
omochimetaru 11/6/2017 8:56 AM
↑ mutating func とか絡めてみれば確認できそう
Avatar
なお
Avatar
@tarunon 浮き出てくるっていうのは実行時の振る舞いの話?
8:57 AM
コンパイラの振る舞い
Avatar
ああー
Avatar
omochimetaru 11/6/2017 8:57 AM
IteratorProtocol は、 Sequence.Iterator (associatedtype) との Iterator っていう 名前衝突を避けたくてそうなった感があるけどね・・・
Avatar
それは :class を書いたときと同じやつか
Avatar
そう、そうであるべきなのに書いてなくて卑怯だな~~ってなる
Avatar
Kishikawa Katsumi 11/6/2017 8:57 AM
NSObjectProtocolはObjCのプロトコルだからじゃないかな。
Avatar
omochimetaru 11/6/2017 8:57 AM
あ〜
Avatar
UITableVIewDelegateとかも確かそうじゃなかった?
8:58 AM
classって書いてあったっけあれ
Avatar
@objcつけたらclass矯正されるのと同じ感じですかね
Avatar
Kishikawa Katsumi 11/6/2017 8:58 AM
Swift以前からある、
Avatar
omochimetaru 11/6/2017 8:58 AM
objc側からimportされてるプロトコルは全部そうなのか。
Avatar
@objc明示ルール出来たのにNSObjectProtocolはそうじゃないっていうのもね
8:58 AM
卑怯ポイント高い
Avatar
UITableViewDelegateはNSObjectProtocolを継承(?)してた。
Avatar
Basic Arithmetic、日本語でなんてんだ
Avatar
四則演算?
9:01 AM
違うか?
Avatar
omochimetaru 11/6/2017 9:01 AM
> Weblio専門用語対訳辞書での「basic arithmetic operations」の意味 Basic arithmetic operations 四則演算
Avatar
💪 ('ω' 💪 ) (edited)
😯 1
👏 1
Avatar
あー
9:03 AM
継承はExtends、protocolの場合はどれだと思ってたら違うところ見てた。> Inherits こっちかな
Avatar
継承はinheritだね
Avatar
あれれ
Avatar
extendはどっちかというと拡張
9:04 AM
= extension
Avatar
protocolはconformじゃない?
Avatar
英語力の低さが露呈している
Avatar
omochimetaru 11/6/2017 9:04 AM
Relationships Inherits From Equatable, ExpressibleByIntegerLiteral Inherited By BinaryInteger, SignedNumeric
Avatar
プロトコルも継承でいいんでねたぶん
Avatar
omochimetaru 11/6/2017 9:04 AM
ドキュメント的には protocol のページだと inherit
9:05 AM
満たしてるProtocolについては conforms だったと思う
Avatar
プロトコルAと実装Bの関係がB conforms to AでプロトコルAの性質を引き継ぐプロトコルBはB inherits from Aのイメージだなあ (edited)
Avatar
protocolが別のprotocolを継承している場合は inherits、何かの型がprotocolに準拠している場合は conforms、多分これで問題ないかと…?
Avatar
Kishikawa Katsumi 11/6/2017 9:06 AM
Inherit, conform, extend, adoptのどれも同じ意味で使われることありますよ。アップルのドキュメント
Avatar
キビシー
Avatar
Kishikawa Katsumi 11/6/2017 9:07 AM
たぶん決まりはない、、、あるかもしれないけど書く人で変わるくらいのものじゃないかな。
Avatar
omochimetaru 11/6/2017 9:07 AM
https://developer.apple.com/documentation/swift/int あー、僕が言っていたのは文章中の英単語のことじゃなくて、↑の形式のリファレンスの、一番下の方にある機械的に書かれてるっぽいやつのことです
9:07 AM
Relationships セクションの中のサブセクションのタイトル。 (edited)
Avatar
Int は型だから protocolConforms To ですね
Avatar
omochimetaru 11/6/2017 9:08 AM
Conforms To の逆参照が Adopted From として掲載されてるっぽい
Avatar
意味的にもそれがしっくりくるね
Avatar
omochimetaru 11/6/2017 9:09 AM
protocol 同士は Inherited From と Inherited To (edited)
Avatar
Inherits from ですね
Avatar
C#のAbstract Class欲しいなぁと改めて思った https://qiita.com/taketo1024/items/71e3272211f08d7e0cde
社内の「Scala 勉強会」で Phantom Type (幽霊型) という厨二心をくすぐる感じのデザインパターンを教えてもらったので、同じことを Swift でもやってみました。 インスタンスの状態を変数ではなく **型パ...
9:44 AM
この例、Statusabstract class で定義できたらなぁとすごい思う
Avatar
omochimetaru 11/7/2017 9:45 AM
あーなるほど。
9:45 AM
この場合は、 依存型が入ってくれれば、 Status を enum にすればいいですけどね〜
Avatar
Javaのあの依存型ですか?
Avatar
omochimetaru 11/7/2017 9:46 AM
依存型は型パラメータに値が書けるやつです
9:47 AM
例えば・・・ struct StackArray<value Size: Int> { ... }
9:47 AM
みたいなノリ
Avatar
stateパターンというか列挙されたstrategyパターンというか。

環境

  • xcode 9.0
  • swift4 ## 問題

swiftのenumは要素ごとに振る舞いを定義できない

ひたすらswitch文を使...
Avatar
omochimetaru 11/7/2017 9:47 AM
var a = StackArray<2>() a.0 // ok a.1 // ok a.2 // compile error (edited)
Avatar
StackArray 欲しいw
Avatar
omochimetaru 11/7/2017 9:48 AM
↑のtaketoさんの記事なら、 enum Status { case NotReady case Ready } class Something<value T: Status> { /*中身は同じでOK*/ } (edited)
Avatar
編集リクエストを出しては?
Avatar
omochimetaru 11/7/2017 9:50 AM
いまのSwiftには無いですよ
Avatar
ああ、後ろが value T: Status になってるのか。 (edited)
Avatar
Statusprotocol じゃダメなんだっけ? sealed にできない?
Avatar
omochimetaru 11/7/2017 9:52 AM
↑最近のスレ
9:52 AM
protocol だとユーザが追加した値が入れられちゃいますね あ、abstract class でもその点がダメだな
9:52 AM
- Now you can define a “dependent type”, for example ModuloInteger<P>, where P is the integer value that defines the type. - Like this, you’ll have: —> MI<2>: {0, 1}, where 1 + 1 = 0. —> MI<3>: {0, 1, 2}, where 1 + 1 = 2, and 2 • 2 = 1
Avatar
Statusprotocol でもダメってことはないですが、Something<NotReady>.createInstance() で書かないといけないのがイケてないですね
Avatar
omochimetaru 11/7/2017 9:53 AM
↑ P で割ったあまり を表す型 ModuloInteger<P> の例 、型パラのところに2 とか 3とかの 「値」が入る
Avatar
Vector<2> とか Matrix<4, 4> とかやりたい。
Avatar
omochimetaru 11/7/2017 9:53 AM
ですね〜〜〜〜
Avatar
むしろなんでないんだろって思う
9:54 AM
そっちの方がメモリ管理も楽そうなのにな
9:55 AM
reserveCapacity とか考えなくて済む
Avatar
omochimetaru 11/7/2017 9:56 AM
単に優先度っぽいですけどね、具体的なコアチームからの反論はみてない気がする
Avatar
Generics Manifesto にもないよね?当分( Swift 5, 6 あたりで)はなさそうな気が。
9:59 AM
あった!!
10:00 AM
Currently, Swift's generic parameters are always types. One could imagine allowing generic parameters that are values, e.g.,
10:00 AM
struct MultiArray<T, let Dimensions: Int> { // specify the number of dimensions to the array subscript (indices: Int...) -> T { get { require(indices.count == Dimensions) // ... } } (edited)
10:00 AM
例もまさに Vector<N> ですね。
10:01 AM
MayBe セクションだから
10:01 AM
ワンチャンあるで〜
Avatar
てか、 Rust Like な Generic Protocol についても書いてあるな
10:03 AM
対応見込みは Unlikly になっている
10:04 AM
struct Real { ... } extension Real : ConstructibleFrom<Float> { init(_ value: Float) { ... } } extension Real : ConstructibleFrom<Double> { init(_ value: Double) { ... } } サンプルも Rust の From trait と似てる
Avatar
正直長すぎてどの項目がどの項目のサブ項目なのかわからないしOutline機能欲しい…
10:06 AM
せめてFold機能欲しい
Avatar
たしかに。限界を感じます
Avatar
上で出て来たenumstateパターン、無理やりRawValueに振る舞いを実装して見た https://gist.github.com/norio-nomura/65db97c4786851bc368a8d68834fb31b (edited)
Avatar
https://qiita.com/taketo1024/items/71e3272211f08d7e0cde 例のこのPhantom Typeのやつ、extensionで where T: Ready で書くと問題ないけど、where T == Ready で書くと Something.createInstance() の直後でも変換の補完で .shout() が出るのなんで?(もちろんコンパイルエラーにはなるけど…)
社内の「Scala 勉強会」で Phantom Type (幽霊型) という厨二心をくすぐる感じのデザインパターンを教えてもらったので、同じことを Swift でもやってみました。 インスタンスの状態を変数ではなく **型パ...
1:33 PM
これのせいで微妙に辛いのはStatusがstructで作りにくい…
Avatar
@omochimetaru おもちのgysb、他のファイルにあるSwiftのメソッドとか呼べる?
Avatar
omochimetaru 11/8/2017 3:16 AM
呼べません
3:16 AM
呼びたい?
3:17 AM
いまは変換して作られたswiftコードを $ swift generate.swift で実行しているだけなんや。
Avatar
僕が普段gyb使うケース、gybのテンプレートからpythonで書いたSwaggerのyamlのパーサーをimportして使ってるので、それができれば嬉しみって感じ
Avatar
omochimetaru 11/8/2017 3:19 AM
そもそもswiftには隣においてあるファイルを読み込む機能とかないから
3:19 AM
どうやるのがいいか悩むね。
Avatar
インタプリタ実行じゃ無理か
Avatar
omochimetaru 11/8/2017 3:19 AM
gysb側で % include "./hoge.swift" みたいな機能を追加して
Avatar
無理やり展開する?
Avatar
omochimetaru 11/8/2017 3:20 AM
テキストとしてそのままぶち込むのはどうか
3:20 AM
古き良きプリプロセッサ
Avatar
なんとなく動きそうな感じはする
Avatar
omochimetaru 11/8/2017 3:20 AM
issueにしとく いまちょっとパーサーを直さなきゃいけないことに気がついたからあとまわし
3:21 AM
わしもあとでgysbのコードちゃんとよむね
Avatar
omochimetaru 11/8/2017 3:21 AM
いま最新コミット完全にぶっ壊れてるから一個前を見てw
Avatar
Avatar
omochimetaru 11/8/2017 3:21 AM
ちょっと保存するのにうっかりmasterにやっちまった
Avatar
0.1.0のタグ打とう
Avatar
omochimetaru 11/8/2017 3:21 AM
たしかに。
3:22 AM
うった
Avatar
omochimetaru 11/8/2017 3:59 AM
あれ、swift runが壊れた。
Avatar
omochimetaru 11/8/2017 4:14 AM
0.2.0 できた。
4:15 AM
%{ let intTypes = [8,16,32,64] }% % for intType in intTypes { % for sign in ["", "U"] { /// Extension that adds a few additional functionalities to ${sign}Int${intType} extension ${sign}Int${intType} { /// Returns a ${sign}Int${intType} with all ones % if sign == "" { public static var allOnes: Int${intType} { return Int${intType}(bitPattern: UInt${intType}.max) } % } else { public static var allOnes: UInt${intType} { return UInt${intType}.max } % } } % } % }
Avatar
すぐ API のミスに気づいたりするから、とりあえず -alpha とか -beta つけるのオススメ。
Avatar
omochimetaru 11/8/2017 4:16 AM
↑これ綺麗に出力できる モアイさんの例↓ http://moapp.hateblo.jp/entry/2017/06/30/210636
Swift gybの環境構築 ふとSwiftのgybが気になったので環境構築を試して見ました gybとは Swift言語開発の副産物のメタプログラミングツールgybがとても良い— おもちメタル (@omochimetaru) 2017年6月30日 gybは「Generate Your Boilerplate」の略称みたいです(gyb --helpより) 具体的に何かと言うと、Swiftの公式リポジトリの中でSwiftコードの自動生成に使われているPython製のテンプレートエンジンになります gybを導入する qiita.com というわけで、こちらを参考に環境構築して見ました まずgyb自体…
4:17 AM
ふむう > alpha
Avatar
gyb よく知らないけれどマクロ的なやつなのか
Avatar
テンプレートエンジン?
Avatar
omochimetaru 11/8/2017 4:17 AM
↑のモアイさんの記事読むと良いよ
4:18 AM
func readToken() -> Optional<Token> を func readToken() -> Token に変えて、 enum Token に case end を足したらすごく良くなった https://github.com/omochi/gysb/blob/master/Sources/gysb/Token.swift#L18
gysb - Generate your swifty boilerplate
Avatar
よんだ
4:19 AM
なるほど
Avatar
omochimetaru 11/8/2017 4:20 AM
とても良いツールなんだけど
4:20 AM
pythonを書かされるという致命的な問題点があるので
4:20 AM
それを解決したのが拙作のgysbですw
Avatar
なるほどアツい
Avatar
ただ、 Python なのも良いところがあって、 Swift のコードの合間に書かれているときはぱっと見で Python の方が区別しやすいかも?
Avatar
脳のスイッチングコストは結構でかいです
Avatar
omochimetaru 11/8/2017 5:26 AM
まあ僕はガチャガチャ複数言語書くの慣れてるけど
5:26 AM
ひらりとかそもそもパイソン書いたことなかったよね。
Avatar
うん
5:27 AM
gybのために嫌々始めた
Avatar
omochimetaru 11/8/2017 5:27 AM
Avatar
確かに Python を知らない人にとってはハードルが高いな。
5:29 AM
しかも end とか Python じゃないし。
Avatar
イニシャライザちゃんと書かないとプロパティがあったりなかったりするのすごくキツイんだけど何か間違ってるのかもしれない
Avatar
omochimetaru 11/8/2017 5:31 AM
pythonになってるメリットはwindowsとかでも動くことだと思います
Avatar
まあ、 Swift が動かない環境で Swift で書くツールを使おうとしないでしょう・・・。
Avatar
omochimetaru 11/8/2017 5:33 AM
swiftコンパイラ本体の開発は まだ動いてない環境でswiftを動かすタスクだから
5:33 AM
swiftに依存しないでswiftを作らないといけないけど
5:33 AM
たしかに、コンパイラじゃなくてswiftアプリケーションを作る場面なら
5:33 AM
swiftに依存してても問題ないですねw
Avatar
コンパイラ開発であっても、プログラミング言語はある程度固まってきたらセルフホスティングになることも多いし、 gyb レベルならもう Swift でいい気がする。 (edited)
Avatar
omochimetaru 11/8/2017 5:42 AM
セルフホスティングになった言語って
5:42 AM
まだコンパイラをビルドしてない新しい環境に対応するときはどうすんだろ
5:43 AM
昔のC++の実装で、古いバージョンをコンパイルしてから、 その古いバージョンを使って最新のバージョンをセルフコンパイルする?
Avatar
一回でいけるのかな
Avatar
yutailang0119 11/9/2017 1:17 AM
セルフホスティングになると何がメリットなんだろう、コンパイラもSwiftで書かれてるからメンテしやすいとか? Goがセルフホスティングになった時に、話題にはなっていたけど、いまいち理解できてない
Avatar
omochimetaru 11/9/2017 2:13 AM
その言語が、コンパイラを書くのに向いてるのであれば、コンパイラの保守性が上がると思います でも半分はロマンな気がする・・・
Avatar
Kishikawa Katsumi 11/9/2017 2:25 AM
ロマン いつかはセルフホスティングみたいなのはある気がする。
Avatar
この言語自身で効率的にコンパイラを書け、そのコンパイラのパフォーマンスも良いのであれば、その言語のその分野での有効性を示せるとは思います。
2:47 AM
「その分野での」と書きましたが、コンパイラのコードは複雑なのでそれがキレイに書けるのは言語の記述能力の高さを示せそうだし、コンパイラにはパフォーマンスも求められるので、ローレベルからハイレベルまで幅広い範囲で有効性を示そうな気がします。そして、 Swift はまさにそれに向いている言語だと思うので、どこかの段階でセルフホスティングになってほしいですねぇ。まだ時期尚早だとは思いますが。
👀 1
Avatar
omochimetaru 11/9/2017 2:51 AM
Swiftコンパイラのアーキテクチャでいうと LLVM をライブラリとしてガシガシに使っているから
2:51 AM
C++ Interop が実現されるか、もしくは、
2:52 AM
LLVMをSwift化するか・・・
Avatar
https://github.com/trill-lang/LLVMSwift 完全ではないけど、LLVM ラッパ的なプロジェクトはありまっせ。 (edited)
LLVMSwift - A Swift wrapper for the LLVM C API (version 5.0)
Avatar
omochimetaru 11/9/2017 3:10 AM
マジか
3:10 AM
Authors Harlan Haskins (@harlanhaskins) Robert Widmann (@CodaFi)
3:10 AM
コダフィ氏だ
Avatar
ちゃんと SwiftPM 準拠だ。
Avatar
norio_nomura 11/9/2017 4:01 AM
Swift 4.0.2に-swift-version 3を渡してるかどうかは #if swift(>=3.2.2) で判定。 (edited)
Avatar
yutailang0119 11/9/2017 5:37 AM
なるほどw > ロマン
Avatar
https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20171106/041072.html
FWIW, I’m getting optimistic about moving to a forum soon.
Ted から久々にフォーラム移行についての言及。まだまだ曖昧。
Avatar
omochimetaru 11/9/2017 7:29 AM
早くしてほしい・・・ ログが調べにくいせいからか話題がループしてるのを感じる
7:34 AM
@hiragram include実装したよ
Avatar
おっ
7:35 AM
@omochimetaru SwiftってJSONは読めるけどYAMLは読めないよね確か
Avatar
omochimetaru 11/9/2017 7:35 AM
なんのこっちゃ
7:36 AM
FoundationにYAMLのなんかがあるかってこと?
Avatar
わしのgybのユースケースでgysbに置き換えるならgysbファイルからincludeした先でSwaggerのymlをパースする必要がある
Avatar
omochimetaru 11/9/2017 7:38 AM
ンゴ・・・
7:39 AM
yamlのライブラリをソースとして隣においておいて
7:40 AM
元のジェネレータで全部includeする形で対応になる
Avatar
なるほろ
7:40 AM
まあSwaggerのymlをjsonに変換しちゃうのもあり
Avatar
omochimetaru 11/9/2017 7:40 AM
それだったらincludeいらないやんけ
Avatar
いやいるよ
Avatar
omochimetaru 11/9/2017 7:41 AM
なんでだっけ
Avatar
jsonをdictionaryにしたとしてそれをそのままテンプレート側で値取ってくるのしんどいでしょ
Avatar
omochimetaru 11/9/2017 7:41 AM
ああ、jsonを取り回すユーティリティがほしいのか。
Avatar
そう
Avatar
omochimetaru 11/9/2017 7:41 AM
理解
Avatar
omochimetaru 11/9/2017 9:04 AM
@hiragram
Avatar
はーい
Avatar
omochimetaru 11/9/2017 9:04 AM
gysb - Generate your swifty boilerplate
9:04 AM
[omochi@omochi-iMac gysb (master *+=)]$ cat Examples/include.swift.gysb %! include_code("libs/*.swift") % aaa=${aaa()} bbb=${bbb()} [omochi@omochi-iMac gysb (master *+=)]$ swift run gysb Examples/include.swift.gysb aaa=999 bbb=777
Avatar
%!
9:05 AM
メタofメタ
Avatar
omochimetaru 11/9/2017 9:05 AM
%! と include_code を追加したのでなんとかなる
Avatar
良い
Avatar
omochimetaru 11/9/2017 9:05 AM
ワイルドカード対応したから
Avatar
おおっ
Avatar
omochimetaru 11/9/2017 9:05 AM
あとは試してみて
Avatar
master *+= ってなんや💢て思ったけどプロンプトだった
Avatar
omochimetaru 11/9/2017 9:06 AM
ほんとだw
9:06 AM
汚いスクショになってしまった。
Avatar
norio_nomura 11/9/2017 9:06 AM
ああ、libYAMLを使ってるYamsは使えなさげ。
Avatar
omochimetaru 11/9/2017 9:06 AM
swiftソースをテキスト展開してるだけなので
9:06 AM
リンクが必要だとダメですね・・・
9:07 AM
%! swift_package("Package.swift") とか定義しておくと SPM の executable として実行するような機能を作ったら対応できそう。
Avatar
%{...}の中にimportは書けないのか
Avatar
どんどん大掛かりになってる・・・
Avatar
omochimetaru 11/9/2017 9:10 AM
%{...}の中にimportは書けないのか
Swiftのimportは書けるよ。
9:10 AM
import Foundation とかはできる。
9:10 AM
swift コマンドで何もしないでも import できるものはimportできるってこと
9:10 AM
[omochi@omochi-iMac gysb (master=)]$ swift run gysb --compile Examples/include.swift.gysb func write(_ s: String) { print(s, terminator: "") } func aaa() -> Int { return 999 } func bbb() -> Int { return 777 } write("aaa=") write(String(describing: aaa())) write("\n") write("bbb=") write(String(describing: bbb())) write("\n")
9:11 AM
swiftc みたいに、途中の段階で実行を止める機能を作ったので
9:11 AM
たのしいです
9:11 AM
--parse , --macro , --compile , --render と4ステージあります
9:14 AM
swift コマンドの -Xlinker だけ指定できれば libYAML はいけるかな・・・?
Avatar
norio_nomura 11/9/2017 9:14 AM
gysbがライブラリになっていて、.gysbインプットから.swiftStringを作れるAPIがあると、swift testの度に.swiftを生成する事ができる様になります。 (edited)
Avatar
omochimetaru 11/9/2017 9:14 AM
MSVCがソースファイルのなかに #comment(lib, "GL.h") ってかいてリンク指定できるみたいな。 (edited)
Avatar
norio_nomura 11/9/2017 9:15 AM
Yamsは*.cをパッケージ内に持ってて、SwiftPMにClangモジュールとしてビルドしてもらってます。
Avatar
omochimetaru 11/9/2017 9:16 AM
いまここが、コンパイラのstdout / stderr を、そのまま垂れ流しにしちゃっているので
9:16 AM
ここをキャプチャしてやれば
.gysbインプットから.swiftのStringを作れるAPI
もいけそうです
9:17 AM
あー、Cソースも持っているのか。それはもうSPMとして全体を実行する以外無理そうだなあ
9:17 AM
ひらりの要望だけで無限にシステムが複雑になったw
Avatar
norio_nomura 11/9/2017 9:18 AM
w
Avatar
いいぞいいぞ〜❗
Avatar
omochimetaru 11/9/2017 9:18 AM
効率悪いのが、一個のテンプレートの処理のたびに spm package つくることになっちゃって
9:18 AM
依存ライブラリを取り直しまくることになるんだよなあ
9:18 AM
いまは トップレベルで printするSwiftソースとしてコンパイルしているけど
9:18 AM
ひとつのファイルの処理結果を得る関数をもったSwiftソースとしてコンパイルして
9:19 AM
入力のテンプレートファイル全部を関数としてまとめて一個のバイナリにした上で
9:19 AM
それぞれ出力する、みたいな形にすると、それ系をまとめられるが・・・・
Avatar
norio_nomura 11/9/2017 9:22 AM
Xcodeで使う分にはRun Script Phaseを使えるからCLIでいいけど、SwiftPMはビルドプロセスに入れられないのがネックだね。
Avatar
omochimetaru 11/9/2017 9:23 AM
あ、そもそも、 gysb を SwiftPM のビルドに差し込めない問題の話ですか。
9:24 AM
そこはもう gysb と 変換先の swift を両方コミットしてもらうしかないっすねえ・・・
9:25 AM
まあそれは今のgyb使ってるやり方でも同じことで(Vapor Cloudにデプロイするのに vapor build の手前に処理を差し込む方法ないのって問い合わせたらねえって言われた (edited)
Avatar
omochimetaru 11/9/2017 9:27 AM
vapor build ってコマンドで全てを発火するの?
Avatar
ん?
9:28 AM
vapor cloud deploy するとリモートでチェックアウトして vapor build が動くんだけどその手前でコードジェネレータ動かしてもらわないと成果物コミットしてないから当然コンパイル通らない
Avatar
omochimetaru 11/9/2017 9:28 AM
んーっと vapor build は 内部で swift build をする、みたいな感じかなと
Avatar
そう
Avatar
omochimetaru 11/9/2017 9:28 AM
あー リモートでデプロイするためのコマンドが手前側にあって
9:28 AM
リモートはvapor build をするのか
Avatar
そうそう
Avatar
omochimetaru 11/9/2017 9:28 AM
うわ〜 それだと何もさせないね
9:29 AM
せめてローカルのvapor build ならオレオレbuildを叩くようにすれば手前にはさめたけど
9:29 AM
向こう側はどうしようもなさ
Avatar
コミットするしかないんやろかとなって一旦デプロイ周りは棚上げしといた
Avatar
omochimetaru 11/9/2017 9:29 AM
でもそれだと、CSS Spriteとか
Avatar
VaporのSlackで聞いたら「今は無いけど将来やりたいねそれ」って言ってた
Avatar
omochimetaru 11/9/2017 9:29 AM
なんか他にもいろんな前処理したいときにできなくね?
9:29 AM
あ、そういうのはコンパイル後だからなんとかなるのかな?
Avatar
そもVaporアプリ自体のコンパイルに必要でなければあとでも良い気がする。
Avatar
omochimetaru 11/9/2017 9:30 AM
リソースはvapor buildとは別に用意したらいいのか。
Avatar
そね
10:53 AM
テストできるようになりました。
👍 1
🎊 1
Avatar
環境変数を使ってPackage.swiftの内容を切り替え、GYSB=1 swift testでコード生成し、swift testで生成したコードを利用する方法を思いついた。
Avatar
あー たしかにテスト実行中にソースを書き出せば、、、
Avatar
テストターゲットを生成用と利用用に分ける方法も考えたけど、swift test --filter Generateとテストするモジュールを制限しても全てをビルドしようとするから、未生成なコードに依存する部分がビルド出来なくてダメだった。
Avatar
そうか、テストターゲットじゃないと、実行ができないのか
Avatar
// swift-tools-version:4.0 import PackageDescription import Foundation let package: Package if ProcessInfo.processInfo.environment["GYSB"] != nil { package = Package( name: "Generate", dependencies: [ .package(url: "https://github.com/omochi/gysb.git", .branch("master")), ], targets: [ .testTarget(name: "Generate", dependencies: ["GysbKit"], path: "Tests/GenerateTests") ] ) } else { package = Package( name: "Example", products: [ .library(name: "Example", targets: ["Example"]), .library(name: "Generated", targets: ["Generated"]), ], targets: [ .target(name: "Example", dependencies: ["Generated"]), .target(name: "Generated", dependencies: []), .testTarget(name: "ExampleTests", dependencies: ["Example"]), ] ) }
11:19 AM
$ tree . ├── Package.resolved ├── Package.swift ├── README.md ├── Sources │   ├── Example │   │   └── BuildPhase.swift │   └── Generated │   └── vector.swift └── Tests ├── ExampleTests │   └── ExampleTests.swift ├── GenerateTests │   └── GenerateVectorTests.swift └── LinuxMain.swift こんな感じ (edited)
11:22 AM
あ、テンプレートを別の場所に置かないとダメだ。
Avatar
norio_nomura 11/9/2017 1:31 PM
Package.swiftYamsをビルドして、それを.gysbの中でインポートしようとしてるのだけど、うまくいかないな。
1:32 PM
Test Case '-[GysbWithYamsTests.GysbWithYamsTests testExample]' started. process execution failure path=[/usr/bin/swift] arg[0]=[/var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_49IokLMk.swift] arg[1]=[-L] arg[2]=[/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug] statusCode=[1] stderr= /var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_49IokLMk.swift:4:9: error: no such module 'Yams' import Yams ^ Test Case '-[GysbWithYamsTests.GysbWithYamsTests testExample]' passed (0.438 seconds).
Avatar
omochimetaru 11/9/2017 1:32 PM
$ /usr/bin/swift /var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_49IokLMk.swift
1:32 PM
↑これを実行しているだけだから、フレームワークサーチパス的なところで
1:33 PM
ビルド済みのYamsが見えていないと
1:33 PM
見つけられないです
Avatar
norio_nomura 11/9/2017 1:33 PM
とりあえずこんな感じで起動してます。 return try execCapture(path: swiftPath, arguments: [path, "-L", "/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug"]) (edited)
Avatar
omochimetaru 11/9/2017 1:34 PM
ああなるほど。
1:34 PM
ほんとだ、よくみてなかった。
1:34 PM
とりあえず、直接swiftコマンドで実行できるコマンドを
1:34 PM
見つけるのが良さそう
1:34 PM
-F <value> Add directory to framework search path
1:35 PM
.frameworkならこっちですよ。
1:35 PM
static libarryなら、 -L <value> Add directory to library link search path -l<value> Specifies a library which should be linked against これらの併用がひつよう
1:35 PM
フレームワークの場合に -l も必要だったかはよくわからない
Avatar
norio_nomura 11/9/2017 1:45 PM
-I…,-L…,-F…つけても、YamsのPackage.swiftでライブラリtypeを.static.dynamicにして-lYamsつけてもダメだ。 path=[/usr/bin/swift] arg[0]=[/var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_NwwoI7hu.swift] arg[1]=[-I] arg[2]=[/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug] arg[3]=[-F] arg[4]=[/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug] arg[5]=[-L] arg[6]=[/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug] arg[7]=[-lYams] statusCode=[1] stderr= /var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_NwwoI7hu.swift:4:9: error: no such module 'Yams' import Yams (edited)
Avatar
omochimetaru 11/9/2017 1:46 PM
うへえ
Avatar
norio_nomura 11/9/2017 1:47 PM
ああ、ソースコードのパスを引数の最後に持ってきたら通った。
Avatar
omochimetaru 11/9/2017 1:48 PM
おお。
Avatar
norio_nomura 11/9/2017 1:59 PM
Yamsのlibrary typeを.dynamicにして、以下のオプションをswiftに渡したらいけた。 return try execCapture(path: swiftPath, arguments: [ "-I", "/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug", "-L", "/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug", "-lYams", path, ])
Avatar
omochimetaru 11/9/2017 1:59 PM
-I と -L は両方そこでいいんですね
Avatar
norio_nomura 11/9/2017 2:00 PM
テンプレートはこんな感じ % import Foundation % import Yams % guard let yaml = try Yams.compose(yaml: String(contentsOf: URL(fileURLWithPath: "TestResources/vector/vector.yml"))) else { fatalError() } % let vars = yaml.array().flatMap { $0.string } % for n in 2...4 { struct Vector${n} { % for i in 0..<n { var ${vars[i]}: Float % } } % }
Avatar
omochimetaru 11/9/2017 2:00 PM
これは、アプリのプロジェクトのPackage.swiftで、Yamsとgysbの両方を依存させていて、 swift run gysb が通る状態?
Avatar
norio_nomura 11/9/2017 2:01 PM
// swift-tools-version:4.0 import PackageDescription let package = Package( name: "GysbWithYams", dependencies: [ .package(url: "https://github.com/omochi/gysb.git", .branch("master")), .package(url: "https://github.com/jpsim/Yams.git", .branch("master")), ], targets: [ .testTarget( name: "GysbWithYamsTests", dependencies: ["GysbKit", "Yams"]), ] ) class GysbWithYamsTests: XCTestCase { func testExample() { do { let driver = Driver.init(path: "TestResources/vector/vector.swift.gyb") let actual = try driver.render(to: .render) print(actual) } catch { print(error) } } static var allTests = [ ("testExample", testExample), ] } (edited)
Avatar
omochimetaru 11/9/2017 2:02 PM
なるほど
Avatar
norio_nomura 11/9/2017 2:07 PM
SwiftPMはライブラリプロダクトのtypeが未指定でもリンクしてくれますが、この使い方の場合、libYams.alibYams.dylibが無いとダメですね。
2:08 PM
type: .staticでも本当はいけると思うのですが、swiftcがクラッシュしてしまいダメでしたが。
Avatar
omochimetaru 11/9/2017 2:08 PM
なるほど〜
2:09 PM
SwiftPMのデフォルトは .static なんですか?
Avatar
norio_nomura 11/9/2017 2:10 PM
Swift 4からデフォルトではライブラリを生成しなくなりました。
Avatar
omochimetaru 11/9/2017 2:10 PM
ほう
Avatar
norio_nomura 11/9/2017 2:10 PM
ライブラリを構成する.o達を直接リンクします。 (edited)
Avatar
omochimetaru 11/9/2017 2:10 PM
マジか
2:10 PM
あーシンボルはパッケージで切ってるからいいじゃんってか
2:11 PM
Cとはちょっと違う世界に進みつつありますね
Avatar
norio_nomura 11/9/2017 2:11 PM
swift test -vとかしてみるとコンパイラの起動オプションを見られます。
2:15 PM
type: .dynamicにするとswift build --static-swift-stdlibとかしてもそれらのライブラリはダイナミックリンクされるみたいだから、今後は使い勝手が悪くなると避けられるんじゃないかな? (edited)
Avatar
omochimetaru 11/9/2017 2:18 PM
うーむ、そうなんですかね Swiftが出てきたころから基本dynamic frameworkとembeddedだったから (edited)
2:18 PM
てっきりそういう思想なのかと思っていたけど
2:18 PM
最近static系のサポートも強くなってきていますね
Avatar
norio_nomura 11/9/2017 2:37 PM
.dynamicなライブラリを同じパッケージ内のexecutableターゲットから使う場合は問題ないのですが、依存しているパッケージから使った場合、それらはフルパスでリンクされてしまい、ポータブルなexecutableではなくなってしまいます。 $ otool -L ./.build/x86_64-apple-macosx10.10/debug/gysbClient ./.build/x86_64-apple-macosx10.10/debug/gysbClient: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1445.12.0) /Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug/libGysbKit.dylib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0) (edited)
Avatar
omochimetaru 11/9/2017 2:38 PM
ふむ
Avatar
前も書いたけど、 gyb でなくても Swift で Multiline String Literal が追加されたから、↓みたいな感じで大体いける気がする。これならなんでもフルに Swift の機能使える。 prefix operator > prefix func >(value: String) { print(value) } let intTypes = [8, 16, 32, 64] for intType in intTypes { for sign in ["", "U"] { >""" /// Extension that adds a few additional functionalities to \(sign)Int\(intType) extension \(sign)Int\(intType) { /// Returns a \(sign)Int\(intType) with all ones """ if sign == "" { >""" public static var allOnes:Int\(intType) { return Int\(intType)(bitPattern: UInt\(intType).max) } """ } else { >""" public static var allOnes:UInt\(intType) { return UInt\(intType).max } """ } >""" } """ } } (edited)
2:56 PM
元の gyb は↓。 %{ intTypes = [8,16,32,64] }% % for intType in intTypes: % for sign in ['','U']: /// Extension that adds a few additional functionalities to ${sign}Int${intType} extension ${sign}Int${intType} { /// Returns a ${sign}Int${intType} with all ones %if sign == '': public static var allOnes:Int${intType} { return Int${intType}(bitPattern: UInt${intType}.max) } %else: public static var allOnes:UInt${intType} { return UInt${intType}.max } %end } %end %end
Avatar
gysb - Generate your swifty boilerplate
😎 1
Avatar
SwiftPM対応できた
5:52 AM
%! swift_config("gysb_swift_config.json") %{ import Foundation import Yams let yamlPath = URL.init(fileURLWithPath: "data.yml") let yamlStr = try! String(contentsOf: yamlPath, encoding: .utf8) let yaml = try Yams.compose(yaml: yamlStr)! let fields: [String] = yaml.array().map { $0.string! } }% struct Data { % for field in fields { var ${field}: String % } }
5:53 AM
json { "packageDependencies": [ { "url": "https://github.com/jpsim/Yams.git", "requirement": { "identifier": "0.5.0", "type": "exact" } }, ], "targetDependencies": [ { "name": "Yams" } ] }
Avatar
おお、すげー!
Avatar
実行時に複数ファイル指定した場合は、一つのSwiftPMターゲットにまとめるから、Yamsの取得やビルドは共有される ただし、 %! swift_config() の指定は1ファイルだけがする。
Avatar
@omochimetaru 使う側はどこで Package.swift 指定するの?コマンドオプション?
Avatar
↑にはったjsonを書く。
Avatar
ああ、↓に書くのか。 %! swift_config("gysb_swift_config.json")
Avatar
昨日僕が無理やりswiftのコマンドラインオプションでやってたことを、全部SwiftPMへ丸投げしたということですね。 👍
Avatar
ですね SPMのワークスペースを作って、execターゲットのmain.swiftを生成するようになりました
Avatar
@omochimetaru Package.swift 的に、 gybs.json をディレクトリにおいておけば自動的に反映とかが良くないかな?そうすれば gysb ファイルに余計なものを追加しなくて良くて、gyb を Swift にしただけという体を保てそう。 (edited)
6:02 AM
ただし、 %! swift_config() の指定は1ファイルだけがする。
これも結構罠になりそう。
6:02 AM
a と b で同じライブラリが必要だけど、 a だけ、 b だけ、 a と b 同時に、って gysb に渡すときに全部サポートすることができなさそう🤔
Avatar
ディレクトリにおいておくっていうのが悩ましくて source/fooModule/foo.swift.gysb source/barModule/bar.swift.gysb ってなってるときに $ gysb source/fooModule/foo.swift.gysb って指定すると、 gysb.json はどこにあるんだ?ってなっちゃうんですよね
Avatar
source/fooModule/gybs.json じゃないかなぁ
6:05 AM
それか、Package.swift と同じ階層におくことにするか。
Avatar
それは場合によっていて、 source/ ** / * .gysb をドカンとツリー変換したい場合もあるだろうから
Avatar
%! import("https://github.com/jpsim/Yams.git") とかするとswift_config()に渡すjson相当のものが自動で生成される様にするとか。
Avatar
$ gysb --config source/gysb.json source/fooModule/foo.swift.gysb こういう感じはできるけどコマンドラインを長くしたくない・・・
Avatar
↑それだとファイルとライブラリの関係を示せない
Avatar
これも結構罠になりそう。 a と b で同じライブラリが必要だけど、 a だけ、 b だけ、 a と b 同時に、って > gysb に渡すときに全部サポートすることができなさそう
configが同じファイルならOKにするか
Avatar
利用側がどの gysb.json を使えばいいかわからないから
Avatar
同じconfigになっているソースがまとめて指定される限りOK
6:07 AM
これだとソースが自己言及的にできる
Avatar
対象となる gysb ファイルから遡って、 Package.swift と同じ階層までの gysb.json を適用するとかどう? (edited)
6:08 AM
ああ
6:08 AM
そうか
6:08 AM
別に Swift 限定じゃないから
Avatar
%! import("https://github.com/jpsim/Yams.git") とかするとswift_config()に渡すjson相当のものが自動で生成される様にするとか。 これの問題点は、パッケージ名からターゲット名がわからないこと
6:08 AM
そう、あと、生成テンプレートはSwiftに依存させたくないから
6:08 AM
Package.swiftを探すとかは マッチしない場合も多そう
Avatar
なるほど。
Avatar
gyb って import 使えるんだっけ?
6:09 AM
使えるなら参考にできるかも?
Avatar
つかえます
Avatar
gybは使えますね、pythonの言語機能のimportが使える。
Avatar
たとえば、パスの通ってるところに
Avatar
Swiftのimportはファイルパス的なしくみじゃないからできない。
Avatar
Foo.framework を置いてある前提にするとか?
6:10 AM
あー,
6:10 AM
Swift PM に乗っかって実行してるんだっけ?
Avatar
そうそう。
Avatar
それなら無理か。
6:10 AM
お、じゃあ
Avatar
libSwiftPMが気軽に使えれば「リポジトリからPackage.swiftを解釈して〜」とか簡単に出来そうなのに… https://github.com/apple/swift-package-manager/blob/master/Package.swift#L19
swift-package-manager - The Package Manager for the Swift Programming Language
Avatar
gysb を実行したディレクトリが対象となるファイルの先祖ディレクトリの場合、
6:11 AM
対象ファイルのディレクトリからカレントディレクトリまで遡って探すとかは?
Avatar
SwiftPMにgysb機能を載せた方が早そうな気がしてきた。
Avatar
そうすれば SwiftPM 対応のリポジトリで、リポジトリのルートに gysb.json おいて一括実行とかもできる
Avatar
現状の仕様で、テンプレート側から
6:13 AM
gysb.json を指定していれば
6:13 AM
それでスッキリしてません?
6:13 AM
探索するとかは、Swift以外の利用時に無駄な処理になるし
6:13 AM
カレントディレクトリの影響をうけずにコマンドラインだけで一貫した結果がいい
Avatar
@omochimetaru これを swift リポジトリ本体に組み込むことを目指すなら、できるだけ gyb に寄せておいた方が受け入れられる気がして、余計なものを付けない方がいいかなぁと。
6:14 AM
↓この記法一つで議論の余地がいくらでもあると思うので。 %! swift_config("gysb_swift_config.json")
Avatar
Swift本体に組み込む事は目指してなかったですね、Swiftソース以外の生成も前提にしているから、そこで設計方針がかみあわないのか
6:15 AM
個人的にはC++の生成にも使いたいのです
Avatar
Swiftのコンパイル時にSwiftが必要になるから、gybの代替にはなれない気がする
Avatar
セルフホスティングはまだ早いと思いますが、gyb 程度の用途だったらいけそうな気も。
Avatar
Swift本体とは独立したテンプレートエンジンとして存在してもらうほうが使う側としては嬉しみ
Avatar
↓この記法一つで議論の余地がいくらでもあると思うので。
そうですねえ、ここにマイクロ言語が必要になっているのは微妙ではある
Avatar
独立して使えるけど、それを swift リポジトリでも使うという状況を想定してます。
Avatar
brew install gysbできる様になると良いね。
Avatar
いま %! swift_config 以外に %! include_code っていうマクロ命令もあって
Avatar
それはしたい < brew
Avatar
それで他のSwiftソース(テンプレートロジックの方)を取り込んだりできるんですが
6:18 AM
この機能のためにどうしてもミニ言語が必要に。
Avatar
include_code はカオス度が増しそうだなぁ。
6:18 AM
↑例
6:19 AM
"libs/*.swift" に書いてある func aaa() {} と func bbb() {} がここにテキスト展開される。
Avatar
色々な機能を入れると混沌とするから、必要最小限なものをシンプルに保つのが良さそうな。サードパーティライブラリが使いたいのはわかるから、そこはなんとかするとして。
Avatar
Swiftがスクリプティングサポートを充実して
6:20 AM
ソースコードの相対パスimportができれば
6:20 AM
こんなものはいらなかったんだ
Avatar
gysb の実行を Swift PM に依存しない方法はないかな?
Avatar
さっきのYamsの例(Swift製YAMLライブラリ)だけみても
6:21 AM
かなりきついですね
6:21 AM
Cソースとかも絡んでいるので。
Avatar
swift コマンドで Framework のパス指定して実行できなかったっけ?
6:21 AM
ライブラリのビルドは Swift PM でやるとして
Avatar
その辺り、昨夜僕が試しました。
Avatar
gysb が生成したコードの実行を Swift PM に依存しない
Avatar
Frameworkがdynamicかstaticかで渡し方が変わったり
Avatar
結論としては、ライブラリの配布元でのPackage.swiftによりswiftコマンドラインオプションの指定方法とか変わってくるので、めんどい。
Avatar
あと、>ライブラリのビルドは Swift PM でやるとして SPMの.buildから生成物を手で取ってくるっていうのは不便だと思います
Avatar
うーん、それならやっぱり gysb.json を gysb ファイルと同じ階層においておくだけってのはわかりやすいと思うけどなぁ。
6:24 AM
一括実行は諦めるか、 SwiftPM 対応リポジトリの場合だけ Package.swift と同じ階層も見るとか。
6:25 AM
あとはコマンドラインオプションで指定もできるくらいかなぁ。
Avatar
一括実行を諦めると
6:25 AM
Yamsなどの重い依存を
6:25 AM
何回も取得・ビルドすることになって
6:25 AM
かなり動作が遅くなってしまう
Avatar
えっと、それは swift_config 書く場合と同じで
6:26 AM
gysb.json は各ディレクトリに置くけど
6:26 AM
一度に実行した場合はビルドは一度とかでいいんじゃない?
6:27 AM
指定を gysb ファイルの中に書くか json ファイルの有無でやるかだけの違い。
6:27 AM
gysb Sources/Foo/*.gysb Sources/Bar/*.gysb
Avatar
たとえば src/foo/a.swift.gysb src/foo/b.swift.gysb src/foo/gysb.json src/bar/c.swift.gysb src/bar/d.swift.gysb src/bar/gysb.json こうなってるときに $ gysb src/ こう実行したら
6:28 AM
ああ、これは衝突するから一緒にはできませんよって
6:28 AM
今と同じルールにするということか
Avatar
うん。解決ルールは今と変わらないはず。
Avatar
src/fooとsrc/barをまとめて変換したければsrc/gysb.jsonをおくと
Avatar
設定が同じ場合、 gysb をすべてのディレクトリにコピーしてまわるか、すべてのファイルの先頭の行に書くか程度の違い。
6:29 AM
gysb src/ で再帰的にgysb さがすの??
Avatar
はい それはまだ対応してないけどやるつもり
Avatar
再帰は gysb -r src/ とか明示的にした方が良さそうな気も。
Avatar
ああ、そうですね。
6:30 AM
$ gysb --source-dir src
6:30 AM
こういうイメージ
Avatar
再帰指定のときはその過程の gysb.josn も全部適用で良さそう。 (edited)
Avatar
あ〜
6:31 AM
gysb.jsonごとに実行を分割すればいいのか
6:31 AM
ていうかそれファイル複数のときでも一緒だな
6:32 AM
入力されたファイルごとに対応するgysb.jsonがあって、gysb.jsonごとにグルーピングしてそれぞれ実行すれば良いのか。
Avatar
うーん、それってでも複数 gysb.json で同じライブラリが指定されてた場合、多重ビルドにならない?そこは頑張って回避?
Avatar
複数gysb.jsonをマージしてビルドすることは考えてなかった
Avatar
ん?だって gysb Sources/Foo/*.gysb Sources/Bar/*.gysb みたいなことがしたいんじゃないの?
Avatar
↑の例なら、 Sources/gysb.json が置いてあればうまく動くけど
6:34 AM
Sources/foo/gysb.json と Sources/bar/gysb.json が置いてある場合
6:34 AM
一つのビルドにはできない
6:34 AM
という想定でした
6:35 AM
実際、違うライブラリだけど同じターゲット名、とかが出てくるとマージしようもないし。
Avatar
マージして重複排除でライブラリビルドして、実行はディレクトリ単位にすれば競合があっても解消できそう。
6:35 AM
親と子で競合したらダメだけど。
Avatar
実行はディレクトリ単位っていうのはどういう意味です?
Avatar
ディレクトリの gysb.json を見る方式だと、ディレクトリ単位でしか指定できないから。
Avatar
ディレクトリ単位にした時点で実際のSwiftPMワークスペースがばらばらになるから
6:36 AM
ライブラリが共有できないです
Avatar
swift_config を導入せずに gysb.json を置く方式にするのであれば、一つのディレクトリの中で設定を切り替えることはできないという意味です。
6:37 AM
逆に言うと、同じディレクトリの gysb ファイル同士では設定(ライブラリ)が競合することはない。
Avatar
マージして重複排除でライブラリビルドして、
6:37 AM
このマージするっていうのは
6:38 AM
同じgysb.jsonファイル同士を (edited)
6:38 AM
同じものと検出するってことを言っている?
Avatar
複数の gysb.json の中に書かれた同じバージョンに解決される同じライブラリを重複ビルドしないようにするということを言ってます。
6:39 AM
あー、でもバージョンの解決は Swift PM がやるから無理か。 (edited)
6:39 AM
完全一致くらいなら排除できそうだけど・・・
Avatar
Sources/foo/a.swift.gysb Sources/foo/b.swift.gysb Sources/foo/gysb.json Sources/bar/x.swift.gysb Sources/bar/y.swift.gysb Sources/bar/gysb.json こうなっているときに
6:40 AM
a.swift.gysb と b.swift.gysb を、 一つのPackage.swift でビルド x.swift.gysb と y.swift.gysb を 一つのPackage.swiftにして ビルド (edited)
6:40 AM
っていうふうにすることを考えているけど
6:41 AM
foo/gysb.json と bar/gysb.json をマージして、ライブラリをまとめてビルドするのだとして、
Avatar
Package.json は Package.swift の間違い??
Avatar
その場合、Package.swift は1つで、そこに、a.swift.gysb , b.swift.gysb , x.swift.gysb, y.swift.gysb が所属して、コンパイルするってイメージですか? (edited)
6:43 AM
その考えはわかって、最初そういう意味だと思ったんですけど
実行はディレクトリ単位にすれば競合があっても解消できそう。
その場合この「実行はディレクトリ単位」の概念がわからなかった。
Avatar
そうかー、ビルドを Swift PM に依存してる時点で同一ライブラリであっても Package.swift 間で共有できないのか。 .build 以下をコピーする処理をいれれば共有できるかもだけど。
Avatar
ああ、異なるPackage.swiftがあるけど依存ライブラリのバイナリは再利用することを想定していたんですね
6:44 AM
それはSwiftPMの仕様上うまくできなそうと考えています (edited)
Avatar
そうです < 異なるPackage.swiftがあるけど依存ライブラリのバイナリは再利用することを想定していたんですね
Avatar
SwiftPMは結構細かいことを中でいろいろやっているので
6:45 AM
あんまり途中成果物のバイナリを触って何かするっていう系は
6:45 AM
うまくいかなそうだなあと思ってます
6:46 AM
昨日 @norio_nomura がいろいろ試した結果もそう思った
Avatar
そもそも依存ライブラリの作りによっては、ライブラリのバイナリが生成されない。 (edited)
Avatar
ああ、それもありましたね。
6:46 AM
それが一番ビックリしたんだった。
Avatar
うーん、そしたら、
Avatar
foo/gysb.json と bar/gysb.json でそれぞれ Package.swift 作って2回ビルドでいいと思いますよ。
Avatar
↓ 2 回実行 Sources/Foo/gysb.json Sources/Bar/gysb.json
Avatar
Sources/gysb.json だけにしてけば 1回ビルドにできるのだし。
Avatar
Souces/gysb.jsonSources/Foo/gysb.json をマージ、 Souces/gysb.jsonSources/Bar/gysb.json して 2 回実行 Souces/gysb.json Sources/Foo/gysb.json Sources/Bar/gysb.json
6:49 AM
(差分だけを Foo/gysb.json 等に記述することを想定)
6:50 AM
Foo, Bar 以下のすべての gysb ファイルに対して 1 回で実行 Souces/gysb.json
6:50 AM
とかかなぁ。
6:50 AM
もちろん recursive 指定の場合。
Avatar
そもそもそんなにSources/gysb.json と Sources/Foo/gysb.json で何か分割定義したいと思わないと思うんですよ
6:51 AM
あくまでメタプログラミングのためにつかうライブラリだから
Avatar
そうですね・・・
Avatar
FooではYAMLを読むしBarではXMLを読むからっていって
6:52 AM
別に Sources/gysb.json で YAML と XML 両方のライブラリぶち込んでおいて
6:52 AM
それでFooの管理上困るってことも無いと思う。
6:53 AM
それは要望が出てきてから考えるとして、とりあえずは gysb.json 一個に対して 1 Package.swift で良いと思う
6:54 AM
それはそれとして、 %! swift_conifig はやめてディレクトリ遡り探索の gysb.json にしようと思います
6:55 AM
そのほうが 同じgysb.json 配下の gysbテンプレート達に対して、特定のファイルだけ変換するってことができる。
6:55 AM
swift_config 方式だと全部にその指定を書かないといけないからめんどくさい
Avatar
お、いいですね < %! swift_conifig はやめてディレクトリ遡り探索の gysb.json にしようと思います
6:55 AM
include も廃止?
Avatar
include は必要だと思う。
Avatar
むー
Avatar
ちょっと共通のメタプログラミング用の関数とかは生える事が結構あって
6:56 AM
でもそれをわざわざSPMパッケージにしてリポジトリをわけるのは
6:56 AM
面倒な場合があるだろうから、その場で結合できたほうが良さそう
6:56 AM
あ、でもあれか
6:56 AM
gysb.json で
6:57 AM
結合するファイル達として指定できるようにするという手はあるな。
6:57 AM
同じ理由でincludeを全部に書くのは面倒だから。
Avatar
その方が %! という複雑性を持ち込まなくてよさそう。
Avatar
そうですね
Avatar
どちらかというと include したいのはテンプレートそのものの include だと思うけど
6:58 AM
( HTML 生成するときのヘッダー、フッターとか)
6:58 AM
それも関数化して gysb.json で指定でできるかな?
Avatar
テキストのinclude 、 コード ( % { } の内側 ) のinclude、テンプレートのinclude
6:59 AM
の3種類がありえるとおもったので今は include_code () だけがあるんですが
6:59 AM
テンプレートのincludeにした場合、それ自体は、 %{ } で包まれた中にswiftコードを書いたファイルになるんですが
7:00 AM
それが swift ファイルにならない (構文上) .swift.gysb になってしまう
Avatar
↓とかできるんだっけ? % func foo() { FooFooFoo % } % for _ in 0..<3 { % foo() % }
Avatar
というのが微妙だなあと思っていて
7:00 AM
できますね
Avatar
↓結果 FooFooFoo FooFooFoo FooFooFoo
Avatar
そうなるはず。
7:00 AM
で、swift.gysb になっちゃうと、再帰実行とかで巻き込まれるんですよね・・・
Avatar
よくわかりません・・・
Avatar
gysb.jsonの中に記述できる様にしてしまうとか。
Avatar
jsonの中にswiftを書くのは辛いと思います
Avatar
yamlならいけるかな
Avatar
えっと、 include_code で取り込まれるファイルは
7:03 AM
それ単体でvalidなswiftソースです
Avatar
yaml ならいけるかもしれませんが、 gysb の実行に YAML パーサが必要になって依存が生まれてしまいそう・・・
Avatar
func taxRate() -> Float { return 1.08 }
7:04 AM
とかこういうファイルなわけです。
Avatar
なるほど、何でもテキストを展開するというわけではないのか。
Avatar
でも、 @koher のいうように、 テンプレートをインクルードする機能だとしたら
7:04 AM
%{ func taxRate() -> Float { return 1.08 } }
7:04 AM
こういうファイルを用意することになって・・・
7:05 AM
このファイル名は metalib.swift.gysb とかになる。
7:05 AM
で、さっきの Sources の例でいえば
7:05 AM
Sources/foo/a.swift.gysb // こいつが それを読みに行く Sources/foo/metalib/metalib.swift.gysb
7:05 AM
たとえばこういうファイルツリーにしたくなると思います。
7:06 AM
で、さっきまでの議論を前提に考えて、 $ gysb --source-dir Sources を実行すると・・・
7:06 AM
Sources/foo/metalib/metalib.swift.gysb が 処理対象になって、 自分を自分の上部にincludeしようとして、無限ループして壊れる。
Avatar
そういうことか。
Avatar
これは困ったな、という話です。
7:07 AM
今の仕様であれば、インクルードするのはテンプレートではなくでコードなので、 Sources/foo/metalib/metalib.swift が置かれているけど、これはgysbの実行には関与しないのでうまくうごく。
Avatar
foo/gysb.json に metalib の include を記述とか?
Avatar
再帰探索で metalib.swift.gysb が見つかったときに、これはinclude用だから処理対象からはずそう、 っていう制御をするってことですか?
Avatar
うーん、 gysb から読み込む swift ファイルおくとかは Swift PM で壊れたりしないかな?ディレクトリ分けておけば Package.swift でコントロール可能?
7:09 AM
@omochimetaru はい。 include 用のディレクトリを明記するとか。
Avatar
ターゲットを分けちゃうと public にするとかいろいろ出てきて面倒なんで、シンプルにテキストとして結合されるのが便利な気がします
7:10 AM
いま想定してるのはさっきの func taxRate() みたいな、ちょっとしたやつ。
Avatar
Swiftファイルを読み込むってのは微妙そう。インクルードされるファイルは gysb でも swift でもないべきでは?
7:12 AM
gysb.gysb とか?
Avatar
テンプレートだけどインクルード用としてわかるようにする、っていう手はありますね
7:12 AM
拡張子を gysbi にするとか。
Avatar
ネスト数が必要かと思ったけど、起点を gysb にすればいいだけだから特に問題ないか。
7:13 AM
gysbi が gysbi を include するような場合でも
Avatar
それは大丈夫ですね。
Avatar
でも gysb だとマズイよね。ディレクトリで再帰的に指定されるような場合、インクルード用ファイルも単独で展開されちゃう。
Avatar
gysbi が gysbi を include する
これは、ファイルの中に include 命令が書けるってことになってるとは思うけど・・・
7:14 AM
拡張子が gysb だと面倒なことになりますね
7:14 AM
gysbi が良さそうだなあ。
7:15 AM
template の include なのであれば
Avatar
テキストで include する機能だったら、どのラインに展開するかも重要だから %! 的な構文は避けられなさそう。
Avatar
テキストを注入する効果もあるわけなので
7:15 AM
そうそう。
Avatar
ってか、 gysb 以外なら拡張子なんでもいいのか。
Avatar
まあそうです。
7:15 AM
includeを考えていくと %! から逃げられないですね
7:15 AM
まあgybはそれはできないですけど。
Avatar
%! include("path/to/file") の行をそのファイルの中身で展開するだけ。
Avatar
gybはメタpythonとしてのimportがあるだけだからテキストのincludeはできない
Avatar
Jekyll の include の構文は↓ {% include footer.html %}
7:18 AM
このパスに変数使えたりする {% include {{ page.my_variable }} %}
7:18 AM
ここまで来るとさらにメタになるけどカオスかな?
7:18 AM
んー、でも
7:19 AM
↓とかもあり得る? % for i in 0..<10 { %! include("file\(i).gysbi") % }
Avatar
現状は %! のマクロ言語はテンプレート処理系の前段にあるとしています
7:20 AM
CコンパイラとCプリプロセッサの関係と一緒
7:20 AM
現実的に↑は無理で、なぜなら、
7:20 AM
Swiftとしてのコンパイルをして実行して
7:20 AM
でてきたものを再びテンプレートとして処理するっていうふうに
7:21 AM
Swiftコンパイル実行が何回も繰り返されるモデルになるので
Avatar
include を関数として実装できないかな?
Avatar
実行も遅いし変なことになったときわけがわからなくなりそう。
7:21 AM
テキスト注入する関数としては実装できますが
Avatar
ファイルを読み込んでその内容を write する
Avatar
いまやりたいのはSwiftのメタライブラリを提供するシナリオだから
7:21 AM
includeをコンパイルする時点でコンパイルエラーになって駄目ですね
Avatar
そうだなぁ。
Avatar
include_text: Swift上で実装できる include_template: Swiftコンパイル前に処理しないといけない
Avatar
Swift の関数を読み込むことはできないけど、テンプレートを読み込むことはできるんじゃない? gysbi ファイルに対して gysb を実行して得られた文字列を挿入すれば。
7:25 AM
Jekyll はそっちの挙動だと思う。
Avatar
gysbコマンドを実行して結果を注入するってことですか?
Avatar
はい。
Avatar
それはまあできるけど、Swiftの関数を読み込みたい・・・
Avatar
関数読み込みは gysb.config で記述できそう。
7:26 AM
個別に Swift ファイルのパスを指定するだけで。
Avatar
そうですね。
7:26 AM
機能としては現状の %! include_code を
Avatar
Swift ファイルは gysb じゃないから無限再帰問題もないし。
Avatar
jsonにgysb.jsonに書くようにするってことですね
Avatar
はい。
Avatar
それはありだと思います。
7:27 AM
テンプレートを読み込みたいっていったのは @koher だし・・・
Avatar
テンプレートエンジンとしてはその機能はほしいかと思ったけど、とりあえずなしでいいと思います。複雑化するし。
7:27 AM
そうすれば %! も排除できる。
Avatar
そうですね > %!
7:29 AM
しばらく離席します
Avatar
brewのバイナリ配布、sourceryがSwiftPMでビルドしたものを使ってる。 https://github.com/Homebrew/homebrew-core/blob/master/Formula/sourcery.rb
homebrew-core - 🍻 Default formulae for the missing package manager for macOS
7:32 AM
実行環境のSwiftバージョン依存を減らせるから、バイナリ配布はそのうち必要。
Avatar
@mono さんも LicensePlist を brew で配布してたような。 (edited)
Avatar
PR来て途中まで対応しつつ、実はまだ対応できてないです( ´・‿・`)
🙃 1
7:35 AM
Issue: #52 I hope I can install this library with CocoaPods. I tried installing with CocoaPods by referring to SwiftLint etc. I did not actually register with CocoaPods, so I can not confirm whethe...
Avatar
配布手続きはそれほど難しくないです。 (edited)
Avatar
PR や issue で音信不通悲しいですね😂
Avatar
分かれば簡単そうとは思いつつ、初めてだとそれなりに手間取りそうと思って敬遠しちゃっていました 🐶
7:37 AM
その後1回も突っついてないだけなので、何かしらアクションすれば続きできそうですが(あるいは自分で続きやっても良いですが)
7:38 AM
あ、完全に勘違いしていました。
7:38 AM
brewはやってます。
7:39 AM
CocoaPods配布が途中でした 🐶
7:40 AM
でも、brewもバイナリ配布ではなくビルド必要な形式にしちゃっています。 https://qiita.com/mono0926/items/c32c008384df40bf4e41 (edited)
mono0926/LicensePlist という、Carthage・CocoaPodsおよび手動指定ライブラリから、iOS設定アプリに載せられ...
👍 1
Avatar
LicensePlist は CocoaPods でインストールしているライブラリのライセンス情報の生成には対応しているけど、 LicensePlist 自体の CocoaPods でのインストールが未対応ってことですか?
Avatar
そうです。
Avatar
SwiftPM や Carthage と比べると複雑ですよね・・・
Avatar
Homebrewでのバイナリ配布は途中までやりかけたものの少し面倒そうと感じていたところに ishkawaさんからこうリプライいただいて、省略しちゃいました。 https://twitter.com/_ishkawa/status/863662412196597760?ref_src=twsrc%5Etfw&ref_url=https%3A%2F%2Fqiita.com%2Fmono0926%2Fitems%2Fc32c008384df40bf4e41
@_mono それは試したことないですね。自分はbrewで入ればなんでも良いか〜って思ってCarthageの真似で済ませちゃいました。
Avatar
Swift 界隈以外に使ってもらうためのツールならバイナリ配布した方がいいかも?
Avatar
成果物がiOSアプリ用なので、その辺りはあまり問題ないかもです。
Avatar
LicensePlist は大丈夫そうですね。 gysb はバイナリも要りそう。
Avatar
あ、なるほど、そちらはそうですね。
7:47 AM
あと、LicensePlistの場合は、Swift 4対応するとまだXcode 8メインで使っている人がビルドできなくなっちゃうのでそのケアのためにまだ3のままです 🐶
Avatar
ああ、tapにしたのですね。>ビルド必要な形式
Avatar
tapかどうかってビルド必要とは関係なかったような?? bottles対応を省いたからビルド必要、という認識でした。
Avatar
bottles対応ってオプトインだったかな?勝手にビルドされてた様な…
Avatar
bottles do ... end にバイナリの置き場所書けば対応で、省略すればインストール先でビルド必要な認識でした。 (edited)
7:52 AM

はじめに

Homebrewは自作のライブラリを公開することが割と楽な機能を提供してくれている。しかしながら、その作業全体についてちゃんと書いてくれているブログが少ないので、備忘録として自分の作業を晒しておく。なお、自分のgi...
Avatar
gysbはテンプレート言語がswiftで、テンプレートを描画するためにswiftのビルド実行をしているので
7:52 AM
gysb自体がビルドできない環境ではgysbを使うことができないと思います
Avatar
gysbをビルド出来るswiftバージョンと扱うテンプレートに書かれたswiftバージョンが違う場合に、バイナリ配布だと回避できるよね、と。
Avatar
たしかに・・・
Avatar
https://github.com/Homebrew/homebrew-core/ へのformula PRは、CIがビルドに成功したらボトリングしてくれます。まあ、tapでも自前でボトリングすればバイナリ配布は出来るのかな。
homebrew-core - 🍻 Default formulae for the missing package manager for macOS
Avatar
あ、なるほど、前者を知らなかったです。 後者でやろうとして面倒で一旦省略しました。
Avatar
[swift-evolution] update on forum Ted Kremenek via swift-evolution The decision to move to a forum was announced a while ago, and it hasn’t appeared yet. I think we will be making the move soon and I wanted to provide some reasons why it was delayed and what comes next. ... My hope is that process will start in December.
Avatar
@koher gysb.json と include_files 機能できました。マクロ機能を排除できました。アドバイスありがとうございました。
👍 1
Avatar
yaml ならいけるかもしれませんが、 gysb の実行に YAML パーサが必要になって依存が生まれてしまいそう・・・ 一応書いておくと、YamsはCodableをサポートしたYAMLパーサです。Yams自身には外部ライブラリ依存はなくて、利用実績としてはSwiftLintが.swiftlint.ymlのパースに使っています。
Avatar
gysb.jsonではなくgysb.ymlも書けたほうが良いですかね? 手書き想定ファイルだしそうかな
Avatar
@norio_nomura gysb から Yams 等への依存が生まれるという意図でした。依存自体は悪くないんですが、なくせるならなくした方が望ましいとは思うので。
👍 1
Avatar
CIができたから次はHomebrewじゃい、と思ったが、monoさんの記事読んで、なんかめんどくさそうだな・・・って気分
🐶 1
Avatar
改めてmonoさんの記事を読んだけど、tap作る手順は面倒いね。homebrew-coreへPR出す方が簡単なのでは…
👀 1
Avatar
それぞれの長所短所あまり把握し切らず、何となく最近のはtapが多いかな??と思いつつそっちにしました。 (edited)
12:09 PM
Vaporとかもtapですね( ´・‿・`)
Avatar
とりあえずtapならオレオレで勝手にできるから楽そう
Avatar
@_mono 初回は苦戦した記憶がありますが、1度やれば簡単だった気がします。参考になるかわかりませんが、当時のメモを貼っておきますね。 https://t.co/OBZtRlwl1S
12:15 PM
そういえば、あまり深く考えずにこれをベースにした、というのがtapにした大きな理由でした( ´・‿・`)
Avatar
なるほど
Avatar
やべえ・・・
12:16 PM
ちょっと変えるだけでタグのプッシュとtarのDLとハッシュの計算が必要や・・・
Avatar
LicensePlist - A license list generator of all your dependencies for iOS applications
12:18 PM
そのあたり苦手ですが、がんばって書きました🐶
Avatar
https://github.com/Homebrew/homebrew-core/fork を開いてforkして、remote登録: $(brew --repository homebrew/core) git remote add omochi https://github.com/omochi/homebrew-core.git したら、次のコマンドでformula作成: brew create https://github.com/omochi/gysb/archive/0.8.6.tar.gz して、出来たgysb.rbdepends_on, def install, test dohttps://github.com/Homebrew/homebrew-core/blob/master/Formula/sourcery.rb 辺りを参考に設定して、 brew install --verbose --debug gysb でインストールテストして、 cd $(brew --repo homebrew/core) git checkout -b gysb git add Formula/gysb.rb git commit git push https://github.com/omochi/homebrew-core/ gysb してPR、って感じかな?
GitHub is where people build software. More than 25 million people use GitHub to discover, fork, and contribute to over 71 million projects.
homebrew-core - 🍻 Default formulae for the missing package manager for macOS
👀 1
12:18 PM
Makefileとか不要。
12:19 PM
class Gysb < Formula desc "Generate your swifty boilerplate" homepage "" url "https://github.com/omochi/gysb/archive/0.8.6.tar.gz" sha256 "139fd7225442c74e943b32716158a3ea5bd438241372a3cf913fd5313793248e" depends_on :xcode => ["9.0", :build] def install system "swift", "build", "--disable-sandbox", "-c", "release", "-Xswiftc", "-static-stdlib" bin.install ".build/x86_64-apple-macosx10.10/release/gysb" end test do # `test do` will create, run in and delete a temporary directory. # # This test will fail and we won't accept that! For Homebrew/homebrew-core # this will need to be a test that verifies the functionality of the # software. Run the test with `brew test gysb`. Options passed # to `brew install` such as `--HEAD` also need to be provided to `brew test`. # # The installed folder is not in the path, so use the entire path to any # executables being tested: `system "#{bin}/program", "do", "something"`. system "true" end end
Avatar
bin.install はなんですか?
Avatar
https://docs.brew.sh/Formula-Cookbook.html を見ると大体わかる。
🍺 The missing package manager for macOS
👀 2
12:23 PM
PR開くとチェックリストがテンプレートに載ってるので、追加でそれらに載ってるテストが必要。
Avatar
ユーザー増えてきたら本家入り考えることにします
Avatar
一度掲載されたら、次回バージョンアップからはコマンドライン1発でPR開くところまでいけたはず。 https://github.com/realm/SwiftLint/blob/master/Makefile#L114
SwiftLint - A tool to enforce Swift style and conventions.
Avatar
なるほど。それは楽だ。。
12:35 PM
上で書いたFormulaはtest dosystem "true"とか書いたけど、そこは真面目に書き換えないといけない。
12:36 PM
テストはsandbox環境下で行われるので、sandboxで動かない機能をテストしたりすると失敗する。
12:38 PM
sourceryの場合は期待したバージョンをsourcery --versionで返すかどうか、かな。
Avatar
ふむふむ
Avatar
あ、sourceryはsandboxのせいで、本来のテストが出来てないみたいだな。 本来のテストは真面目にコード生成してる。 https://github.com/Homebrew/homebrew-core/blob/master/Formula/sourcery.rb#L32-L54
homebrew-core - 🍻 Default formulae for the missing package manager for macOS
12:47 PM
gysbのテスト記述はこれを参考に出来そう。
Avatar
なるほど brew と ruby の道具で書いてありますね
Avatar
この辺りが自前tapリポジトリを使ったとしても通用するのかどうかは知らないです。
12:52 PM
homebrew-coreもtapなので、いけそうな気もしますが。
Avatar
そういえばSSSやってる人はみんなVaporとかKituraとかPerfectとかどれでやってますか?
Avatar
#server-side チャンネルがいいかも
Avatar
あったそんなチャンネル!
Avatar
swift - The Swift Programming Language
Avatar
朝見たけどまだ何もなさそうだった
Avatar
何が起こるんだろう・・・
Avatar
Android対応とかですかねえ
Avatar
うーん、 Android は Kotlin 採用したし、 Swift だと JVM で動かないし、違いそうな気がするなぁ。 Chris Lattner がらみかな?
Avatar
GoogleのSwift fork、本家に Fuchsia OS 対応のプルリク投げてる https://t.co/jPsh9Kvi0h
Avatar
Fuchsia is a capability-based, real-time operating system (RTOS) currently being developed by Google. It was first discovered as a mysterious code post on GitHub in August 2016, without any official announcement. In contrast to prior Google-devel...
Avatar
https://bugs.swift.org/browse/SR-6103 この前投稿した LoE のバグが解決された よかった
Avatar
ズル
Avatar
tarunonのバグは・・・
Avatar
なんだと
3:44 AM
返事がほしいでござる
Avatar
@omochimetaru Assignee 担ってるけど、何かアクションを求められてるの?
Avatar
あれ、ほんとうだ
Avatar
勝手に直せやだったらウケる
Avatar
いま resolved だけど、 closed に俺がするんか?
3:45 AM
コメント欄で聞いてみる
Avatar
僕の唯一のResolvedは担当者無しやで
3:48 AM
適当なんちゃう?
3:48 AM
そもそもそれも明らかに治ってるのに音沙汰なかったからこれ治ってるよね?って聞いたら解決済みになったやつ
Avatar
6126は CC joe groff ついたけど 6304については完全に無だね
Avatar
感情が消えた
Avatar
投票しておいた
Avatar
6126はそもそも変性のルールがほこ×たてしてるからなぁ
3:50 AM
ほこたてで変換したら変なのでた
Avatar
動作確認はしたの?>Assignee
Avatar
いや、まだです
3:53 AM
Tracking internally as rdar://35215926. ↑こうなっちゃった時点で
3:53 AM
それについて再現テストがたされたのかとか
3:53 AM
よくわからんのですよね
3:54 AM
僕が確認することより再発防止のためにテスト追加することが一番大事だと思うんですけど・・・
Avatar
PRではテストが追加されてるみたいだけど。
Avatar
ですね。ちょうど今見てました。
3:57 AM
+struct ParameterizedStruct<T> { + mutating func takesFunctionWithGenericReturnType(_ f: (Int) -> T) {} +} これがArrayに相当してるのか
Avatar
とりあえず、issueに載せたコードを動かしてみるといいのでは?w
Avatar
そうですね、マージされてるし、あとでsnapshot落としてきて試してみます。
Avatar
あ、まだこのPRを含むsnapshotは無いみたい。
Avatar
あれ、でもmaster に merged だから
4:07 AM
a
4:07 AM
November 15, 2017
Avatar
git tag --contains cf9a09e18dba7a7fe0506381589fbf0f4bb99a98 で何も出ない。
Avatar
mergeされたのが17日か
4:08 AM
dailyが15日以降まだ来てないんですね。CIがコケてるのかしら。
Avatar
swift-DEVELOPMENT-SNAPSHOT-2017-11-21-a出てる。
Avatar
DL中
Avatar
#beginner-help_archived が別の話題が進んでるんで、こちらで質問させてください。Swift で C++ の const 引数みたいなことって method / closure でできるんですっけ?
Avatar
method / closureでできるの意味がいまいちわからないですが
Avatar
inoutじゃない値型は全部copyなので実用上constになる気がします
Avatar
すいませんわかりづらい書き方でした。引数で渡す class をその method 内で変更しないことを示せるのかな?と思って。
Avatar
classはあきらめて
Avatar
ですが、そもそも class に non mutating な method が定義できないので、const 性を保証できないのでそれはおかしいというツッコミを受けました(報告)
Avatar
残当
🙏 1
😭 1
Avatar
struct にすれば > inoutじゃない値型は全部copyなので実用上constになる気がします < このとおり
8:12 AM
あとは class なら親クラスを readonly な type にして サブクラスで mutating なメソッドを一通り実装すれば・・・
8:12 AM
引数で渡す class をその method 内で変更しないことを示せる
これじたいはできるよ。
Avatar
readonlyをprotocolで表現してprotocol型で渡した方が良いですね
8:13 AM
流石にclassは面倒すぎるしlet propertyをvarでoverrideできな…できるの?!
8:14 AM
iPhoneなので試せない
Avatar
たしかにprotocol横付けが楽ですね、ジェネリックだったら 😇
Avatar
今回はジェネリックじゃないので protocol 案でいけそう
8:19 AM
🙏
Avatar
ジェネリックでもassoctypeつけて関数をジェネリックにすれば動くから出来るまで頑張ろう
Avatar
ああこの状況なら <X: Proto> でいいのか
Avatar
そう
Avatar
なるほどなるほど
Avatar
たしかに別にプロパティに保管するわけじゃないからいけるのか
Avatar
プロパティに保管するならその時にerasureを使うぞ
Avatar
無駄Optional警察だ!👮
Avatar
www
8:47 AM
そこかいw
Avatar
代入テストで雑にそうしました… 🙏
Avatar
あとこれclassはそのままclassなんで意味なくないですか
Avatar
processPoに渡すクロージャの中ではsetterが呼び出せないから意味あると思うよ (edited)
Avatar
あ、これはPoについてConstにしたいのか
8:49 AM
Elementについてと勘違いしてた
Avatar
そうです。Po を Const にしたかった
Avatar
型パラが妙に多いな
8:50 AM
func processPo<X: ConstPo>(po: X, process: (X.Element) -> Void) { これでok
Avatar
なるほど!
Avatar
本当はElementとかも含めて再帰的にConst化したいと思うんですが、今日のswiftではそれをシュッとやるのは無理ですね
8:54 AM
structつかおう (edited)
Avatar
たしかに再帰は…
8:55 AM
うーんなるほど
9:00 AM
あ、でも今回は露出するプロパティが値型なので完全に目的を達成できそう
9:01 AM
ありがとうございました
Avatar
これって const の場合と違って、型ごと CostoPo を満たさないといけないの微妙そう。
Avatar
そこなんすよね
Avatar
struct じゃダメ? Swift の class は二級市民だと思ってる。
Avatar
そうですね
Avatar
抽象クラスとかもないし。
Avatar
View なのでうーん…
Avatar
再起でできるためにはConstableみたいな不毛なprotocolが必要になって、class to type-erasure structな記述をやる羽目になる
Avatar
View に対応した ViewModel を struct で作って渡すとか?
Avatar
structだとvar/letですむのに
Avatar
View 自体を操作する関数だとダメだけど。
9:04 AM
(でも const にしたいくらいだから View から情報をとりたいだけに見える)
Avatar
そうですね
Avatar
caseでenumから値とるやつ、ここまとめられるの知らなかった。 enum Hoge { case fuga(Int) case piyo(Int) var count: Int { switch self { case .fuga(let count), .piyo(let count): // <- ここ return count } } }
Avatar
えっ、どうなってんの、それ
Avatar
protocolはまとめられないよん
Avatar
同じ let count だからいける?
Avatar
同じ具体型なら変数そろえて同一視できる
Avatar
ワオー知らなかった
Avatar
tarunonのいうとおりこれはエラーなった protocol ProtocolA {} enum Hoge { case fuga(ProtocolA) case piyo(ProtocolA) var count: ProtocolA { switch self { case .fuga(let count), .piyo(let count): return count } } }
9:25 AM
Playground execution failed: error: MyPlayground.playground:5:24: error: matching a protocol value in multiple patterns is not yet supported; use separate cases instead case .fuga(let count), .piyo(let count): ^
Avatar
前はコンパイラが破壊された
9:25 AM
僕の報告一覧にあるよ
9:25 AM
一応コンパイルエラーになったから解決なのかな
Avatar
おもしろ記法みつけたと思ったら過去にtarunonに破壊も報告も修正もされてるのなんか悔しい
9:26 AM
悔しい💢
Avatar
そんなおこらんといてや
Avatar
Swift おもしろ記法 探検隊
Avatar
@tarunon これなら通りそうなもんだけど、これもだめなんか protocol ProtocolA {} enum Hoge<T: ProtocolA> { case fuga(T) case piyo(T) var count: T { switch self { case .fuga(let count), .piyo(let count): return count } } }
Avatar
パターンマッチ関連のおもしろ記法と言えば前に教えてもらった↓かなぁ。 let a: Int? = 42 if case let a? = a { print(a) }
9:28 AM
Optional Binding よりも意味がわかりやすい。
Avatar
でた 左辺ハテナw
Avatar
あれそれIterator.next()が粉砕されるやつでは
Avatar
これって C で int *a = ...; *a = 42; って書くのと似てるよね。 (edited)
Avatar
@hiragram そのTが通らないのは謎やね
Avatar
だよね。
Avatar
見た目だけは似てますね・・・ > *a = 42
Avatar
いや、 *aint 型というのと、 a?Int 型というのが。
Avatar
a? は Int 型ではないですよね
Avatar
あ、これはInt型だから虐殺文法ではなかった
Avatar
代入文の左辺に書けるだけで a? は Optional<Int> だからこそ a の部分だけが Int
9:33 AM
この言い方だとCもそうだけど・・・
9:33 AM
Cは中身と外見が先にあってデリファレンスするけど、 Swiftのさっきの式は中身がそこで産まれるから逆な感じがする。
Avatar
逆か。 a?Int?aInt か。
9:35 AM
C は *aintaint *
Avatar
さっきのTが通らないの、Tにprotocol入れられたら壊れるからと思ったけど、今はconditionalな型パラはそもそもprotocol入らないので益々謎だ
9:37 AM
その条件付けサボってるのかな
9:39 AM
それか将来的にprotocolが来る可能性があって意図してそうやってるか
Avatar
抜けてるだけじゃねって印象
9:43 AM
@tarunon プロパティじゃなくてメソッドにしたらエラーメッセージがなんか愉快なことになったよ protocol ProtocolA {} enum Hoge<T: ProtocolA> { case fuga(T) case piyo(T) func value<T>() -> T { switch self { case .fuga(let value), .piyo(let value): return value } } } error: MyPlayground.playground:6:20: error: cannot convert return expression of type 'T' to return type 'T' return value ^~~~~ as! T
Avatar
9:44 AM
報告しよう
Avatar
as! Tいれると其の行はエラー消えるけどcase文の行がまたさっきのエラーでるんだけどね
9:44 AM
つまりvalueはTとして認識できてるんだからそのままコンパイル通ってもいいようなきがするんだけどそういうわけではない?
Avatar
不思議なエラーだ
Avatar
意図的に止めてそう
9:45 AM
protocol型で其れが出来ないのは、実際にはprotocol型そのものではなく存在型として振る舞ってることが関係してそうで
9:46 AM
型パラは常にprotocolが当てられることを想定した振る舞いになってる
9:46 AM
TとTが違うよは意味分からんけどprotocolのそれを踏まえて考えると然もありなん
Avatar
文脈的に1個目のTと2個目のTが違う型の可能性ある可能性あるからってことよね
Avatar
だね
9:49 AM
ただまあエラーメッセージは適切ではないから報告はしといてよさそう、回答も貰えるといいね
Avatar
どっから報告するんだっけ。
Avatar
bugs.swift.org
Avatar
あとで暇みつけて書いておく
9:50 AM
こっちの書き方はちゃんとやってくれてうれしい typealias Tuple = (Int, String) enum Hoge { case fuga(Int) case piyo(Tuple) var value: Int { switch self { case .fuga(let value), .piyo((let value, _)): return value } } }
9:54 AM
piyoにくっついてくる値がIntのプロパティをもつようなstructで、caseまとめて書く記法のなかでそのstructのIntのプロパティ取り出せたら便利かと思ったけどそこまでごちゃごちゃしてるならcase分けるわな
Avatar
struct のプロパティとかをパターンで抽出するの、昔 swift のソースに無効化された状態であったけど、やらない雰囲気だからって消された覚えがあります。
Avatar
おおっ
Avatar
別件で Array の要素とマッチさせるのは evolution に何度か上がってた記憶ありますね。
9:59 AM
case let [first, second, third]: みたいな。
Avatar
おー。
10:02 AM
この場合要素数が2だったらこのcaseにマッチしなくなるのか (edited)
Avatar
そんなのがあったのか〜
Avatar
error: MyPlayground.playground:6:20: error: cannot convert return expression of type 'T' to return type 'T' return value ^~~~~ as! T これは真っ当なエラーでは…
Avatar
というか、タイプの T使うなら func はこの場合Genericsにすべきでないですね。
Avatar
見逃してた
11:14 AM
<T>ついてるw
Avatar
あ、ほんとだ。
Avatar
あっ
11:14 AM
ごめんなさい 🙏
11:15 AM
↑それさっきやらかした
Avatar
タイプの型パラshadowしたら警告出すとか有用なのかも。
Avatar
↑の例は Event と T だからshadowでもないんですよね・・・w
😇 1
11:17 AM
Array.Elementも結構引数で受けるときはT, U で書いちゃうし
11:18 AM
逆にそのような警告を出す機能があったら、ちゃんとした名前をいつでも使うように心がけるようにはなりそうだ。
Avatar
この余分なTあるとnever使えなくなって訳わからなくなるよね
Avatar
推論がコケるんだよねw
11:21 AM
すぐ気づけて良かった・・・
Avatar
ハマると、一度ハマった経験がないと気づけなくなる
Avatar
https://bugs.swift.org/browse/SR-1420 既に上がっていました。<型パラshadow警告
Avatar
要望っぽいものも上がってるんですね
Avatar
sublime text の syntax カラーリング わかってきた
3:59 PM
しかし既存の Swift プラグインは残念ながら tmLanguage 形式で
4:02 PM
これとがんばって連携していくか、 sublime-syntax 形式での対応を1からやるか・・・
Avatar
ほうほう、tmLanguage って TextMate のシンタックス定義なんですね。
Avatar
そのようです。SublimeText2まではそっちだったけど、SublimeText3から、tmLanguageも使えるけど、独自のsublime-syntaxを使おうねって感じ
4:04 PM
スタック付きの正規表現ベースのオートマトンみたいな仕組みっぽい
Avatar
Swiftのパーサ周りを読んでいたら、 TokentokTok が出てきて、
3:10 AM
Tok の定義が全然見つからないと思ったら Token 型のフィールド名が Tok だった・・・
3:12 AM
ちなみに tok は enum
Avatar
フィールド名を UpperCamelCase にするのは LLVM 文化特有なんですかねー。
Avatar
Googleは snake_case_ ですね、他のC++プロダクトをそんなに読んでないのでわからないですが
Avatar
やっぱりxcodeでリーディングしようと思ってclone,update,build-script --xcodeしてxcodeで開いて、
1:18 PM
プロジェクトのソースツリーのカオスさに笑ってる
Avatar
ソースツリー役に立たないから検索ばっかしてる
Avatar
Swift がオープンソースになってしばらく経ちます。 コンパイラや標準ライブラリの開発に手を出してみたいけど、リポジトリを落とした後どうしていいかわからない!という方のために、まずは開発環境の構築方法をご紹介します。基本的には[RE...
1:19 PM
この記事のスクショとすこし違ってる(Sourcesが無い)
1:21 PM
ひらりがこの前言ってた、ファイル名あいまいジャンプできるやつ
1:21 PM
役に立ちそう
Avatar
⌘⇧Oと⌘⇧Fめっちゃ使うけど結構迷子になるからソースツリー+差分と履歴も使う
1:24 PM
ソースツリーの下の検索ボックスの横に時計とgitマークあるので、onにすると最近見たファイルとか差分のあるファイルで絞り込めてソースツリーが使い物になるようになる
Avatar
なるほど
1:26 PM
あ、あった、ここらへんだ
1:26 PM
swift/lib/XXX のディレクトリごとに対応するターゲットがあった
Avatar
え、、、
1:27 PM
俺は一体今まで何を、、、、
Avatar
上から60%ぐらいのところに
1:28 PM
swiftIndex , swiftIDE, swiftIRGen, swiftParse
1:28 PM
などのグループがあって、それぞれの中に、SourceFilesとHeaderFilesが入ってて
1:29 PM
1:29 PM
ここらへんの lib/ XXX / CMakeList と対応してるっぽいね
Avatar
なんか、グループの作られ具合、CMakeのバージョンによっても違うのかも。
Avatar
CMakeList一個が一個のターゲットになってて、Xcodeに噛み合わないやつは、そのままCmakeをたたくだけのスクリプトターゲットになってて、 オプション違い?もバラバラに生成されるから、こんなカオスなのだな
1:31 PM
xcodeprojの生成自体は完全にcmake側の機能に任せてるんですかね?
Avatar
そのはずですね。 CMake -G Xcode
Avatar
なるなる
1:34 PM
おっしゃー
1:34 PM
Tok でジャンプできたぞw
1:34 PM
1日消えたw(途中で寝落ちしてた (edited)
Avatar
--release-debuginfo --xcode でビルドしたら
4:43 PM
clang: error: no such file or directory: '/Users/omochi/work/swift-source/build/Xcode-RelWithDebInfoAssert/cmark-macosx-x86_64/src/Debug/libcmark.a' と出ていて (edited)
4:43 PM
実際には /Users/omochi/work/swift-source/build/Xcode-RelWithDebInfoAssert/cmark-macosx-x86_64/src/RelWithDebInfo/libcmark.a
4:43 PM
が生成されているので
4:44 PM
--release-debuginfo なのに cmark は --debug で参照しちゃっててうまくいってないみたいなんですけど
4:46 PM
--xcode は作業用、 ninja でビルド するのが良いのか? release-debuginfo があまりメンテナンスされていないので、 release にするのが良いのか? とか、どうなんでしょう
Avatar
あら、 Releaseでやっても同じところでコケた
Avatar
あっ!
7:17 PM
なるほど、build-scriptに渡したconfigurationとは別に、xcode側のいつものconfigurationをちゃんと設定しないといかんのか。
Avatar
スナップショットの出てるコミットでやってるけど、下記でコケてしまうので、 --xcode のせいなのか、そうでないのか調べるために ninja でもやってみます。 /Users/omochi/work/swift-source/build/Xcode-ReleaseAssert/swift-macosx-x86_64/Release/bin/swiftc -apinotes -yaml-to-binary -o /Users/omochi/work/swift-source/build/Xcode-ReleaseAssert/swift-macosx-x86_64/Release/lib/swift/macosx/x86_64/ScriptingBridge.apinotesc -target x86_64-apple-macosx10.9 /Users/omochi/work/swift-source/swift/apinotes/ScriptingBridge.apinotes
Avatar
いけた。
Avatar
下記がエラーになる件、 /Users/omochi/work/swift-source/build/Xcode-ReleaseAssert/swift-macosx-x86_64/Release/bin/swiftc -apinotes -yaml-to-binary -o /Users/omochi/work/swift-source/build/Xcode-ReleaseAssert/swift-macosx-x86_64/Release/lib/swift/macosx/x86_64/ScriptingBridge.apinotesc -target x86_64-apple-macosx10.9 /Users/omochi/work/swift-source/swift/apinotes/ScriptingBridge.apinotes 出力先 /Users/omochi/work/swift-source/build/Xcode-ReleaseAssert/swift-macosx-x86_64/Release/lib/swift/macosx/x86_64 が存在してなかったが、 /Users/omochi/work/swift-source/build/Xcode-ReleaseAssert/swift-macosx-x86_64/Release/lib/swift は存在していたので、 mkdir してやったら、いけました。
Avatar
あれっ
3:47 AM
同じ問題が再現したら報告しようとおもって改めて別マシンでやっていたのだけど
3:47 AM
ビルドできてしまった。
3:48 AM
snapshot 11/22から11/23に変更したのが良かったのか、 最初からschemeをちゃんとReleaseにしたのが良かったのか、わからんけど・・・
Avatar
#swift スレの話題がエッジな概念ばかりでてきてて笑うw
Avatar
has-a パターンを作るときに、機能Xをhas_aで合成する事を表すプロトコルも一緒に定義すると、
3:48 AM
エクステンションも併用するとフィールド定義するだけで一通りのプロパティとメソッドが自動的に生える
3:48 AM
って事ができて便利だなってなってる
3:49 AM
class ViewBindingHelper<Model> { ... } protocol ViewBindingHelperUser { associatedtype Model var helper: ViewBindingHelper<Model> { get } } extension ViewBindingHelperUser { 追加される機能 }
3:49 AM
こうしておいて
3:50 AM
class ProductListTableView : NSTableView, ViewBindingHelperUser { let helper: ViewBindingHelper<ProductList> = .init() } (edited)
3:50 AM
使う側ではこうやって1行書くともろもろ生える
Avatar
これやると諸々のフィールドが他のhas_a関係のprotocoolのフィールドと名前がかぶって…となってとてもつらい (edited)
Avatar
名前がかぶっちゃうシチュエーションでは User の方のプロトコルコンフォーマンスは解除して、 .helper.method でヘルパ名をネームスペース代わりにするしか無さそう。
Avatar
でもまあこのやり口めちゃくちゃ便利なのはそうで
Avatar
ヘルパオブジェクト以外にも依存メソッドがある場合はどうしようもないね、helperのinitにクロージャで注入しようとかになるね
Avatar
subviewとかで使うと捗る場面が結構ある
Avatar
継承したカスタムビュークラス複数で共通の機能とか?
Avatar
そうそう
Avatar
カスタムビューだと継承で親クラスが注入できないからか。
Avatar
Viewだとclassなのでmix-inみたいなことはできなくて
3:55 AM
protocolベースで定義してそれをhas-a関係でprotocolでガチャガチャ組み立てていくと、mix-inみたいな感じで書ける(読めるとは言っていない)
Avatar
わかるなあ
Avatar
protocol MyViewProtocol { var button: Button { get } } protocol HasMyViewProtocol: MyViewProtocol { associatedtype MyView: MyViewProtocol var myView: MyView { get } } extension HasMyViewProtocol { var button: Button { return myView.button } }
3:57 AM
こんな感じだ
3:58 AM
そうするとMyViewをsubviewとして持つ全てのImplementationが、buttonにアクセスできるし、functionの実装をextension MyViewProtocol に置けば全部使えるようになる
Avatar
あ〜HasXそれ自体もXにするのか
Avatar
「Swiftの暗黒面」じゃない?🤔 https://qiita.com/tarunon/items/844958accc4391097d97

はじめに

SwiftのOptionalを取り巻くあれやこれやについて考えを整理しつつ書きます。 多くの人にとっては役に立たない雑多な話題かもしれません。差し当たりSwift EvolutionのDraftのDraftぐらいの話でし...
Avatar
立派な暗黒面ですよ
7:14 AM
このままABI安定化とかいい出したらオシマイです
Avatar
タイトルが「Swiftの暗黒面」になるのかと思ってました🙃
Avatar
いつもの話のまとめなので、ここの人たちには新鮮味が無さそうなのはちょっと申し訳ないですね 🙏
Avatar
むしろ、ここで話されたことをまとめていくのが大事な気がしてます。
Avatar
それはそうw
7:20 AM
ディスコまとめ人いない問題
Avatar
パーマリンク無いと無理無理…
Avatar
まあ、 iOSDC や try! Swift で発表していくのがいいかと。
7:21 AM
あ、 Swift Tweets もありますよwよかったらどうぞ🙂
Avatar
We already have the ability to quickly go through pinned messages and recent mentions that bring us towards a certain position in the chat to view that message. And even more recently got the new search feature that is an even more powerful version of that. It would be nice if we can have the ability to obtain and post a permalink of a message where people can click on it and will directly be brought to the position of the original message, instead of having us to manually get users to search for an older message we want them to see.
7:21 AM
みんなも!さあ!
Avatar
omochimetaru 12/7/2017 7:21 AM
@koher Discord Offline登壇のために東京来る予定ありませんか
Avatar
Kishikawa Katsumi 12/7/2017 7:22 AM
投票しました。
🙆 4
Avatar
@omochimetaru 出張と重なるのが理想的です。
Avatar
omochimetaru 12/7/2017 7:22 AM
そうですよね、なんかいい出張予定があるといい
Avatar
今年は会社の忘年会やらずに新年会やるらしいからそのとき行くかもだけど、さすがに Discord Offline の開催間隔が狭すぎる気が。 (edited)
Avatar
@Kishikawa Katsumi すみませんダブリだった。こっちにもお願いします https://feedback.discordapp.com/forums/326712-discord-dream-land/suggestions/17828437-msg-id-jump
Transform <#msg_id> links into "jump to message" button (like in pins). Alternatively, an inline quote (with a jump button). Right-click a message to extract said id.
Avatar
Kishikawa Katsumi 12/7/2017 7:24 AM
そっちも投票済みです 💯
💯 3
Avatar
omochimetaru 12/7/2017 7:26 AM
なるほど>しんねんかい
Avatar
投票しました ( ・`ω・´)
🙏 2
Avatar
norio_nomura 12/8/2017 1:57 AM
Swift 4.1で-swift-version 3を使うとSwift 3.3になるぽい。 $ TOOLCHAINS=org.swift.4120171207a swift -swift-version 3 Welcome to Apple Swift version 4.1-dev (LLVM 67b9a8e8c2, Clang e617c83242, Swift 65b4172032). Type :help for assistance. 1> #if swift(>=4.1) 2. let versions = "swift-4.1" 3. #elseif swift(>=4.0.3) 4. let versions = "swift-4.0.3" 5. #elseif swift(>=4.0.2) 6. let versions = "swift-4.0.2" 7. #elseif swift(>=4.0) 8. let versions = "swift-4.0" 9. #elseif swift(>=3.3) 10. let versions = "swift-3.3" 11. #elseif swift(>=3.2.3) 12. let versions = "swift-3.2.3" 13. #elseif swift(>=3.2.2) 14. let versions = "swift-3.2.2" 15. #else // if swift(>=3.2) 16. let versions = "swift-3.2" 17. #endif 18. versions: String = "swift-3.3" 18> (edited)
👀 3
Avatar
@tarunon RxSwiftのBehaviorSubjectから値を取り出すとき subject.value() がthrowsなのってなんでなんだろ
Avatar
Errorを購読したらそれ以降はErrorだからやね
Avatar
omochimetaru 12/8/2017 4:50 AM
BehaviroSubjectってそうなのか〜
Avatar
subject.onErrorか
4:50 AM
あー。
Avatar
omochimetaru 12/8/2017 4:50 AM
なるほど〜
Avatar
なるほど。
4:51 AM
VariableはObserverじゃないからErrorにはなりえないけど、BehaviorSubjectはありうるってことか
Avatar
そやね
4:51 AM
今後はBehaviorRelayをつかおう
Avatar
RxSwiftアップデートせなな…
Avatar
BehaviorSubject でやってしまったマン
Avatar
RxSwift。。。とてもムズカシイです😱
Avatar
#swift の裏番組になりますが、assertやpreconditionを「落ちたり落ちなかったりするチェック」として使ったことなかったなー
Avatar
#swift-2 の分解能の話で思い出したけど、AVAudioFile もなぜか AVAudioFramePositionInt64 なのに AVAudioFrameCount は逆に UInt32 しかないという不可解な現象 https://qiita.com/lovee/items/8bdf7b58d96d683d31b9
この記事はゆめみ Advent Calendar 2017 の 1 日目の記事です。 また、本記事は実は下書きのまま 1 年近く寝かされ...
Avatar
↑それは AUAudioFrameCount で自分が上げたのは AVAudioFrameCount なんですよな…
9:03 AM
それにcountがuint32でpositionがint64になっている現象についての説明もありません
Avatar
This alias is type `uint32_t` for impedance-matching with the pervasive use of `UInt32` in the Audio Toolbox framework and the C Audio Unit framework APIs, as well as the `AVAudioFrameCount` data type. (edited)
Avatar
AU じゃなくて AV か。
Avatar
じゃあpositionはなぜInt64なのか
Avatar
ん、ちょっとまって、
9:06 AM
AVAudioFramePosition: Int64 A position in an audio file or stream. (edited)
9:06 AM
UInt64のこっちは ファイル or ストリームだからバイトオフセットで
9:06 AM
AVAudioFrameCount: UInt32 A number of audio sample frames. (edited)
9:07 AM
こっちはサンプルフレームの数
9:07 AM
だから、良いんじゃないですか?
9:08 AM
いや、不自然か?
9:08 AM
8bitステレオオーディオなら1フレーム2バイトだから
9:08 AM
あ、でも、 var length: AVAudioFramePosition { get } AVAudioFileの長さ自体は Int64の方の型ですね
9:09 AM
AVAudioFrameCountは小さいチャンクを扱うときにしか使われてないとかじゃないでしょうか
9:09 AM
リアルタイムAPIで0.2秒分の波形が来る、とかそういう時のフレーム数を表現する用で
9:09 AM
長い曲データの先頭からの完全なオフセットを数える型ではないとか。
Avatar
そもそもpositionはcountを超えたり負になったりする可能性ってあります?
Avatar
非圧縮のWAVファイルで44.1kHZなら 97,391秒だから 27時間分の録音データとかならありえるのでは
9:13 AM
iOSなら死んじゃうけどもともとMacのAPIだし。
Avatar
positionもバイト数のオフセットじゃなくてフレームのポジションなのでそもそも取りうる範囲は0..<countになるはずなんじゃないかと思うのですが…
Avatar
ファイルの長さは 0..<count じゃなくて 0..<length みたいですよ length The number of sample frames in the file.
9:13 AM
lengthの型は var length: AVAudioFramePosition { get }
9:14 AM
↑ここをみてます
9:16 AM
AVAudioFrameCount (32bitの方の型 ) が出て来るAPIは func read(into buffer: AVAudioPCMBuffer, frameCount frames: AVAudioFrameCount) throws があるみたいです、こっちはバッファに一部を読み取る命令だからサイズが全体より小さくてもおかしくないと思う。
Avatar
var length: AVAudioFramePosition The number of sample frames in the file. typealias AVAudioFrameCount A number of audio sample frames. この説明がすでに色々理不尽な気が…(CのAPIに合わせてるのなら逆にじゃあなぜCではcountだけが32bitなのか…
Avatar
まあその2行だけ見ると意図が不明ですね
9:18 AM
AppleのローレベルなAPIにはよくある・・・
9:20 AM
ComponentResult AudioUnitRender( AudioUnit ci, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inOutputBusNumber, UInt32 inNumberFrames, AudioBufferList* ioData ) inNumberFrames The number of frames to be rendered. (edited)
Avatar
SInt32 startBufferOffset これだけ読むとやはりCでは両方32bitにしてるけどAVFoundationがなぜかpositionだけ64bitにしてるんですよね… (edited)
Avatar
startBufferOffset The starting point of the event, after the beginning of the render.
Avatar
64bit化したNSFileManagerあたりとの連携のため?
Avatar
これは曲ファイル全体でのオフセットではなくて
9:21 AM
あ、いや、そうなのか?
9:21 AM
beggining of renderはプレゼンテーションの開始時刻か
9:22 AM
27時間で壊れそう
Avatar
あ多分再生位置のオフセットはこれかな? UInt32 bufferOffset; bufferOffset Where in the current buffer the event should occur (edited)
Avatar
↓ちょっと違うけどひどいと思うやつ。 GL_PROJECTION // Int32 glMatrixMode(GLenum(GL_PROJECTION)) // Obj-C (C) ではそのまま渡せた (edited)
Avatar
ああー
9:25 AM
それ、 static var GL_PROJECTION: GLenum ってオーバレイ用意してほしいですね。
Avatar
うん (edited)
Avatar
もともと #define だったマクロがそのまま Int32 としてポーティングされてしまっている
Avatar
#defineの数値リテラル?は全部基本Int32になるよね (edited)
Avatar
そのままだとそうっぽいですね
Avatar
そういうことなんだ。じゃあ 32 ビット整数で表せないリテラルがあったら壊れる?↓みたいなの。 #include <stdio.h> #define BIG_NUMBER (0xffffffffffffffff) void printHex(unsigned long long number) { printf("%llx\n", number); } int main(void) { printHex(BIG_NUMBER); return 0; }
Avatar
そもそも #define NAME "aaa" みたいなのもありえるので
9:45 AM
なぞです
9:45 AM
とりあえず収まる整数だけInt32としてインポートしてくれるのかも?
Avatar
単純な #define は型を判定してるのかな?
Avatar
たぶんそうだと思います
Avatar
式が書いてあったりしたらどうしてるんだろ?
Avatar
見えないとか、静的に計算できるなら見えるとか?複雑なルールがある気がしている
9:48 AM
clang-importerの領域だと思う
Avatar
Appleのドキュメント、ヘッダファイル内のコメント拾えてないな。
10:02 AM
AVFoundation.framework/Frameworks/AVFAudio.framework/Headers/AVAudioTypes.h /*! @typedef AVAudioFrameCount @abstract A number of audio sample frames. @discussion Rationale: making this a potentially larger-than-32-bit type like NSUInteger would open the door to a large set of runtime failures due to underlying implementations' use of UInt32. TODO: Remove rationales. */ typedef uint32_t AVAudioFrameCount;
🙏 1
Avatar
つまり将来的には64bitになるっと
Avatar
うーん、そうは書いてないんじゃないかな。
Avatar
そもそも、データ全体をメモリにマップしなくて済む様にするバッファのサイズを指定するものっぽいから、音声データのビットレートが劇的に上がったりしない限りは32bitで済みそうな気がする。
Avatar
TODO: Remove rationales. は具体的に何を指しているのか… 🤔
Avatar
誰かと思ったら @lovee さんのアイコンが変わってた・・・
Avatar
いつまでも勉強会のスライドで版権イラスト載せるのはまずいと思って… 😇
2:29 AM
それでちょうど冬コミに本出すのに表紙イラストをココナラで頼んだからそれをアイコンにすることに
🙂 4
Avatar
Java で intdouble に暗黙の型変換されてて、 double c = a / b;ab が Android の API のコールで int が返される)の精度が落ちてしまっている事例が社内で発覚した。やっぱり数値間ですら暗黙の型変換を許さない Swift の方向性は正しかったんだ〜😂 (edited)
😭 4
Avatar
そのバグ何度も踏んできたから / 書く時はトラウマが呼び起こされてミスしない体になった
7:56 AM
Swiftだと c の型を書かずに let にしていた結果、 Int のまま以降の行まで型推論が伝搬していって、
7:56 AM
渡すところで Double で明示的変換するんだけど、除算はずっとまえに書いてるからやっぱり気づけ無い
7:56 AM
みたいなパターンもあって
7:57 AM
/ 書く時は周囲に型をだいぶ明示的に書きたくなる
7:58 AM
let t = 1 / 2 ... なんか処理 ... TimeInterval(t)
7:58 AM
↑コンパイル通るし 0 の TimeInterval ができちゃう
Avatar
オーバーロードが終端だと全く気づくチャンスがないのか…
Avatar
そうなんだよねえ
8:03 AM
言語によっては / は常に実数除算への昇格で、 整数のあまり切り捨て除算は別の演算子になってることもあるね。
Avatar
Python はそうだね。
Avatar
pythonがそうでしたっけ
Avatar
$ python Python 3.6.1 (default, Apr 19 2017, 14:30:24) [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.41)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> 3 / 2 1.5 >>> 3 // 2 1
Avatar
おお。 // があった気がしてたけどpythonか。
8:13 AM
pythonはコメントが # だからいけるのかw
Avatar
JSONEncoderconvertToSnakeCase myURLPropertymy_url_propertyに変換するのだけれど、JSONDecoderconvertFromSnakeCasemy_url_propertymyUrlPropertyへ変換するので、デコードに失敗する。 https://bugs.swift.org/browse/SR-6629
Avatar
きびしそう
Avatar
あれ?
11:35 AM
プロパティ名のほうは固定だからどちらでも生じるのは myURLProperty -> my_url_property の変換かとおもってた
11:36 AM
プロパティが myURLProperty, JSON上では my_url_property って関係性は静的に固定できてると
Avatar
convertFromSnakeCaseの実装がまずい。既存CodingKeysstringValuelowercasedとJSONのキーから_を削除した文字列を比較して、一致するCodingKeysメンバを決定しないといけない。 (edited)
Avatar
CodingKeys の stringValue から、 encoder側の convertToSnakeCase と同じ変換をかけてから
11:40 AM
そのキーで JSON のバリューを読めば、ストレートな処理になりませんか?
11:40 AM
KeyedContainer にいったん変換する過程で情報が失われちゃう?
Avatar
ああ、そっちの方が良いかも。
11:42 AM
やっぱりStringに汎用のsnake_casedプロパティとかあった方が良さそう。
Avatar
CodingKeys の stringValue から、 encoder側の convertToSnakeCase と同じ変換をかけてから そのキーで JSON のバリューを読めば、ストレートな処理になりませんか? 今の実装のconvertFromSnakeCaseが色々な表記ゆれをサポートしてるせいで、その方法で上位互換にするのは無理かも。 (edited)
Avatar
表記ゆれは中でサポートせずに外で指定する形にしないと解決でき無さそう
Avatar
ウウム・・・
Avatar
YAMLDecoderで試しに実装してみた。 https://github.com/jpsim/Yams/pull/92
#84 This uses different algorithm on KeyDecodingStrategy from apple/swift#12779 that exprimenting to fix SR-6629.
3:55 AM
#84 This uses different algorithm on KeyDecodingStrategy from apple/swift#12779 that exprimenting to fix SR-6629.
Avatar
「CodingKeysのString から JSONでのキー表現への変換」をする関数を EncoderとDecoderに渡せれば(つまり、convertToSnakeCase などの モードの custom クロージャ版)、1:1対応は全部いけそう。
3:58 AM
今のJSONDecoderは同時に一つのプログラムで、1つのプロパティにたいして複数の文字列表現を受け付けられるわけだけど
3:58 AM
個人的にはその需要は無いと思う。
3:59 AM
それって読み込もうとしてるJSONがそもそも同じ値を表現するために2種類以上のキー表現をバラけて使うということなんで
3:59 AM
そんなん起こらんと思う・・・
3:59 AM
もし起こったらシコシコ init(from decoder) 書けば良いし。
Avatar
そうなんだよね。今のJSONDecoderの実装は無駄に凝りすぎだと思う。
Avatar
同じオブジェクトを表すJSONの形式が複数ある場合は考えられるけど、それはデコーダで対応するんじゃなくて、そのそれぞれのJSONに対応した型を定義して、その先で変換したほうが良い
4:01 AM
そうじゃないと絶対ぐちゃぐちゃになる
4:04 AM
まあFoundation/JSONEncoder/JSONDecoder は、困った事があったら自作や他人の実装使えばいっか、って思ってます
Avatar
objcで定義されたenumに対してswitchをSwiftで書いたとき、どれにもマッチしないときには最初のcaseにマッチしたように動いているようですが、これってSwiftの言語仕様で定義された動作ですかね? typedef NS_ENUM(NSInteger, State) { StateHoge = 0, StateHuga = 1, }; Swift: let state = State(rawValue: 100)! switch state { case .hoge: print("hoge") // ★↑これが実行される case .huga: print("huga") }
Avatar
State(rawValue: 100)nil にならないところが Swift 的に変で、そこのチェックが漏れてるのかもしれませんね。
Avatar
https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html objcのenumを非定義の値で初期化できるのは、Swift Language Fixesの3つ目を見た感じ、意図した動作のようではあるのです。
9:37 AM
Imported NS_ENUM types with undocumented values, such as UIViewAnimationCurve, can now be converted from their raw integer values using the init(rawValue:) initializer without being reset to nil. Code that used unsafeBitCast as a workaround for this issue can be written to use the raw value initializer.
Avatar
@rikusouda state.rawValue100 ですか? 0 ですか?
Avatar
100です (実際には少し違うコードでやっていますがenumに定義していない値がrawValueで保持されています)
Avatar
予想ですが、そういう状況で switch で何が起こるかは仕様として決まってないんじゃないかと思います。
Avatar
バグでいいんじゃないかと。 enums.h #include <Foundation/Foundation.h> typedef NS_ENUM(NSInteger, State) { StateHoge = 0, StateHuga = 1, }; main.swift public func foo(state: State) -> Int { switch state { case .hoge: return 1 case .huga: return 2 } } let s = State(rawValue: 100)! print(foo(state: s)) 実行 $ swift -import-objc-header enums.h main.swift 1 $ swift -O -import-objc-header enums.h main.swift 2 (edited)
9:55 AM
-O 有無で結果が違うのはちょっと受け入れられない。
Avatar
未定義動作なんでしょうね。。。
9:56 AM
未定義というか、バグで不定の動作をしてしまっている。
Avatar
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
当面はなんらか回避する必要がありそうですね。。。
Avatar
ありがとうございます🙏
Avatar
Numeric って ExpressibleByIntegerLiteral を継承してるのに Int のイニシャライザに Numeric を受けるやつないのか…?
4:49 PM
IntにできないNumericってあるのか?
Avatar
// Integer literals are limited to 2048 bits. というコメントが。 https://github.com/apple/swift/blob/0cf1b52452f56b3bbdf2f2305cc10fef42bdff8b/stdlib/public/core/Policy.swift#L99 (edited)
swift - The Swift Programming Language
Avatar
@hiragram 整数から生成できることと整数に変換できることは別じゃないですか?
1:07 AM
たとえば、複素数は整数から生成できるけど整数には変換できない。
Avatar
レス遅れてすみません。複素数の例でだいぶ納得しました。
1:54 AM
"整数にできる" (=確実にIntにできる) みたいな意味のNumeric関連のプロトコルってなさそうですよね
1:58 AM
NumericExpressibleByIntegerLiteral なのはよくわかんないですよね。行列とかで使えなくなっちゃいますし。
1:58 AM
まあ、 number じゃないから numeric じゃないのかな?
Avatar
行列って "数" 扱いなんですか?数学的に
1:58 AM
"数値" か
Avatar
数が実数を指すなら数じゃないですね・・・
1:59 AM
Numeric よりも、群・環・体 https://qiita.com/taketo1024/items/733e0ecf12da359db729 みたいなプロトコルほしいですよね。
どうも、佐野です。前回の記事 で整数は「環」、有理数・実数・複素数は「体」であるという話をしました。今回は「群・環・体...
👍 1
Avatar
プリミティブな"数値" ではないんじゃないかなーというイメージがありました
Avatar
もしくは、 Addable, Multipliable とかの方がプログラミング的には使い勝手がいいのかも?
Avatar
割り算で変な別れ方になってるしそっちのほうがいっそ良いかも
2:05 AM
現状だとBinaryIntegerFloatingPointで分けて実装してるのが一本化できる
Avatar
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
Swift の String って subscript { set } ができないからイミュータブルなのかと思ってたけど違った。 1> var s = "ABC" s: String = "ABC" 2> s.removeLast() $R0: Character = { _representation = smallUTF16 { smallUTF16 = 67 } } 3> print(s) AB
7:55 AM
普通にappendありますよ
Avatar
うん、そっちも見つけた。
8:04 AM
subscript { set } ができないのは、 Character が何バイトか定まらないから O(1) で実現できないからか。
Avatar
あ、ああ、 subscript { set } ができない って事を知っていたんですね、そっちを知らなかった。
Avatar
EasyText みたいな方式にしないと O(1) の subscript { set } を実現できない。
8:07 AM
append とか removeLast とかって MutableCollection についてるのかと思ってたけど違った。で、 subscript { set } がないから StringMutableCollection じゃないだろう→ appendremoveLast もないだろうと思って勘違いしてた。 https://developer.apple.com/documentation/swift/mutablecollection (edited)
8:08 AM
確かに末尾に追加・削除なら String でも平均 O(1) で実現できて問題ないのか。 (edited)
11:56 AM
faillthroughで遊んでたけど、実際Swiftにおいてどんなユースケースがあるんだろう。
Avatar
Kishikawa Katsumi 12/22/2017 12:08 PM
faillthrough のユースケース?それとも^のコードですか?
Avatar
ユースケースです。上のコードが想定された挙動だということは理解できたんですけど、実際failthrough書くことあんまりないなと思ってまして。 (edited)
Avatar
Kishikawa Katsumi 12/22/2017 12:11 PM
failthroughを使うことはあまりないと思いますよ。だからこれまでのC言語系の文法だとデフォルトがfailthroughだったのをやめたわけで。
12:13 PM
func tokenize(source: String) -> [Token] { let state = State(input: source) for character in state.input { switch state.mode { case .plain: switch character { case "'": state.mode = .symbol case "\"": state.mode = .string case "\n": state.mode = .newline state.storage = "" case "(", ")", ":": state.tokens.append(Token(type: .token, value: String(character))) case " ": break default: state.mode = .token state.storage = String(character) }
👍 1
12:13 PM
^ こういうのとか使うかもしれないけど、caseにカンマで区切ってもかけるから、結局書かない。
12:14 PM
滅多に使わないので下手に使ってfailthroughを見落として下に抜ける方が罠っぽくなるし。 (edited)
12:14 PM
と思います。
Avatar
昔ってカンマ区切り書けなかったんでしたっけ?カンマ区切りあるから本当に出番少ないよなぁという印象です
Avatar
Kishikawa Katsumi 12/22/2017 12:16 PM
Swift 2あたりでデフォルトで下に抜けなくなってfallthroughが入ったんじゃなかったでしたっけ? (edited)
Avatar
そこはさいしょからだったような🤔
Avatar
Kishikawa Katsumi 12/22/2017 12:17 PM
最初からっぽいですね。
Avatar
確か最初からだったはず。さっきはった画像みたいな挙動してほしくないなー。
Avatar
Kishikawa Katsumi 12/22/2017 12:18 PM
Swiftにfallthroughいらないんじゃないというのは同意です。
Avatar
ですね。
Avatar
原因不明だけどなんかスターが急に40-50くらい増えた🤔 https://github.com/koher/EasyImagy
EasyImagy - Makes it easy to process images in Swift
🌟 7
Avatar
以前アドバイスをいただいたMVVMのリファクタリングの記事を公開できました!ありがとうございました!https://qiita.com/Kuniwak/items/015cddcf37e854713a2e
この記事は、RxSwift が提供する公式のサンプルである RxExample で行き詰まった方向けに、実践的な対処方法を紹介します。具体的には RxExample にある MVVM (Model-View-ViewModel) を真...
👏 4
Avatar
This PR changes post increment (and decrement) to pre increment for simple increment case. I think that it is helpful for other new contributors to avoid small fix such like #13572 (comment) . In t...
😅 1
Avatar
2 分w
Avatar
EasyImagy - Makes it easy to process images in Swift
⭐ 2
7:12 AM
これまで CI サボってたけど、スター増えてるからビビって Travis の設定した。 https://github.com/koher/EasyImagy/blob/dev-0.4.0/.travis.yml
EasyImagy - Makes it easy to process images in Swift
7:14 AM
gysb - Generate your swifty boilerplate
AnyObjectConvertible - Convert your own struct/enum to AnyObject easily.
Himotoki - A type-safe JSON decoding library purely written in Swift
APIKit - Type-safe networking abstraction layer that associates request type with response type.
Stencil is a simple and powerful template language for Swift.
Avatar
Swift on the Server continues to evolve. Since the launch of Swift@IBM in 2015, we’ve seen a lot of changes in the Swift language. As part of our collaboration with the server-side Swift community, we created tools like Swift Sandbox, enabling hundreds of thousands of developers to experiment with Swift on Linux. We also built the Swift …
😱 2
Avatar
Today, we announce the deprecation of Swift Sandbox and Swift Package Catalog, to take place in January of 2018.
Avatar
えー、 Swift Sandbox 便利なのに・・・。
7:21 AM
Apple 公式で Swift のオンライン実行環境作って欲しい。
Avatar
wandbox使うと良いかも https://wandbox.org
Avatar
Swiftにもこれ欲しいですね〜〜 https://play.rust-lang.org/
Avatar
Try Kotlin right in the browser.
7:31 AM
↓に色んな言語のオンライン実行環境のリストが。 https://qiita.com/koher/items/e4835bd429b88809ab33
この数年で null 安全 [^99] は一気に浸透したように思います。ざっと思いつくだけでも、次のプログラミング言語で null 安全 が採用されました。 | 言語 | null 安全 に関する公式の記述 | ...
7:31 AM
golangなんかトップページw
Avatar
Ceylon https://try.ceylon-lang.org/ や Crystal https://play.crystal-lang.org/ ですらあるのに・・・。
Avatar
Self hosted and embeddable Swift Playground solution with a third-party module support baked in.
2:28 AM
公式ではないですが。
Avatar
omochimetaru 1/10/2018 2:29 AM
#swift でも出てましたね 助かる
👀 1
Avatar
@tarunon RxBlockingをproductionで使うのってどうおもう
Avatar
場合によっては必要でしょ
Avatar
全部リアクティブプロパティにしておいて局所的に同期的に取りたいならRxBlocking使えばええやんの思考になってるんだけどさ
Avatar
できるだけ使わなくて済むようにするけどどうしようもないこともある
Avatar
でもreadmeには本番で使うなよって書いてるしなーみたいな
Avatar
あー
9:01 AM
まあそういう場合はBehaviorRelayが適切かね
Avatar
使うのをためらう理由、readmeに使うなって書いてある〜以外ないんだけど
9:01 AM
BehaviorRelayってバージョンいくつから使えるんだっけ
Avatar
4かな
Avatar
omochimetaru 1/10/2018 9:01 AM
Rxとか関係なくって非同期処理を同期的に待つのはバッドプラクティスだと思うけど。
Avatar
それはそうだけど、同しようもない場合があるにはあって
Avatar
omochimetaru 1/10/2018 9:02 AM
その間メインスレッドがフリーズしてUIが固まっちゃうよ。
Avatar
でもデリゲートメソッドなどで同期的にreturnしないといけないとことかあるやん
9:02 AM
同期的に取れるはずのところで取れなかったらエラーで落ちていいとおもってる
Avatar
結局それNSRunLoop使ったりしてたことを考えるとうーんという
9:02 AM
インジケータくるくる回って操作できないのと画面フリーズは本質的には同じやし、そういう体験は極力なくしていくのがベネ
Avatar
omochimetaru 1/10/2018 9:02 AM
同期的に取れるはずのところで取れなかったらエラーで落ちていいとおもってる
ん?これは
9:02 AM
ちょっと話しの前提が違う気がする
9:03 AM
それだったら、常に 即座に正常系が進むか、 即座にエラークラッシュするかだから、OKだと思う。
Avatar
うん
Avatar
omochimetaru 1/10/2018 9:03 AM
ブロッキングしてない。
Avatar
IUOみたいなもんだと思ってる
9:03 AM
あー。
Avatar
うん、それはBehaviorRelayやね
Avatar
Observableから値を同期的に取り出す手段としてRxBlockingをプロダクションに導入することの是非、を聞きたかったのが最初。
Avatar
そもRelayじゃなくてSubjectでもいいけど
Avatar
値が無かったら待つのではなくて普通に落ちてほしい
Avatar
じゃあBlockingの出番はない
9:04 AM
でー、初期値なしだとBehaviorSubjectは取り回しが悪いので、ReplaySubject(1)がおすすめかな
Avatar
omochimetaru 1/10/2018 9:04 AM
ReactiveEmitter - Lightweight observable in Swift seen from EventEmitter in JavaScript.
Avatar
RxSwift4系全然キャッチアップできてないのでせねばな〜
Avatar
omochimetaru 1/10/2018 9:05 AM
型としてはTだけど read before write がクラッシュする。 IUO と同じやね。 (edited)
9:05 AM
RxSwiftには BehaviorRelayとBehaviorSubjectとReplaySubject(1) があるのか・・・
Avatar
初期値適当に入れるのは嘘だから避けたいよねという話、ありますあります
Avatar
できればsubjectでも無い方が嬉しいんだよな
Avatar
えっと
Avatar
onNext()を勝手に手で呼べないでほしい
Avatar
Subject(Errorある)とRelay(Errorない)があって
Avatar
そうすると、Signal です?
Avatar
SubjectはPublish, Behavior, Replayがある。RelayはReplay以外がある。
9:06 AM
そうするともう一個自分で型をラップして作るのが良いと思うよ
Avatar
自分で言っておいてなんですが、Signal だと利用範囲が少なすぎますね・・・
Avatar
SignalってRACのSignalですか?
9:07 AM
Rx4でそういうのがはいったのかな
Avatar
いえ、RxSwift の Signal です
Avatar
RxSwiftのSignalはReplay, Error無しのHot川 (edited)
Avatar
Replayナシだと同期的に取れないすな
Avatar
あと Driver と同じくメインスレッドです
Avatar
結局やりたいこと事態は安全なオレオレVariableを作りたいぜって話っぽくって
9:08 AM
そのためにBlocking注入は些か乱暴な気がするな
Avatar
なるほど、パッと聞くと BehaviorRelay ですけど、read only にしたいのであれば tarunon さんのおっしゃる通りラップするのが適当に思いますね
Avatar
あー
9:09 AM
もしかしてオペレーターで適当に加工した値も同期的に取りたい、とかそういう意図もあるのか?
Avatar
それはないな
9:10 AM
なんというか
Avatar
一応、DriverとBehaviorRelayを使って丁寧に組めば出来るね。
Avatar
ふむ
9:10 AM
いいからとりあえずRxSwiftを3から4に上げろという話だな
Avatar
それはそうやね
9:11 AM
てかそれSwift3やろw
9:11 AM
Swift4つかお?
Avatar
RxSwift3 でも Variable のラッパーでもいい気がするのですが、そうでもないです?
Avatar
omochimetaru 1/10/2018 9:12 AM
PublishSubject, BehaviorSubject, ReplaySubject, PublishRelay, BehaviorRelay Publish: onで入れるとすぐ流れる、現在値無し Behavior: .valueに入れるとすぐ流れる、現在値として1個残る、valueのgetterで同期的に取れる、初期値が必要 Replay: 内部的に現在値として1個残る、getterインターフェースは無い、初期値は不要 Subject: next | error | compl が流れる Relay: next しか流れない これであってる?
Avatar
Replay:  はキャッシュする最大数を初期値で与えることが出来る
Avatar
omochimetaru 1/10/2018 9:13 AM
で、BehaviorRelay だと良さそうだけど駄目なのは、
  • 初期値が必要だけど初期値を使っちゃうシナリオはバグにしたい
  • 型的に on による書き込み口も見えちゃう
9:13 AM
の2点が ひらりの不満点?
9:13 AM
ああ、ReplayのNはN=1のときだけ考えた。
Avatar
あいや
9:13 AM
そもBehaviorRelayはぼくまだそれがある世界に居ないので不満などは無感情
9:13 AM
onが見えるのは嫌
Avatar
omochimetaru 1/10/2018 9:14 AM
で、ヒラリが考えてるのは、 onが見えるのが嫌だから、Subjectの型じゃなくて、Observableで外に出したいけど、 そうするとgetterインターフェースも消えちゃうから、 見かけ上subscribeすることになってしまうが、 そのsubscribeの実態は即座に現在値を返す「はず」 をコードで表明したい
Avatar
あ〜〜〜、それは思ったことありますね
Avatar
omochimetaru 1/10/2018 9:14 AM
あってる? @hiragram
9:15 AM
BehaviorRelay が無い世界の目線も考慮するのややこしいぞ・・・
Avatar
即座に返すことをコードで表明したい、というよりはIUOっぽく扱いたいなーくらいのライトな願望
Avatar
omochimetaru 1/10/2018 9:16 AM
protocol ValueProducer { associatedtype Value var value: Value { get } } ↑これ自作してさ
9:16 AM
BehaviorRelayをextensionでconformanceさせて AnyValueProducer<T> で返せば?
9:16 AM
protocol ValueProducer : ObservableConvertible { associatedtype Value var value: Value { get } }
9:17 AM
こうかな。(ObservableConvertibleを足した)
Avatar
RxBlockingのほうがなんか乱暴というのはわかって、まあやろうとしてることは乱暴(ストリームから同期的にその瞬間値を得ようとしている)だから適切に乱暴に見えるRxBlockingでいいんじゃないかなーみたいな気分に一周回ってなってきた
Avatar
BehaviorRelayを使ってラップすると冗長なので、ラップするならBehaviorSubjectをラップしたほうが良いかな
Avatar
サーバーサイドSwiftのプロジェクトにはRxBlockingガンガン使いまくってて結構感触いいのでアプリ側もこれ入れちゃっていいんじゃねみたいなのが最初の発言のきっかけです
Avatar
omochimetaru 1/10/2018 9:20 AM
RxBlockingを入れちゃうと
9:20 AM
あれってextensionで同期的に現在値取るメソッドとか生やすよね
9:20 AM
同期的でない普通のストリームにうっかり使っちゃうバグを差し込む恐れが無い?
Avatar
Observable.just(1).toBlocking().first
9:20 AM
toBlockingで明示的に変換しないと同期的に取れない
9:21 AM
それもこみでうっかり使っちゃうバグはまああるかも
Avatar
omochimetaru 1/10/2018 9:21 AM
あ、あとさ、
Avatar
やったこと無いけどタイムアウト設定できた気がするので同期的に取れなかったらerrorにするみたいなことできるはずなんだよね
Avatar
omochimetaru 1/10/2018 9:21 AM
toBlockingの内部ってNSRunLoop回してくれんのかな
Avatar
というと?
Avatar
タイムアウトはある
Avatar
omochimetaru 1/10/2018 9:21 AM
接続されてるタスクがメインスレッドに投入する非同期処理の場合にデッドロックしそう (edited)
Avatar
ハマったこと無いから明確に調べたことなかったけどありそう
9:22 AM
ちゃんと読んでないけど名前見る感じ大丈夫ぽ
Avatar
omochimetaru 1/10/2018 9:22 AM
iOS/MacOSの裏技で同期待ちをRunLoop回しながらやるとそれが消化できるけどエグいスタックトレースになる技がある
Avatar
ポ〜
Avatar
omochimetaru 1/10/2018 9:23 AM
RunLoop回しながらタイムアウト付きか、なるほど・・・
9:23 AM
じゃあ今言ったパターンのデッドロックの心配は無さそう。
9:24 AM
それもこみでうっかり使っちゃうバグはまああるかも
型付けしておけば同期的に取れないものに使っちゃう恐れは無くせる。
Avatar
後続の処理はブロックするけどスレッド全体をブロックすることはないってことでおk?
Avatar
omochimetaru 1/10/2018 9:25 AM
根っこがBehaviorSubjectとかならその型情報がどんどん伝搬してくる感じ。 あ、でも、mapとかしてたら無理だな。
Avatar
そこは高階型がないからね
9:25 AM
高階型あってもできないわすまん
Avatar
確かあれって実行された時の RunLoop にしか作用しなかった気がします
Avatar
omochimetaru 1/10/2018 9:25 AM
mapしたところでObservableに降格しちゃう
9:25 AM
@Kuniwak 違うRunLoopはそもそも回り続けてるから大丈夫?
9:26 AM
RunLoop A から wait して A を回しながらもそのタスクが RunLoop B 上のタスクを同期的に待つ、
Avatar
だと思います。スレッドごとにRunLoopが一つあったと思うので、それのいずれかが止まるという認識でした。ただ、あの辺りまとまったドキュメントがなくてはっきりと断言できないです
Avatar
omochimetaru 1/10/2018 9:26 AM
みたいな相互同期のケースとかで死ぬのかもしれん
Avatar
Observableに降格しちゃうはそうで、なので型で縛るというよりは見た目も込みで乱暴なことをここでしているんだぞという主張をしてほしいのほうが願いとしては強いかも
Avatar
omochimetaru 1/10/2018 9:26 AM
スレッドごとにRunLoopが一つあったと思うので
そこはそうですね
Avatar
try!で落とすのかtry?でデフォルト値にフォールバックするのかはそのへんの局所の都合に任せたい感じ
Avatar
omochimetaru 1/10/2018 9:27 AM
Observableに降格しちゃうはそうで、
うーむまあそうだよねえ
Avatar
BehaviorRelayとか上手に駆使してスマートなコードに見えちゃうほうが困るかも
Avatar
omochimetaru 1/10/2018 9:28 AM
スマートというかシンプルに見えると思ったけど降格があるので駄目だな
Avatar
その辺り、SharingStrategy みたいに Observable と別物にするとなると実装範囲がやばくて死にますよね (edited)
Avatar
Operator全部自分で生やす事になる
Avatar
omochimetaru 1/10/2018 9:28 AM
そこは高階型がないからね 高階型あってもできないわすまん
高階型があれば map とかを自身の型を返すように定義して一発でいけんのか?
(edited)
Avatar
イケる気がしたけどBehaviorRelayはObserver側もあるので
9:29 AM
MapはContraMapとのセットでないといけなくなるから色々破綻する
Avatar
omochimetaru 1/10/2018 9:29 AM
あー、そういうあれか
9:30 AM
それについては同期的に返せる方の型にいったん変換しないと駄目かもね
9:32 AM
@tarunon SubjectとRelayで思ったんだけど
9:32 AM
その話って、Subject<T, Error> になってて、 Never が bottom type なら、 Relay は Subject<T, Never> で表せるっていう @inamiy さんが言ってるやつかな
👀 1
9:33 AM
で、 Observable<T, Error, Sync> で Sync = Async | Sync なら
Avatar
いや、RelayとSubjectはCompleteの有無でも性質が異なるので
Avatar
omochimetaru 1/10/2018 9:33 AM
いまいった、同期的に取れるか、っていう情報も型パラで統合できる?
9:33 AM
extenstion でSync == Sync なら .first が生えるようにする。 (edited)
9:34 AM
Completeの有無
じゃあそれも必要になるな
Avatar
そもそもそのレベルで性質が違うものを型パラに統合する事の意義は…という (edited)
Avatar
omochimetaru 1/10/2018 9:34 AM
それだけだと使いにくいけどデフォルト型パラが言語機能にあれば見た目は隠せるんよな
Avatar
あー
Avatar
omochimetaru 1/10/2018 9:35 AM
統合する事の意義
そうすれば 「実装範囲がやばくて死」を回避できる
Avatar
デフォルト型パラがあれば現実的な実装になるのかな
Avatar
omochimetaru 1/10/2018 9:35 AM
共通の部分は共通で、 map してても、「同期的に結果が取れる川」って性質は型パラで渡していける
Avatar
確かにそれあるとすごい嬉しいですね
Avatar
それが可能なら、そもそもSharedSequenceとObservableの統合も出来るんじゃないかしら
Avatar
だと思います
Avatar
omochimetaru 1/10/2018 9:36 AM
(まあ気持ちは懐疑的です・・・)
9:37 AM
Completableの有無はあれか、ストリームが有限である保証の有無って感じか。
9:37 AM
来ないやつは無限抽象。
Avatar
Completable まで型パラメータにすると、決定不能なパターンがある気がします
Avatar
それ昔考えたんだけど
Avatar
Not Completable から take すると Completable になるかどうか問題みたいなニュアンスです
Avatar
それはthrowsの有無、catchErrorで.errorを返したかどうかとか含め
Avatar
omochimetaru 1/10/2018 9:39 AM
RxSwiftってSingleもあるよね、1個なやつ、だからCompletableがあるかどうかというより個数に関する型パラになるのかな。
Avatar
色々発生するので全部カバーする必要があります
9:39 AM
Completable、Maybeもあるよ
Avatar
omochimetaru 1/10/2018 9:39 AM
SingleがfilterでMaybeになるのはビビった
Avatar
え❗
9:39 AM
そうなの
Avatar
賢いですね
Avatar
そりゃそうでしょ
Avatar
へー
Avatar
omochimetaru 1/10/2018 9:40 AM
1だからfilterすると1か0になる。
9:40 AM
オーバーロードしてあって、ファントムタイプで・・・
Avatar
その辺全部カバーして全てが型で保証されて
9:40 AM
まあその結果、コンパイル時間が莫大になるのは想像に難くない
Avatar
SingleをflatMapでCompletableにするみたいなのできないのはなんでなん
Avatar
出来ないんだっけ
Avatar
直接はできないはず
9:41 AM
SingleのflatMapはSingleを返さないといけなかった
Avatar
Maybe返したらMaybe、Completabale返したらCompletableになって良い気はするが
9:42 AM
議論あったっけ?この辺カバーしないといけない範囲が尋常じゃないので
9:42 AM
触られていない可能性もあるよ
Avatar
いつもSingleをasObservableしてflatmapの中でCompletableをasObservableしてその後ろでasCompletableしている
9:42 AM
無駄だな〜と思いながら
Avatar
omochimetaru 1/10/2018 9:43 AM
www
Avatar
いやてか
9:43 AM
Single→asObservable→flatMap to Never type→asCompletableでよくない
9:43 AM
flatMapの中にCompletableはいらなさそう
Avatar
あ、まあ
9:44 AM
completableはどっかから持ってきたりする。
Avatar
そういうことね
9:44 AM
議論はIssueにあるかもしれない。flatMapに関してはゆるい方向にいけるはずだから
9:44 AM
Single -> Single, Maybe, Completable Maybe -> Maybe, Completable Completable (flatMapはない) になると思う (edited)
Avatar
そうだね
Avatar
⚠️ If you don't have something to report in the following format, it will probably be easier and faster to ask in the slack channel first. ⚠⚠️ Please take you time to fill in the fields below. If...
Avatar
andThen使えって書いてありますね
Avatar
omochimetaru 1/10/2018 9:46 AM
これっぽい
Avatar
andThen❗
Avatar
それ、最終的にこのIssueになったはず。 https://github.com/ReactiveX/RxSwift/issues/1248 (edited)
Short description of the issue: Some transforming and combining operators needs to be added to PrimitiveSequence, and some should be removed because they have no effects on some traits, such as Fla...
9:49 AM
andThenは T が受けられないからちょっと違う?
Avatar
そうね
9:50 AM
単に順番に実行するだけならできるけど、上流のnextを引数にCompletableを作るみたいなのはflatMapでしかできなそう。
Avatar
頻出するならとりあえずオレオレFlatMap作ったほうが絶対いいよ
9:52 AM
こっちはこっちで議論しなきゃいけないにしても
Avatar
あれ結局まだないのかな。。。
Avatar
オレオレflatMap了解
Avatar
MaybeのFlatMapでSingle返したらMaybeになるはずだ(はずだ)
9:59 AM
じゃあ @hiragram 議論頑張って、Sinkから実装もチャレンジしてくださいb
10:00 AM
あでも実態は普通のflatMapだからSinkはいらないか
Avatar
すげえ締め方されてた
10:23 AM
Sinkわからないとなという気持ちはあったので宿題のつもりでやってみようかな
Avatar
@koher: もしかして Swift って HashDoS の脆弱性がある?
#if _runtime(_ObjC)でのStringhashValueはそもそも文字列全体を使わないはずです。
Avatar
norio_nomura 1/12/2018 1:47 AM
「使わないはずです」ではなく「使いません」だった。 import Foundation let first32Char = repeatElement("f", count: 32) let middle32Char = repeatElement("m", count: 32) let last32Char = repeatElement("l", count: 32) let a = (first32Char + ["ab"] + middle32Char + ["ab"] + last32Char).joined() let b = (first32Char + ["bc"] + middle32Char + ["bc"] + last32Char).joined() a == b // false // Foundation a.hash // -4528083392938427260 b.hash // -4528083392938427260 // Swift.Hashable a.hashValue // -8957072229412966235 b.hashValue // -8957072229412966235
Avatar
omochimetaru 1/12/2018 1:48 AM
ほえ〜〜〜〜
Avatar
norio_nomura 1/12/2018 1:49 AM
Linuxでもhashは同じ。
Avatar
omochimetaru 1/12/2018 1:49 AM
まあ確かにHashの要件自体は満たす・・・
Avatar
norio_nomura 1/12/2018 1:49 AM
そう。
Avatar
ムズムズするw
Avatar
omochimetaru 1/12/2018 1:49 AM
面白い・・・😟
Avatar
norio_nomura 1/12/2018 1:51 AM
SwiftLintでhashをファイル変更検知に使ってバグってたことがあった時に調べた。 https://github.com/realm/SwiftLint/issues/1184#issuecomment-274744331
We have just updated to 0.16 in our codebase and I'm working through the new rules. First up it's sorted_imports. For this, we have a build phase which runs ${PODS_ROOT}/SwiftLint/swiftlint as per ...
😰 1
Avatar
omochimetaru 1/12/2018 1:52 AM
なるほど・・・
1:52 AM
まあ全長で使っていたとしても、辞書のキーに使う事を想定したハッシュと、処理時間をかけてもよく散らばらせる暗号論的ハッシュ関数では、後者を使う方が設計上よろしいでしょうね
Avatar
enum HogeType: Int { case aaa = 1 case bbb case ccc } ↑ この書き方嫌いなんですけど、意外と賛同してくれる人少ないんだろうかと思ってるんですがどうですか enum HogeType: Int { case aaa = 1 case bbb = 2 case ccc = 3 } IntのrawValueつけるなら全case明示してほしい。
Avatar
omochimetaru 1/12/2018 7:04 AM
C++だと上の書き方よくやる
7:04 AM
Swiftでもできるの知らんかった。
Avatar
case並び替えとか発生したときにデータ壊したくないから全部書きたい
Avatar
そうそう
Avatar
欠番とかもあり得るし
Avatar
omochimetaru 1/12/2018 7:05 AM
整数値が外部APIにつながってるとそうだよね
Avatar
caseの定義順って普通のプロパティの定義順と同じくらいどうでもいいものだと思うんだよね
Avatar
omochimetaru 1/12/2018 7:05 AM
内部的な都合なら手書きだと重複する事故があるから自動列挙のほうがいい場合もありそう
Avatar
重複はコンパイルエラーにならなかったっけ?
Avatar
omochimetaru 1/12/2018 7:06 AM
Avatar
内部的なやつなら普通にswitchとかパターンマッチ使えばいいケースしか無い気がする
Avatar
omochimetaru 1/12/2018 7:06 AM
なるほど
Avatar
外に出すのに値が必要だからrawValueつける場合ばっかじゃないかな
Avatar
omochimetaru 1/12/2018 7:06 AM
そんな気も
Avatar
重複は Raw value for enum case is not unique というエラーが出た
Avatar
Raw value for enum case is not uniqueって出るからオッケー
7:07 AM
コンパイルエラー起こしたら始末書みたいなクソ現場じゃない限りは大丈夫ですね
Avatar
case一個消したらそれ以降全部ずれるし
Avatar
omochimetaru 1/12/2018 7:07 AM
コンパイラ偉いなあ
Avatar
話逸れますが、= hoge を省略した場合って non-frozen との整合性どうなるんでしょう
Avatar
同じ理由でenumのhashValueを使ってたらレビュー通さないとおもう
Avatar
omochimetaru 1/12/2018 7:09 AM
fragile enum周りのevolution全然追ってない
Avatar
おなじく
Avatar
SE-0192 シュッと見た感じ言及はなさそう…?
7:12 AM
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
omochimetaru 1/12/2018 7:12 AM
jrose氏なのか
Avatar
読むと苦肉の策感高い Proposal です
Avatar
omochimetaru 1/12/2018 7:13 AM
めちゃくちゃながいw
7:14 AM
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
7:14 AM
レビュー入りしたほうだとexhaustiveっぽい
7:14 AM
Status: Active Review (December 19, 2017...January 3, 2018)
終わってた
Avatar
やはり言及がないですね… 😰
Avatar
class A { weak lazy var hoge: B? = nil } class B {} これなんか変なコンパイルエラーなった
5:09 PM
Playground execution failed: error: cannot convert return expression of type 'B?' to return type 'B?' error: cannot assign value of type 'B?' to type 'B??' error: cannot assign value of type 'B?' to type 'B??'
5:10 PM
lazy なくすとエラーなくなるんだけど、 lazy ってその変数の型には影響しないよね
Avatar
weak + lazy ? が参照持てないし使えないのかなと思ったり
5:12 PM
エラーメッセージ がよくわかりませんが。。
Avatar
lazyって参照持てないんだっけ
Avatar
いや、weak が です
Avatar
retain countは増えないけど、参照は参照ですよね
Avatar
ああ、言葉が悪かったです retain count が増えないのが問題なのかなと思いました ってうまく説明できそうな気がしたが感覚でしかわかってないな。。。
Avatar
lazyがあると cannot assign value of type 'B?' to type 'B??' で、lazyが無いとそのエラーが消えるということは、lazyのあるなしでそのプロパティの型が実は変わっているようなきがする
Avatar
コンパイル通したいってわけではなくて、 型がかわっているかどうか知りたいって感じか
Avatar
あいや普通にコンパイルは通って然るべきコードなのではと思っています
5:17 PM
weakとlazy、別に互いに干渉するようなものじゃないと思うんだけどな
Avatar
class A { weak lazy var hoge: B? = B() } class B {} でもこれはこれですぐ解放されるので あまり通って欲しくもない気がする
Avatar
それはコードがhogeが具体的にどのように与えられるかによるのでコンパイラの責務では無いような。
5:20 PM
そのコードも、僕が貼ったコードも型のルールの上でコンパイル通らない理屈は無いと思うんですよね
Avatar
class A { weak lazy var hoge: B = B() } class B {} nil になるならまだいいんですけど これだとなおわからない気がする
Avatar
weakはOptionalじゃないとダメですよ
Avatar
あ、確かに
Avatar
それは別にlazy関係ないはず
Avatar
ですね
Avatar
To demonstrate this problem, I made a vanilla Cocoa project. Here is the AppDelegate.swift: import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { weak lazy var
5:26 PM
SOあった。
Avatar
あれ、Swift4からって最後 nil になっちゃうんですね class A { lazy var hoge: B! = B() } class B {} let a = A() a.hoge a.hoge = nil a.hoge あー、じゃあ、僕の会話していた時の頭の中が古かった 前まではもう一度初期化されていたはずだから weak + lazy ??? ってなってました
Avatar
もう一度初期化ってどういうことですか
Avatar
Swift4 let a = A() a.hoge // B a.hoge = nil // nil a.hoge // nil Swift3 let a = A() a.hoge // B a.hoge = nil // nil a.hoge // B こういうこと
Avatar
nilの時アクセスしたらってこと?
Avatar
ですです
Avatar
えー
5:29 PM
Swift3そうだったっけ…。
Avatar
3.2でビルドするとなるかな。。。 3.1まではそう書いて動いていた気がするが
Avatar
3.2では最後の行はnilですね
Avatar
あれま
Avatar
lazyは最初にアクセスするまで初期化を遅延させるものなので値がnilかどうかなどは関係ないような
5:33 PM
もやもやするので3.1以前で確認してもらいたいですね
5:35 PM
3.1ってXcodeいくつが必要なんだっけ…
Avatar
これだから正解ってわけじゃないんですが https://image.slidesharecdn.com/cocoakansailazyvar-160404013001/95/lazy-var-cocoakansai-cswift-57-638.jpg?cb=1459743921 熊谷さんが試してくれていた
Avatar
これいつの資料だろ。
Avatar
が、結構前だな 2016/4
Avatar
Swift3からIUOの扱いが変わったのでそれまではそんな動きしてたのかなあ
5:37 PM
2 系かな?
Avatar
この時はそうですね まあ 3.1 かどうかは置いておいてこういう時代があったんですよね
lazyは最初にアクセスするまで初期化を遅延させるものなので値がnilかどうかなどは関係ないような
これはそうあって欲しくて、今の仕様の方がわかりやすいですね
(edited)
Avatar
召喚された
Avatar
まってたぜ
Avatar
weakとlazy組み合わせた場合かー
5:40 PM
bug report はあった
5:41 PM
Resolved
Avatar
@tarunon lazyのあるなしでエラーメッセージによるとhogeが B?? と解釈されてるかどうかが変わっているきがするんだけどどう
5:42 PM
そもエラーがどのファイルのどの行って示せていないので、なんかがおかしいのは確定だと思うんだけどな
5:44 PM
class A { weak lazy var hoge: B? = { return B??.none }() } class B {}
5:44 PM
Playground execution failed: error: cannot convert return expression of type 'B?' to return type 'B?' error: MyPlayground.playground:4:30: error: cannot convert value of type 'B??' to specified type 'B?' weak lazy var hoge: B? = { ^ error: cannot assign value of type 'B?' to type 'B??' error: cannot assign value of type 'B?' to type 'B??'
5:44 PM
もっとポンコツっぽくなった
Avatar
いやそれは、B??はB?には変換できないでしょ
Avatar
エラーメッセージおかしくね
Avatar
行数指定されてるエラーはまとも、それ以外は前と一緒かな
Avatar
結局内部的(?)にはhogeはB?なのかB??なのかどっちになってるんだろう
Avatar
ひらり的には何がやりたいの
5:46 PM
1. これを使って解決したい問題があった 2. 興味本位
Avatar
さいしょ1だったけどいま2
5:48 PM
factory initをこのまえ知って使ってみたくなって、「ViewModelを返すクロージャを引数に受けるViewControllerのイニシャライザ」を作ったんだけど
5:49 PM
let articlesVC = ArticlesViewController.init { return ArticlesViewModel.init(dataProvider: ArticlesAPIDataProvider.init()) } 本番のコードなんで文脈なくてすまんやけど
Avatar
lazyは内部的にOptionalを使っているコンピューテッドプロパティであると解釈するなら、
5:49 PM
weakと組み合わせたときにぶっ壊れてそれがチラ見できるようになったということかもしれないね
Avatar
VMのイニシャライザにVCを渡したくなったけど循環を回避するためにweakにして、更にarticlesVCの初期化処理の中でarticlesVCを使えないのでlazyにして初期値を uninitialized() にすればいけんちゃうみたいな
5:50 PM
uninitialized() は中身fatalErrorの func uninitialized<T>() -> T
Avatar
うーん
5:51 PM
weakにした時点でOptionalなんだから初期値nilでよくって
5:51 PM
lazyを使う必要がなくならないか?
Avatar
vcの参照は必須にしたいんよね
Avatar
じゃあIUOで
Avatar
get before set は落としたい
5:51 PM
やっぱそうなるよね〜〜〜〜〜〜〜
Avatar
あとはー、そうだねぇ
Avatar
何かIUO使わなくていいなら使いたくないので、lazyで行けるっしょと思ったら行けなくて悲しかったってかんじ
Avatar
class VC {} class VM { private weak var _vc: VC? = nil var vc: VC { get { return _vc ?? undefined() } set { _vc = vc } } }
5:53 PM
ほれ
5:53 PM
これでもIUO無しでやりたいことはできるゾイ (edited)
Avatar
別の変数に置いとけばまあ、ってかんじか
5:54 PM
まあ ってかんじだな
Avatar
自前Lazy
5:54 PM
これを表現するLazyWeak型を作ればスッとできないかな
Avatar
ぱっとみ大仰なのでIUOのほうがやりたいことがわかって良いかもしれない
5:54 PM
おっLazyWeak
Avatar
class LazyWeak<T> { private weak var _value: T? = nil private func undefined() -> T { fatalError() } var value: T { get { return _value ?? undefined() } set { _value = value } } } class VM { var vc = LazyWeak<VC>() } こういうイメッジ
5:56 PM
使いやすいかはしらん
Avatar
クラッシュするのはweakってよりunownedっぽいね
Avatar
unownedならそもlazy使えるんじゃね
5:58 PM
unownedってプロパティに使えたっけ
5:58 PM
オッダメだw
5:58 PM
同じErrorすね
Avatar
class A { unowned lazy var hoge: B = B() } class B {}
5:59 PM
Playground execution failed: error: cannot convert return expression of type 'B' to return type 'B' error: MyPlayground.playground:4:32: error: cannot convert value of type 'B' to specified type 'B' unowned lazy var hoge: B = B() ^~~ error: cannot assign value of type 'B' to type 'B?' error: cannot assign value of type 'B' to type 'B?'
5:59 PM
hoge: B! だとなんか違う怒られする
Avatar
それはそもそもクラスじゃなくなるから
Avatar
あ、そか
6:00 PM
なる
Avatar
unownedはクラス型、weakはOptional<クラス>
Avatar
unownedはIUOじゃないの
6:00 PM
クラス!にならん?
Avatar
ならんくね?
Avatar
アレ?
Avatar
アクセス失敗後の世界は無いはずなのだからIUOになる意味がないと思う
Avatar
それってSwiftのエラー的には何になるん
6:03 PM
unownedあんまり意識してつかったことないからてっきりweakはOptionalでunownedはIUOになるもんかと思ってたけど
Avatar
SIGABRT (edited)
Avatar
うわー
6:04 PM
ホントだ
6:04 PM
型そのまんまだ
6:05 PM
class A { var block: (() -> ()) = {} func hoge(block: @escaping (() -> ())) { self.block = block block() } } class VC { func viewDidLoad() { let a = A.init() a.hoge { [unowned self] in print(self) } } } VC.init().viewDidLoad()
6:05 PM
__lldb_expr_98.VC
6:05 PM
↑printの結果
6:06 PM
weakだとOptional<~~~~>になる
Avatar
ケース的には、weak + IUOがベター、IUOがどうしても嫌ならLazyUnowned型作るのが良いと思った
6:07 PM
(もっと個人的な思想の話をするとVCとVMの循環参照そのものをやめたほうが良い気がするけど)
Avatar
その思想はわいもそうなんだけど
6:08 PM
UITableViewCellに乗っけてるAdmobのバナーViewがUIViewControllerのインスタンスを要求してきて、そのセルはVMのRxDataSourcesで作られているみたいなアレで仕方ないかなあみたいな
6:08 PM
アレです
Avatar
Cellに渡すデータだけをViewModelで作るようにしたら
6:09 PM
あー
Avatar
セルに渡すデータにVCも含まれているのよ
Avatar
configureCellの在処
Avatar
configureCellの実態どこにおいてる?
Avatar
個人だと例のごとく丸っとアレだけど
Avatar
どっかのバージョンからdataSourceのイニシャライザに渡すようになってからふ〜んこいつはVMに置くべきなんやなあとおもってVMに書いてるけど
6:10 PM
使ってないんだっけお兄さん
Avatar
型合わせゲーム解決したらセルが生えてくる例のアレだす
Avatar
でた
6:11 PM
全然覚えてないけど
Avatar
Admobうんこやん、そいつTableViewの外に置けないの?
Avatar
多分VCの一番下端に貼っつけるのが想定ユースケースなんだろうなってのはドキュメントからすごい伝わってきた
6:12 PM
けどそれ嫌いなのでテーブルの中に紛れさせたい
Avatar
スクロールしたら怒られると思うよ
Avatar
怒られるのかなあ
6:12 PM
うげー
Avatar
ガイドラインにスクロールで領域外に隠すな💢みたいなのは見た記憶がある
6:13 PM
えっとね
6:13 PM
AdViewController作ってそれはコンテナVCにして、Childに綺麗な世界を作ることを強くおすすめします
6:14 PM
広告sdkは大体良くないからね、世界を分けよう
Avatar
他の画面はもうそうなってんのよね
6:14 PM
うぐー
Avatar
omochimetaru 1/12/2018 6:14 PM
おきた
Avatar
おは
Avatar
なんかTableに混ぜる系の広告sdkはそれ専用のapi群があって(使い勝手がよいわけではない)みたいなイメッジ
Avatar
omochimetaru 1/12/2018 6:15 PM
lazyってSILレベルでは存在しない気がする
6:16 PM
computed propの実装になってそう
Avatar
広告導入して循環参照追加することになりましたとか、敗北もいいところなのでsdkを床に叩きつけたいなw
6:16 PM
決闘だ
Avatar
omochimetaru 1/12/2018 6:16 PM
そこで一回りオプショナルがつくのと
6:16 PM
weakの辻褄合わせにバグがあるのかと
Avatar
ネイティブ広告出せるイマドキインターフェースもってる広告SDKおしえて
Avatar
ダヨネ
6:17 PM
そんなものは…
6:17 PM
広告sdkは残念ながら
Avatar
とりあえずFirebaseで計測できるってからAdmob入れてるけど
Avatar
広告sdkは、「兎に角仕様を変更しない」がKPIのひとつになるので、今時インターフェースってのは難しいと思う (edited)
Avatar
かなしい
Avatar
例の Delegate でゴニョゴニョ実験していたやつの結果が出ました: https://github.com/Kuniwak/DelegateKit
DelegateKit - Operators and Utilities for Delegates
👏 1
4:04 AM
まず、Delegate を protocol SomethingDelegate: class {} という形式で宣言できなくなりました。いちいち Type Erasure 書くのを避けるための苦渋の選択ですが、最悪です
DelegateKit - Operators and Utilities for Delegates
Avatar
omochimetaru 1/15/2018 1:37 AM
Delegateのオブジェクトへの弱参照+呼び出されるメソッド群 っていう構造を、associted valueのあるenumとしてまとめて一つの型にして、デリゲートの通知を直接のオブジェクトとして取り扱うってアイデアは良さそうですね RxCocoaでUIButtonとかに .rx が 生えてるやつでできることを、それ単体だけ Rx 全部を導入しないで採用できないか、ってのがコアアイデアですかね?
Avatar
RxCocoaでUIButtonとかに .rx が 生えてるやつでできることを、それ単体だけ Rx 全部を導入しないで採用できないか、ってのがコアアイデアですかね?
はい、それを狙っています。
1:55 AM
Rx の中でも一番有望だと思っていたのは throttle/debounce ですね。Delegate でも使いたいシーンは結構あるので…
Avatar
AnyDelegate無しでなんとかならないかな
Avatar
これ誕生の経緯が結構あるので説明長くなるんですよね。。。
4:50 AM
class DelegateHolder { weak var delegate: SomethingDelegate? } let holder = DelegateHolder() // これは弱参照で持ってほしい。 holder.delegate = SomethingDelegateImpl() // これは強参照で持ってほしい。なぜなら、これを弱参照にすると map の戻り値の参照を誰も保持してないのですぐに回収されてしまうから。 holder.delegate = SomethingDelegateImpl() .map { a in a * 2 } // この差異を吸収するために、weak と strong の両方を持てるインターフェースを持つ必要があった。これを実現しているのが AnyDelegate。
Avatar
Rxだとその辺はDisposeBag側から参照持つ形で解決してますね。
Avatar
その方法も検討したのですが、これを導入すると Delegate の頃にはなかった subscription の概念が入ってしまうので避けたという経緯があります
5:05 AM
UIKit などの Delegate のように、subscription は delegate プロパティへの代入で実現されるのを目指した形になりますね。その辺りは実装者の好みも入っています(weak が書けなくなるか、subscription を入れるかの二択のうち、前者を選択したので)。
Avatar
ふむ
Avatar
omochimetaru 1/16/2018 8:01 AM
雑なエラー型ってどうしてます?絵文字投票可能にして聞いてみる。
  • 1⃣ GenericError みたいな型を定義する
  • 2⃣ Error を定義する。言語仕様の方のやつと衝突しちゃうのでそっちを使う時は Swift.Error と完全名で記述する
  • 3⃣ NSError を使う
  • 4⃣ 絶対に雑なエラー型は作らない(ライブラリやそのクラスや関数に起因したエラー型を定義する)
  • 5⃣ その他
(edited)
1⃣ 5
4⃣ 3
2⃣ 1
8:02 AM
僕はもともと[1]だけど微妙に思えてきて[2]に乗り換えたけどこれも面倒になってきて[3]を検討しているところ (edited)
Avatar
雑なError is
Avatar
omochimetaru 1/16/2018 8:03 AM
とりあえずエラーメッセージをthrowしたくてとりあえずそれ以上詳細なパラメータはcatch側で必要ないようなやつ。
Avatar
オッ
Avatar
Kishikawa Katsumi 1/16/2018 8:03 AM
ライブラリ名Errorみたいなやつですよね。
Avatar
その他かな
8:04 AM
雑なエラーが発生するクラス.Errorを作る
Avatar
Kishikawa Katsumi 1/16/2018 8:04 AM
CarthageErrorみたいな
Avatar
omochimetaru 1/16/2018 8:04 AM
じゃあ[4]?
Avatar
4かこれw
Avatar
omochimetaru 1/16/2018 8:04 AM
CarthageError は [1] かな〜
Avatar
なんだろう
Avatar
omochimetaru 1/16/2018 8:04 AM
Carthage 自体がパッケージを作ると考えて Carthage.Error としていてパッケージの中では Error なのであれば [2]
8:05 AM
@tarunon そうするといろんなクラスでその Class.Error 実装するのがめんどくさい コンストラクタ書いて :CustomStringConvertibleかいてdescripton書いて・・・
Avatar
protocol DescribedError: Error, CustomStringConvertible { }
8:05 AM
こういうの用意してそれでマッチするようにしてる
Avatar
omochimetaru 1/16/2018 8:05 AM
なるほど。
8:06 AM
それって typealias DescribedError = Error & CustomStringConvertible とかでもいいのかな。
Avatar
ライブラリ外に投げる場合は雑なエラーではなく、ライブラリ.Errorなかなり具体性を持たせてラップして投げる必要があると思う
8:06 AM
asキャスト使えるっけ?
Avatar
omochimetaru 1/16/2018 8:06 AM
無理だね nominal でないから
Avatar
じゃあダメだ
Avatar
omochimetaru 1/16/2018 8:07 AM
(すごい勢いで流れていってアンケートが死んだw
Avatar
使う時に enum Error: DescribedErrorって書きたいから
Avatar
omochimetaru 1/16/2018 8:10 AM
extension String : Error {} func a() throws { throw "error message" } do { try a() } catch let e { print(e) // "error message\n" }
Avatar
それはやばい
Avatar
omochimetaru 1/16/2018 8:10 AM
これできるのか・・・😅
Avatar
最悪でもRawRepresentableにしよう!
Avatar
omochimetaru 1/16/2018 8:11 AM
悪魔召喚感
Avatar
使ってるの見たら 👮 する
Avatar
guard句に引っかかってelseの中を通って処理が終了したときになんかそれに気づける&&どこのguardで引っかかったかprintしてくれたりしたらうれしいなーみたいなことを思ったんですが
3:24 AM
それはコンパイラに手を入れるしか無い?
Avatar
omochimetaru 1/18/2018 3:25 AM
print書けばいい・・・?
Avatar
全部のguardに書くの現実的ではない
Avatar
omochimetaru 1/18/2018 3:26 AM
全部のguardでそれやるのそもそも微妙じゃない?
3:26 AM
必ずしもエラーケースとは限らないじゃん、正しく脱出することもあるから
3:26 AM
拾いたくない普通にたくさんおきるguardでログが膨大に発生してしまう
Avatar
コンパイラのオプションかなんかでそのへんオンオフできたらいいなって
Avatar
omochimetaru 1/18/2018 3:28 AM
自分の場合はブレークポイント貼ってだいたい解決してるなあ
3:28 AM
似たような話で
3:28 AM
guardの中でも特に異常系での脱出は
3:28 AM
throw してるので
3:28 AM
throw全部でブレークする設定ができるから
3:28 AM
俺の場合はそれで拾えてる
3:29 AM
それで駄目なケースはguardの中で、returnで脱出するケースだね
Avatar
そういうコードがいっぱいある
Avatar
omochimetaru 1/18/2018 3:29 AM
それって普通のif文のフローも全部トレースしたいって言ってるのと同じ気がするけど・・・
3:30 AM
それはコンパイラに手を入れるしか無い?
コンパイラに手を入れるアプローチだったら
3:30 AM
guard文をSILに変換する時に
3:31 AM
else本文の先頭の生成部で print を生成すればできそう
3:31 AM
SwiftSyntaxが完成すれば、AST変換で実装するのもできそう
Avatar
guardでの異常脱出はthrowで、って結構目からウロコだったんだけどthrowsばっかになって辛いみたいなことないんすかね
Avatar
omochimetaru 1/18/2018 3:32 AM
guard文の句構造は (guard キーワード、評価式部分、 elseキーワード、LBrace、制御部、RBrace)だから、制御部にprint文を注入するだけかな
3:32 AM
それが異常ならthrowsで表現しといた方がうまくいくと思う
3:33 AM
returnの場合は void関数で処理をスキップした場合と、 型があってデフォルト値に畳み込んだ場合だよね
Avatar
うん
3:34 AM
throwするようにしてわかりやすくしても結局try?で握りつぶされまくる未来が見えるな
Avatar
omochimetaru 1/18/2018 3:34 AM
それらのケースは仕事を呼び出し側に押し付けてるだけだからあんまり意味が無い
3:34 AM
意図を表現するために skip 関数と makeDefault 関数 みたいなのを作っておいて、それを使ってコーディングするようにしておいて
3:35 AM
skip関数とmakeDefault関数の中でprintするように書き換えれば
3:35 AM
Swiftだけでその目的果たせそう
3:35 AM
一般の return を全部捕まえるのは既存の方法では無理だと思う
Avatar
まあ新しくguardを書くときはそうなのかもしれん
Avatar
omochimetaru 1/18/2018 3:36 AM
SwiftSyntaxでコード変換するのが良いんじゃないかなあ
3:36 AM
現バージョンならguard文とかもいけるんじゃねえか 知らんけど
3:37 AM
それだったら Swiftソースから Swiftソースへの加工だから
3:37 AM
で、加工処理自体もSwiftで書けるから
3:37 AM
ハードルは低いと思う
Avatar
今はもうそこそこそ大きくなってしまったコードベースの中でデータ不整合チックなことを検出するguardでお手軽returnしてなにもしないみたいな感じになっておりデバッグが大変つらいのでguardに引っかかりましたよ一覧のログがごっそりあってそこでおかしなのを探すみたいなアプローチができたら嬉しいのかなというアレでした
3:37 AM
SwiftSyntaxしらべてみるか
Avatar
omochimetaru 1/18/2018 3:38 AM
try! Swift is an immersive community gathering about Swift Language Best Practices, Application Development in Swift, Server-Side Swift, Open Source Swift, and the Swift Community taking place around the world in Tokyo, New York, and Bangalore.
3:38 AM
トライスイフトで岸川さんが教えてくれるよ
Avatar
わいやったらこの不整合preconditionFailureで落とすぞみたいなのもしれっとreturnして何事もなかったかのようにアプリは生き続けて不具合のきっかけがどこかわからんみたいなのがある
😫 1
3:38 AM
期待
Avatar
omochimetaru 1/18/2018 3:38 AM
いつのまにか普通に import SwiftSyntax できるよになってたしハードル下がってきた (edited)
Avatar
Kishikawa Katsumi 1/18/2018 3:39 AM
まあguard節のことは全然考えてなかったけど、そういうアスペクト指向みたいなものを実現するようなものを考えてます。
Avatar
omochimetaru 1/18/2018 3:39 AM
わいやったらこの不整合preconditionFailureで落とすぞみたいなのもしれっとreturnして何事もなかったかのようにアプリは生き続けて不具合のきっかけがどこかわからんみたいなのがある
例外握りつぶしてて異常系のトレーサビリティーが死んでるやつだ
Avatar
そう
Avatar
omochimetaru 1/18/2018 3:40 AM
そういうのはやっぱコード変換が良さそうだなあ
3:40 AM
腐ってるソースファイル全部をバコッと変換して
3:40 AM
実行すればいろいろわかる、みたいな。
3:41 AM
コンパイラでやっちゃうと、正しくguardを使ってる場所も余計に捕まえちゃうから
3:41 AM
そのフックをかける範囲をいろいろコントロールできたほうがデバッグしやすいから
Avatar
null safety や検査例外は本来いいものだけど、握りつぶすと最悪なことになる・・・。
Avatar
guard return警察するしか
4:04 AM
地に足をつけて生きていくしかないのだ
Avatar
omochimetaru 1/18/2018 4:04 AM
ヒラリが言ってるのは既存コードだから
Avatar
既存コードに警察権を行使しよう
4:05 AM
つまりPRだな
Avatar
omochimetaru 1/18/2018 4:05 AM
その作業めっちゃ時間かかるじゃんw
Avatar
やらないならやらないでそれは未来に問題を先送りしてるだけだから
Avatar
omochimetaru 1/18/2018 4:05 AM
その時間を省略してとりあえず今でてるバグをつぶしたいという話でしょ
Avatar
どこかで解決しないと
Avatar
Kishikawa さんが SwiftSyntax やめて -dump-ast ににしてしまったので、チーム一同悲しんでおります 😇
😢 1
Avatar
Kishikawa Katsumi 1/18/2018 4:11 AM
PowerAssertには型の情報が必要なんですよね😥
Avatar
ですよねー。まあ SwiftSyntax はまだ早いというのは分かります。
Avatar
Kishikawa Katsumi 1/18/2018 4:13 AM
だいぶ色々なコードが動くようになったので、デモサイトを作りました。
👀 2
Avatar
omochimetaru 1/18/2018 4:14 AM
XCTAssert(max(a, b) == c) | | | | | 7 4 7 | 12 false XCTAssert(a + b > c) | | | | | 4 | 7 | 12 11 false XCTAssert(john.isTeenager) | | | false Person(name: "John", age: 42) XCTAssert(mike.isTeenager && john.age < mike.age) | | | | | | | | | false | | 42 | | 13 | | | | Person(name: "Mike", age: 13) | | | false | | Person(name: "John", age: 42) | false Person(name: "Mike", age: 13)
4:14 AM
お〜〜〜
Avatar
すごい・・・
Avatar
Kishikawa Katsumi 1/18/2018 4:15 AM
仕組みはすぐできたんだけど明け方からずっとSSLにしたくてがんばってたけどなんか無理だった。
4:17 AM
実際のCLIの方は
Avatar
これってこの前のオンライン Playground ですよね?
Avatar
Kishikawa Katsumi 1/18/2018 4:17 AM
swift-power-assert xctest -Xxcodebuild test -workspace <workspacename> -scheme <schemeName> -sdk iphonesimulator -destination "name=iPhone X,OS=11.2"
4:18 AM
こんな感じでxcodebuildやswift testの前にコマンドを足したらいい感じにラップするようになってます。
4:18 AM
@koher そうです。
Avatar
EC2 か何かの上で動かしてるんですか?
Avatar
Kishikawa Katsumi 1/18/2018 4:19 AM
DigitalOceanの一番安いやつです。
👀 2
4:20 AM
とりあえず、動かす所まで試そうと思って昨日やってました。
Avatar
↓で Swift Sandbox を当てにしてたので悲しいことになってしまい、自分で環境作ろうかと思ってたところです😭 https://github.com/swift-quest/swift-quest/blob/master/print-and-arithmetic/first-step.md
Contribute to swift-quest development by creating an account on GitHub.
Avatar
Kishikawa Katsumi 1/18/2018 4:22 AM
OnlineSwiftPlaygroundは入出力を生のテキストを簡単なJSONでラップしてやりとりしていて、基本的にそのままswiftcに渡してるだけですね。
Avatar
sandbox 化とか、リソースの分離とかしてくれるんでしょうか?
Avatar
Kishikawa Katsumi 1/18/2018 4:23 AM
Macで実行する場合は標準のサンドボックス機構を使うように書かれてるけどLinuxホストの場合は何もなし。
Avatar
なるほど・・・
Avatar
Kishikawa Katsumi 1/18/2018 4:23 AM
なので、コマンドインジェクションがたぶん可能。
4:23 AM
そこはDockerで実行するとかでいいんじゃないかと。
Avatar
そこまでするなら OnlineSwiftPlayground じゃなくてもいい気がしますねぇ・・・。
Avatar
Kishikawa Katsumi 1/18/2018 4:26 AM
DockerfileもあるんでDocker build & runが一番簡単ですよ。
Avatar
そうなんですね。
Avatar
omochimetaru 1/18/2018 4:27 AM
DockerにすればSwiftのバージョン切り替えとかも実現しやすそうですね
Avatar
Kishikawa Katsumi 1/18/2018 4:27 AM
まあ仕組みは超簡単なのでフロントエンドが好きなら全然自分でも作れる。 (edited)
4:28 AM
これに乗っかると、NodeやSwiftを修正して、docker build & runて感じだから、最初試すぶんには良いと思います。
Avatar
なるほど。ありがとうございます。
Avatar
Kishikawa Katsumi 1/21/2018 12:25 AM
https://swift-power-assert.kishikawakatsumi.com/ 細かいところが気になったので作り直した。Nodeを使ったのでPure Swiftじゃなくなってしまった。
12:25 AM
SSLにもした。
12:28 AM
作ってみると、意外にオンラインのREPLをSwiftで作るのは難しくないということと、IBMの以外にもSwiftのREPLを提供しているところは結構あるんだなということがわかりました。
12:29 AM
👌 1
Avatar
ワンドボックスすき
Avatar
Kishikawa Katsumi 1/21/2018 12:58 AM
Swiftがあるとは全く思ってなかった。LLVMファミリだからだろうか。
1:03 AM
Dockerがあるからマルチプラットフォームで動かすことは全然大変じゃないけど、MacとLinuxで同じコードではダメなことが結構あるのが大変ですね。
Avatar
omochimetaru 1/25/2018 4:33 AM
You and I both want to be able to use fixed key sets, and you and I both think arbitrary string literals should be supported too. So please consider taking my position on this proposal—that it should be accepted in its current form and that we should later extend the feature to support fixed key sets in addition to ExpressibleByStringLiteral types. I really think SE-0195 could be an important step towards our goal.
4:33 AM
クリスラトナー、 Chris_Lattner3 とかいう、めっちゃアカウント生成トラブった感じの名前になってるけどw
Avatar
Kishikawa Katsumi 1/25/2018 4:34 AM
先に誰かが取っちゃったとかでもなさそうですね。
Avatar
多分、apple.com nondot.org google.com の3アカウントあるのだと思います。
Avatar
norio_nomura 1/25/2018 4:35 AM
複数のメールアドレスでMLに投稿してそれらにユーザー名が自動生成されて、最初の投稿のメールアドレスを使えなくて変えられないのでは。 (edited)
Avatar
omochimetaru 1/25/2018 4:36 AM
このアドレスは404なんだなあ。 https://forums.swift.org/u/Chris_Lattner2/summary
Avatar
norio_nomura 1/25/2018 4:40 AM
アクティベートしないとユーザーページは現れないとか?
Avatar
omochimetaru 1/25/2018 4:41 AM
「取ってあるけどまだ見えない」はありそうですね。
4:41 AM
>複数のメールアドレスでMLに投稿してそれらにユーザー名が自動生成されて、最初の投稿のメールアドレスを使えなくて変えられないのでは。 ああなるほど
Avatar
おお、これ Proposal 化されてレビュー入りしてたのか。 Swift で機械学習できるようになるの楽しみだ。 https://github.com/apple/swift-evolution/blob/master/proposals/0195-dynamic-member-lookup.md (edited)
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
omochimetaru 1/25/2018 4:42 AM
はい、いまレビュー期間ですね
Avatar
まあ、この Proposal だけじゃ Python 連携までは長い道のりなのか?
Avatar
omochimetaru 1/25/2018 4:44 AM
とりあえずこれだけあれば、あとはライブラリで結構いけるんじゃないですか?
Avatar
Python.framework 使ってた気がするけど、それが Python 2 じゃないかという心配も・・・。
Avatar
omochimetaru 1/25/2018 4:45 AM
Python3.frameworkってないのかな?
4:46 AM
importでどっちも使えそう。
Avatar
omochimetaru 1/25/2018 4:46 AM
そうですね、そっちがない間は関数呼び出しのところは冗長。
Avatar
norio_nomura 1/25/2018 2:09 PM
Release_Notes_for_Xcode_9.3_beta.pdf より ## Known Issues in Xcode 9.3 beta ### Swift Compiler - Conditional conformances are unsupported when performing a dynamic cast (with is or as). これってSwift 4.1リリースでも直らないんだよね? (edited)
Avatar
CondconfはExistentialにcastできない?
Avatar
それを理由に最初フラグ指定しないと使えやいようにしてましたね(今ではフラグなしで使えるようになったけど。
Avatar
norio_nomura 1/25/2018 2:13 PM
exampleを引用 protocol P { } extension Int: P { } // Fully supported: Set unconditionally conforms to P extension Set: P { } // Not supported in dynamic casts: Array conforms to P // only when its element conforms to P extension Array: P where Element: P { } func castToP(_ value: Any) { if value is P { print("\(type(of: value)) conforms to P"); } else { print("\(type(of: value)) does not conform to P") } } castToP(Set([1, 2, 3])) // unconditional conformances // are supported: // prints "Set<Int> conforms to P castToP([1, 2, 3]) // unsupported conditional conformance: // incorrectly prints "Array<Int> does not // conform to P" castToP([3.141593, 2.71828]) // unsupported conditional conformance: // correctly prints "Array<Double> does not // conform to P" (edited)
Avatar
さすがに4.1では無理そう
Avatar
norio_nomura 1/25/2018 2:18 PM
コードによっては、Conditional Conformanceを使った型を食わせるテストが必要になりそう。
Avatar
norio_nomura 1/27/2018 3:04 AM
flatMapのdeprecationはSwift 4.1とSwift 3.3両方だから、4.0.xと3.2.x互換を維持する場合のcompactMap定義は #if (!swift(>=4.1) && swift(>=4.0)) || !swift(>=3.3) extension Array { public func compactMap(_ transform: (Element) throws -> String?) rethrows -> [String] { return try flatMap(transform) } } … みたいに書く必要があるのか。 (edited)
😵 1
Avatar
version という comparable なものを使っているのに、 3 系と 4 系で独立して deprecated とか微妙ですね☹ それならグラフ構造で表さないと・・・。
Avatar
norio_nomura 1/27/2018 1:21 PM
ちょっと修正、#if (!swift(>=4.1) && swift(>=4.0)) || !swift(>=3.3)だった。
Avatar
public protocol Po { func doHoge() } extension Po { public static func getDefaultInstance() -> Po { return DefaultPo() } } internal class DefaultPo: Po { func doHoge() {} } // let po = Po.getDefaultInstance() <- Compile error let po = DefaultPo.getDefaultInstance() なのに今さら気づいた… Protocol は適合する対象であって型としては存在はしないんだなぁというのを実感した
Avatar
それもそうだし、Genericsで<X: Po>ってやってXにPoを入れようとすると実感できるぞ
Avatar
なんかそこもスッとつながって、型としての実体がないから func hoge(po: Po) // dame func hoge<X: Po>(po: X) // OK なのも実感として納得がいった (edited)
Avatar
Bugs覗くと兄貴達がGenericsのそれにキレてるのをよく見る
10:25 AM
<X: class>で死ぬのが一番多くてな
Avatar
いやでもこれ Protocol の実在性について納得するとすごく自然に感じるし、むしろ
Avatar
故にErasure作ろうね!っていう話を
10:27 AM
するんだな
Avatar
あー、<HogeProtocol: class> してしまうのはありそう
Avatar
AnyClassValueっていうオレオレType-erasureを作って解決するのが、一番賢いと思うのだけど
10:27 AM
中々ね
😭 1
Avatar
omochimetaru 1/30/2018 4:41 AM
Swiftでスクリプティングをするための基盤環境ツール、こんなのあるんですね。 https://github.com/JohnSundell/Marathon https://github.com/yonaskolb/mint
Marathon makes it easy to write, run and manage your Swift scripts 🏃
Mint - A package manager that installs and runs Swift command line tools
4:42 AM
ついでに、定義ファイルをSwiftで書くmakeとかもあった。名前が酒で良い。 https://github.com/xcodeswift/sake
sake - A make-like build utility for Swift.
Avatar
assertpreconditionにクロージャ渡せたらループチェックとかかきやすくて良いんじゃないかと思うんですがどうですかね? もとの定義が@autoclosureなのでそれはずしたのをオーバーロードするだけで行けると思うんですが。
6:45 AM
あとドキュメント読んでて気付いたんですがassertpreconditionは最適化によってconditionを評価しないだけで呼出し自体が消えるんじゃないみたいですね。 ずっと勘違いしてました。
Avatar
消えるかどうかは最適化に委ねられてて、消えてる可能性もあるという認識です。確認したことはないけど。
Avatar
omochimetaru 2/2/2018 6:59 AM
@t.ae ループチェックって何?
Avatar
/// - Parameters: /// - condition: The condition to test. condition is not evaluated in /// -Ounchecked builds.
とあったのですが呼び出しが消えるのは別にされてるかもしれませんね。
7:00 AM
@omochimetaru 配列の全要素チェックです
Avatar
@t.ae In -Ounchecked builds, condition is not evaluated, but the optimizer may assume that it always evaluates to true. Failure to satisfy that assumption is a serious programming error.
Avatar
omochimetaru 2/2/2018 7:01 AM
@t.ae ああ。 precondition(items.all { $0 >= 0 }) これでいいじゃん
Avatar
基本それで良いんですけど複雑だと可読性が悪いですし、 問題なさそうでもコンパイル時間が長かったりするので
Avatar
omochimetaru 2/2/2018 7:02 AM
クロージャが渡せたら楽になる、というのがよくわからない
7:02 AM
結局ここはBoolを返す式じゃないといかんので。
Avatar
mapやcontainsが絡んでいるとそれらを分解できませんよね? クロージャで渡すならそれらを別々に呼べる
Avatar
omochimetaru 2/2/2018 7:03 AM
全然わからない・・・
Avatar
let a = [0, 2, 4, 6] assert({ // all even for e in a { guard e % 2 == 0 else { return false } } return true }())
Avatar
omochimetaru 2/2/2018 7:03 AM
どういうコードが書けるような状態を想像しているかサンプルが見たい。
Avatar
最後の () を消したいってこと?
7:04 AM
あとは trailing closure にできるか。
Avatar
そうですね。というかこれ書いて()の有無しか変わらないなと気付いたんですが
Avatar
omochimetaru 2/2/2018 7:05 AM
まさにそう思うし、↑の例だったら、 func allEven(_ x: [Int]) -> Bool を定義しておけば assert(allEven(x)) で良いよ
7:05 AM
複雑な式になった場合に、それがロジックとして展開されている状態は、別に何もわかりやすくなってなくて
7:05 AM
関数名つけたほうがいいんちゃう
Avatar
チェック用の関数を別に用意しとくわけですね。たしかにそっちのほうが良い気がしてきました……
Avatar
omochimetaru 2/2/2018 7:06 AM
まあ、本当にその関数でしか使わない概念のチェックなら名前切り出さない方が統治されてるのかもしれないけど、そのケースは { }() の形で書けばいいいと思う。
Avatar
お知らせ: CountableRange を無くすPRがマージされました https://github.com/apple/swift/pull/13342 (edited)
Based on groundwork by @natecook1000 Not yet ready for commit until we figure out the source compatibility/migration story. Tests are mostly fixed up, except for things like hard-coded mangled name...
🎊 2
Avatar
omochimetaru 2/2/2018 8:11 AM
Avatar
スッキリしてる
Avatar
diff を検索した限りでは typealias CountableRange がなかったんですが、 4.1 でそれを突っ込むと結構大きめの破壊的変更になる気が。これは 5 で入る PR ですか?
8:20 AM
まあ typealias でも破壊的か。オーバーロードとか死ぬし。 (edited)
Avatar
omochimetaru 2/2/2018 8:21 AM
条件付きのtypealiasって書けるんでしたっけ
Avatar
書けるけど壊れたような
Avatar
この変更は4.1 には入らないと思います。 https://github.com/apple/swift-source-compat-suite/pull/131 実際 互換性問題出てますね。
apple/swift#13342 uses conditional conformance to make Range a Collection when its Bound is Strideable. For compatibility, CountableRange is still available as a type alias. There is one source com...
Avatar
omochimetaru 2/2/2018 8:23 AM
swift-source-compat-suite こんなリポジトリあったっけ
Avatar
この間Optionalでなんかガチャガチャやった時に、条件付きtypealiasでぶっ壊した記憶があるんだけど
8:24 AM
typealias O<X> = Optional<X> where X: Sequence O<String>.some("a") O<Int>.some(1) // Error 壊れなくなった可能性がある
Avatar
Kishikawa Katsumi 2/2/2018 8:25 AM
Souce compat suiteはSwiftのアップデートでソースコードレベルの互換性が失われていないかどうかのテストに協力するプロジェクト。 https://swift.org/blog/swift-source-compatibility-test-suite/
We are pleased to announce the release of a new Swift source compatibility test suite as part of the effort to maintain source compatibility in future Swift releases.
👀 1
8:25 AM
私も1つプロジェクトを登録してて、なんかあったら連絡が来る、はず。
Avatar
思い出した、Extensionが壊れるんだった
Avatar
omochimetaru 2/2/2018 8:25 AM
APRIL 24, 2017
知らなかった
Avatar
typealias O<X> = Optional<X> where X: Sequence O<String>.some("a") //O<Int>.some(1) // Error extension O { func foo() { print("foo") } } Optional<Int>.some(1).foo() //????
Avatar
Kishikawa Katsumi 2/2/2018 8:26 AM
登録するの簡単だからやっとくとSwiftプロジェクトの助けになるはず。
8:26 AM
Pull Request Description KeychainAccess is a simple Swift wrapper for Keychain API that works on iOS, watchOS, tvOS and macOS. KeychainAccess framework being added here is licensed under MIT. Accep...
Avatar
omochimetaru 2/2/2018 8:26 AM
そう言えばSwiftコアで最近CIが野良ライブラリの性能評価テストをやっとるなと思ったけどそういうのがあったんですねえ
8:27 AM
@tarunon ほんとだ、壊れてる 作りかけ感あるね
Avatar
@Kishikawa Katsumi compat suite なんかあったら連絡きます?ソース互換性保つのがミッションで、何かあったらコンパイラ側を直すのが基本なので、連絡来ないとおもってました。 実際その運用で Jesse と JP がブチ切れてた件。 https://spec.fm/podcasts/swift-unwrapped/99551
The source compatibility suite has been useful in catching compatibility issues before official Swift releases are cut, but it leaves much to be desired especially around communication with project maintainers outside Apple.
Avatar
条件満たしてれば↓こんな感じで登録できるんですね。 https://github.com/apple/swift-source-compat-suite/pull/39/files
Pull Request Description KeychainAccess is a simple Swift wrapper for Keychain API that works on iOS, watchOS, tvOS and macOS. KeychainAccess framework being added here is licensed under MIT. Accep...
Avatar
Kishikawa Katsumi 2/2/2018 8:29 AM
@rintaro 来てないけど、何かあったら連絡するって書いてあったから連絡来るもんだと思ってました。
8:29 AM
書いてなかったかな。。。
Avatar
In the event that Swift introduces a change that breaks source compatibility with a project (e.g., a compiler bug fix that fixes wrong behavior in the compiler), project maintainers are expected to update their projects and submit a new pull request with the updated commit hash within two weeks of being notified.
https://github.com/apple/swift-source-compat-suite#maintaining-projects ありました。
swift-source-compat-suite - The infrastructure and project index comprising the Swift source compatibility suite.
Avatar
Kishikawa Katsumi 2/2/2018 8:32 AM
そうそう、そこ。within two weeks of being notified.って書いてあるので、登録するときはメール見逃さないようにしないと、と思った記憶があります。
Avatar
なるほど、私も MirrorDiffKit 登録してみたいですね(頻繁に壊れるので)
1:35 AM
Mirror, ほんとマイナーバージョン上がってもかなり壊れるのでつらいです
Avatar
Kishikawa Katsumi 2/3/2018 1:35 AM
頻繁に壊れるプロジェクトははとても役立つのではないでしょうか。
1:36 AM
ランタイムのエラーはともかく、ソースコードのBreaking Changeはバグだと言われてるので、Swiftが修正されるべきですよ。
Avatar
なるほど、要件満たしてるかどうかみてきます
1:36 AM
Ensure the project builds successfully at a chosen commit against Swift 3.0 GM
って書いてあるんですが、これ今もこの条件なんでしょうか…
Avatar
Kishikawa Katsumi 2/3/2018 1:37 AM
それはどうでしょうね。
Avatar
https://summerofcode.withgoogle.com/organizations/4739935060361216/ https://swift.org/project-ideas/ GSoC 通ったみたいです。興味ある学生の方は是非!
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
Avatar
omochimetaru 2/13/2018 2:32 AM
Google Summer of Code (GSoC) は2005年の5月から8月に初めて開催され、その後毎年行われているイベントで[1]、Googleが指定したフリーソフトウェアやオープンソースのプロジェクトでその夏の間に課題をクリアした数百人の学生に賞金を支払う制度である。参加資格は18歳以上の学生で、これを補完する Google Highly Open Participation Contest は18歳未満を対象としている。
2:32 AM
Swift compiler integration with external tools Potential mentors Rintaro Ishizaki
Avatar
mentor まじか、って感じですよねぇ 😇
👀 1
2:34 AM
昨日 #swift-2 で出てた libSyntax の今後も見えますね。
Avatar
norio_nomura 2/13/2018 2:40 AM
おおw ## Swift compiler integration with external tools ## Integration of libSyntax with the rest of the compiler pipeline. ### Potential mentors Rintaro Ishizaki (edited)
Avatar
Kishikawa Katsumi 2/13/2018 3:37 AM
^ SNSでシェアするボタン無いのかな。。。
3:38 AM
無さそう。自分でやろう。
4:03 AM
Google Highly Open Participation Contest
こっちはSwiftやってないんですか?
Avatar
そっち知らないです。検索したところ、2007から2008にかけてだけだったんじゃ無いかな。 https://en.wikipedia.org/wiki/Google_Highly_Open_Participation_Contest
The Google Highly Open Participation Contest was a contest run by Google during 2007-2008 aimed at high school students. The contest was designed to encourage high school students to participate in open source projects. It was succeeded by Google...
Avatar
今はもうないのか…
Avatar
omochimetaru 2/13/2018 4:11 AM
@Yuta Saito 君年齢足りないスゴイな
😱 1
Avatar
https://developers.google.com/open-source/gsoc/faq What are the eligibility requirements for participation? ・You must be at least 18 years of age
😇 1
Avatar
数え年で19なので実はセーフ?
Avatar
もし本当に興味があってやりたいと思うなら
4:16 AM
ゴネれば年齢制限が下な分はなんとかなる…んじゃないかな
4:16 AM
ならないかもしれない
4:17 AM
なってほしいけど
Avatar
興味はあるので試してみます
😁 4
Avatar
これは楽しそうだ
Avatar
iOSでSwiftのStaticLibraryを作る/使うときのデメリットって何かありますか?ちょっと考えたけど、ライブラリ提供者側がターゲット追加するのが面倒くさい以外思いつかなかった。 (edited)
Avatar
omochimetaru 2/15/2018 4:28 AM
それは、Dynamicとの対比で?
Avatar
Kishikawa Katsumi 2/15/2018 4:29 AM
どうだろう。基本的にはiOSの場合はStaticの方がメリットは多いと思いますね。
Avatar
omochimetaru 2/15/2018 4:29 AM
Xcodeでちゃんと設定すればいけるのか。Staticのほうが起動が早いって話を見るよね。技術的にもデメリットは無さそう。どうせ毎回バンドルされちゃってるので。
Avatar
Kishikawa Katsumi 2/15/2018 4:30 AM
デメリットはまだ一般的ではないとかですかね。
Avatar
なるほど
4:30 AM
ありがとうございます!
Avatar
omochimetaru 2/15/2018 4:30 AM
Swift関係なく Static と Dynamic の絡んだ時の問題はあって
Avatar
Kishikawa Katsumi 2/15/2018 4:30 AM
サードパーティのライブラリを使うとかで考えると、Staticにするのは自分でやることになるわけなので。
Avatar
omochimetaru 2/15/2018 4:30 AM
Static-A , Dynamic-B, Dynamic(App)-C があるときに
Avatar
あー
Avatar
omochimetaru 2/15/2018 4:31 AM
B -> A の依存と C->A の依存があると、 AのシンボルがB経由とC経由の両方でやってきて Cにリンクするときに衝突したりしなかったりとか
4:31 AM
そういうのはある。
Avatar
3つくらいリファレンスのあるライブラリを引くとぶつかるのが
4:31 AM
思い出した
4:33 AM
前にSwiftからCか何かのライブラリを入れようとしておもちが踏んで話題に出してたのを思い出した
Avatar
omochimetaru 2/15/2018 4:34 AM
根っこの仕組み上はDynamicにくっついてるStaticはかぶっててもDynamic間の接続でシンボルが露出しなければ大丈夫(バージョンが違う同じstaticlibを埋め込めるという意味でもある) なはずなんだけど、リンカーの挙動だかなんだかで中のstaticのシンボルも検査して衝突したり、上書きされたり、 よくわかってない、そこらへんのエクスポート挙動とかも本当はコントロールできるのかもしれない
Avatar
なるほど
Avatar
omochimetaru 2/15/2018 4:35 AM
前にSwiftからCか何かのライブラリを入れようとしておもちが踏んで話題に
これはたんにprebuiltなCライブラリをリンクするのがSwiftPMだとシンドイ( -Xlinker を付けまくる)って話かも?
4:36 AM
現行のSwiftPMは何もかもstaticにして最後に一気に実行ファイルのdynamicにリンクする感じだからうまくいくっぽいけど、途中で明示的にdynamic指定できるしそういうのどうなるんだろうなあ。
Avatar
スコープをなるべく短くするためにdoを使うのってどう思いますか
Avatar
Kishikawa Katsumi 2/15/2018 6:52 AM
テストケースに書くことはよくありますけど、プロダクションのコードには大抵はもっといい方法があると思います。
Avatar
Kishikawa Katsumi 2/15/2018 6:53 AM
そもそもメソッドを分けるとか。
Avatar
do使う場合は変数多くてメソッド分けたくない場合な気がしますね
Avatar
例えばviewDidLoadで2つの複雑なObservableをmergeしたものをsubscribeしたいとなったときに、let hogeObservablelet fugaObservable をこねこね作って、Observable.merge(hogeObservable, fugaObservable) みたいに書きたい時に、 hogeObservablefugaObservable というローカル変数はなるべくスコープを短くしたい
Avatar
Kishikawa Katsumi 2/15/2018 6:54 AM
まあ、それがベターな場合もあると思いますけど常用することはほとんどないですね。
Avatar
メソッド分けたくない理由もあって、「絶対に1回しか呼ばれないでほしい」ということがあります
Avatar
viewDidLoadの中でfunction作って
6:55 AM
最後はそれを纏めて呼ぶからスッキリ終わるとか
Avatar
func派か
Avatar
Kishikawa Katsumi 2/15/2018 6:55 AM
そっすね。inner functionかクロージャに閉じ込めるかな。
Avatar
或いはそのための型を作るとか
Avatar
Kishikawa Katsumi 2/15/2018 6:56 AM
2つの変数は戻り値で受け取るか、そのまま渡す。
6:56 AM
的な。
Avatar
  • catch無しのdo { }
  • inner func
  • 無名クロージャ のどれかかと思って、doが一番ラクかなと思っていました。
Avatar
Kishikawa Katsumi 2/15/2018 6:56 AM
まあでもそこかしこにあるんじゃなかったらdoでもいいと思いますよ。
6:56 AM
そこかしこに書かないというだけで。
Avatar
僕は 一回しか呼ばれない 内部func 作るくらいなら do の方が良いと思います。
Avatar
funcだと実装と実際に呼ばれるところが違うので処理が追いづらそうと思います
Avatar
後ろ2つは呼び出しのオーバーヘッドありますよね?最適化できえるのかな
Avatar
doなら上から下に読めばおわりなので。
Avatar
ただ do にラベル付けた方が良い。
Avatar
あー最適化まわりは明るくないので、教えてほしいです。
Avatar
ラベル付きDO!
Avatar
doにラベル
Avatar
よさそう
Avatar
やばい知らなかった
Avatar
Kishikawa Katsumi 2/15/2018 6:57 AM
一回しか呼ばれないもののオーバーヘッドは考慮する必要ないかな。
Avatar
breakとcontinueができるようになる奴でしたっけw
Avatar
Kishikawa Katsumi 2/15/2018 6:58 AM
どっちが速いかよりもどっちが読みやすいかのようが優先度が高いです。 (edited)
Avatar
内部で一回でも全体として複数回呼ばれることはあるので……
Avatar
breakとcontinue が出来るのはたしかにそうですが、しなくても ラベルあった方がわかりやすい。
Avatar
「1回しか実行されてほしくない」というニーズもあるので、そうするとやっぱdoかな
Avatar
Kishikawa Katsumi 2/15/2018 6:59 AM
全体として複数回呼ばれるとしてもdoブロックとFunctionの呼び出し速度が問題になるケースはほとんどないはずです。
6:59 AM
それくらい呼ばれないと差は出ない。
7:00 AM
hogeFugaSubscription: do { ... }
7:00 AM
こう書けるのかラベル付きdo
7:01 AM
良さそう。
Avatar
viewDidLoad自体のオーバーヘッドのほうが大きすぎて、その中がfunctionかどうかは問題にならないですね
7:02 AM
この場合だと
Avatar
viewDidLoadだと全くそうですね
Avatar
昔struct使ってstatic funcの真似事するワークアラウンドあったと思うんですけど、1時代
Avatar
「この処理はうっかり2回呼んじゃうのは防ぎたい」というシーンが結構多くて、そうするとviewDidLoadとかdidSetがどんどん長くなるんですが、個別のスコープは短く保ちたいので,
7:04 AM
toiu
7:04 AM
というニーズがあった。
Avatar
型作るのが良いと思う
Avatar
絶対1回しか実行されない型?
Avatar
ViewDidLoadのライフサイクルで実行するための型
Avatar
まだ全然わかんないけど気になる
Avatar
うーんだめか、一回しか呼ばれないを担保出来るものではないぽい
Avatar
話に加わり損ねましたが、僕も do 派です。ローカル関数やクロージャ式にすると実行順がコードの記述順と入れ替わる可能性があり、それを意識しないといけないのが難点だと思います。
7:11 AM
クロージャ式即呼び出しは入れ替わらないか。
Avatar
同意見です。
Avatar
けど、 { ... }() はわかってればいいけど可読性的に微妙かなと。
7:12 AM
あと、 do だと内部から break 等できるけど、ローカル関数やクロージャ式だとできないというのもあります。
Avatar
あーそうだそうだ。それもあったんだった。
7:13 AM
個別のスコープでguardに引っかかったりして早期離脱したときに、そのdoだけスキップして次のdoをやってほしい、っていうのが
7:13 AM
viewDidLoadをreturnで抜けてほしいわけじゃないんだよな〜というのが。バグを生みそう。
7:13 AM
なのでやっぱりdoがしっくりくる
7:14 AM
(for inじゃなくて頑なにforEachを使うのも同じ理由)
Avatar
Kishikawa Katsumi 2/15/2018 7:14 AM
私は{ ... }() の方が読みやすい感覚があるんですよね。do{}はパッと見てtryか、と思ってしまうので。
Avatar
無名クロージャだとselfって書かなきゃいけないのが地味に面倒ですね (edited)
Avatar
あと、最近↓みたいなコード書いたことがあります。が、これ自体は可読性低いよなぁと感じて、単純に終了処理 2 回書いた方がいいか迷ってます。 do { ... // 開始処理 defer { ... // 終了処理 } guard ... { ... break } ... }
Avatar
あれ
7:15 AM
escapingならselfいらないんじゃ
Avatar
あそっか
7:16 AM
即実行ならいらないか
7:16 AM
escapingならself必須では 逆
7:16 AM
言いたいことはわかった
Avatar
逆だ
Avatar
koherさんのdeferのやつは、自分も迷いますね
7:17 AM
guardがいっぱいあるとか、dono
7:17 AM
doの中身が長いとかだったら全然ありだと思います。
Avatar
↑のは do の後も続いてて
Avatar
util作って可読性高めてもいいけど、あんまやると魔界化するからなぁ
Avatar
do を抜けるタイミングで終了処理を挟み込みたかったんですが、早期脱出もしたかったので、両方の終了処理を共通化しようとしたらこうなったけど、可読性は低いよなぁと。共通化を諦めて個別に書いた方がいい気もしてます。 while ... { do { ... // 開始処理 defer { ... // 終了処理 } guard ... { ... break } ... } ... }
Avatar
Kishikawa Katsumi 2/15/2018 7:20 AM
UIKitでしょうがないケースはあると思うけど、基本的に長いとかは適当な単位でメソッドなり関数なりに分割するのがシンプルに良いと思いますね。
7:21 AM
^ の例のwhileは状態をもってループするオブジェクトがあったらいいんじゃないですかね。
7:21 AM
while自体をなくす
Avatar
基本的に長いとかは適当な単位でメソッドなり関数なりに分割するのがシンプルに良いと思いますね。
これは僕もそう思います。基本的には do より関数やメソッドに分割が望ましいと思います。
Avatar
これちゃんとラベル使って
7:22 AM
breakで何を脱出するのかラベル付して明示すればわかりやすくなる
Avatar
可読性が第一なのは全員同意として、単純に実験してみました。 public func AAAAAAA(x: Int) { func step1() { /* ... */ } func step2() { /* ... */ } step1() step2() } public func BBBBBBB(x: Int) { ({ // step 1 /* ... */ })() ({ // step 2 /* ... */ })() } public func CCCCCCC(x: Int) { STEP1: do { /* ... */ } STEP2: do { /* ... */ } } /* ... */ に十分長い処理を書いて試したところ、-O でも 内部 func と クロージャはインライン化されなかったです。ちょっと意外。
👀 1
Avatar
LOOP: while ... { ACT1: do { ... // 開始処理 defer { ... // 終了処理 } guard ... { ... break ACT1 } ... } ... } こうかな
Avatar
Kishikawa Katsumi 2/15/2018 7:23 AM
^ のwhileループは二次元の構造をループするとかかな。
7:23 AM
そういうので長くなってしまうのをどうしたものかというのは何度か悩んだことがあります。
Avatar
自分で言ってて矛盾してる気がしてきた。ローカル関数より do を使うといいながらメソッドに切り出した方がいいというのは変だ・・・。
Avatar
Kishikawa Katsumi 2/15/2018 7:24 AM
読みやすいのはAAAAAAAじゃないですかね。ぱっと見の印象。
Avatar
内部func、overload出来ないし何やら色々途中な匂いがしてます
7:24 AM
そういえば内部func使うと検知するのがクソ難しいメモリリーク出来る気がする
Avatar
再利用できる必要が無いのにスコープを分割するためにメソッドに切り出すのは僕はあんまり好かないですね
7:25 AM
@tarunon 内部funcの中でselfを使ってそれをクロージャの代わりにどっかに渡すとうっかりselfのretain countが増えるとか そういう? (edited)
Avatar
Kishikawa Katsumi 2/15/2018 7:25 AM
func step1() {の定義は自然に読み飛ばすので、私の目には step1() step2() だけに見える。
Avatar
↑のは僕は CCCCCCC が読みやすいですね。
Avatar
@hiragram そんな感じ
Avatar
Kishikawa Katsumi 2/15/2018 7:25 AM
それ以外のBとCはstepの中身を読まされるのがちょっと、って感じですね。
7:25 AM
必要なければ中身は読みたくない、という印象。
Avatar
この例だとstepAとBだからわかりやすいけど、個別の実装が何をしていて、更にそれがどういう順番でどこで呼ばれてるのか、っていうのを前知識ゼロから読むのはコストが高いと感じます
Avatar
自分で言ってて矛盾してる気がしてきた。
この気持を見つめ直してみたら、ステートレスでインプットとアウトプットがはっきりしていて処理の名前が付けやすいものは関数に切り出すとテストもできるしいいんだけど、もう少しコンテクストに依存していて(ごちゃごちゃローカル変数にアクセスしてたり)次の行で使うだけのローカル変数のスコープを短くしたいだけみたいなときは do を使いたいという気持ちでした。
Avatar
Kishikawa Katsumi 2/15/2018 7:27 AM
1箇所からしか呼ばれないメソッドというのは全く問題ないと思います。意味をつけるためにメソッドや関数にするというのは基本的だと思います。
7:27 AM
^ 上の例に限らず。 (edited)
Avatar
意味の付け方がdoのラベルかメソッド名か、ということだと思うので、そうするとメソッドに切り出すことによって再利用可能性という別にいらない性質を獲得してしまうのは考えなきゃいけないことを増やしているだけに感じます
Avatar
Kishikawa Katsumi 2/15/2018 7:28 AM
まあしかし、すごい簡単な例でも実際にコードがあった方が議論しやすいですね。
Avatar
↓みたいなのとか。 let a = ... let b: B do { let t = ... // ちょっと複雑な式 b = foo(t, a) } let c = ...
Avatar
↑僕が最初に言いたかったのはまさにそういうことです。 (edited)
7:29 AM
fooの引数にそのtを導出する式を直接書くのは見づらいことがおおいけど、tはそこでしか使わないからスコープは短くしたい。
Avatar
一箇所からしか呼ばれないことは僕も問題がないと思います。切り出すことでテストも書けますし。
7:30 AM
↑のは無理すれば tfoo() の中に書けるけど、可読性のために変数に入れて名前を付けたくて、かといってそれを長々と生かしたくないみたいなケースです。
Avatar
Kishikawa Katsumi 2/15/2018 7:30 AM
^ の例の話なら、そのdoはない方がいいんじゃないかな。tのスコープが長いのは別に問題ないです。
7:30 AM
tの名前が足りない場合はしょうがない。
Avatar
あーそうなんですか
7:31 AM
うーん
7:31 AM
そうすると短いスコープなら t で済む一時変数にどこで何に使われてるかわかる説明的な名前を付ける必要が出てきませんか
Avatar
Kishikawa Katsumi 2/15/2018 7:31 AM
それが本当にtという名前をつけるならdo {}を使いますね。
Avatar
なんだろ
7:32 AM
導出が複雑な工程を関数に切り出すのは自然なことで
7:32 AM
もしかして、「それを複数回呼ばれたら崩壊する」方が問題なのでは?
Avatar
Kishikawa Katsumi 2/15/2018 7:32 AM
そうじゃなくてtとかは例で、長い式を一旦変数においているという意味で、実際はもうちょっとちゃんとした名前があるということならdo {}はない方が読みやすいです。 (edited)
7:33 AM
もしかして、「それを複数回呼ばれたら崩壊する」方が問題なのでは?
Avatar
ObservableごちゃごちゃやってHotとColdでトンチンカンみたいになってるんじゃないかしら
Avatar
@tarunon 手でNSLayoutConstraintを貼るとか、selfのDisposeBagにsubscriptionをつめつめするとか、そういうのもそうじゃない?
Avatar
Kishikawa Katsumi 2/15/2018 7:33 AM
まあこの条件がなければシンプルかもしれないですね。
Avatar
本当に t という名前を付けることを意図したわけじゃないですが、僕はそのコンテクストでできるだけシンプルな名前を使うのが好きなので、後続処理と名前がかぶって困るということは結構ある気がします。
Avatar
そこで2回呼ばれても大丈夫なためのボイラープレートを書くなら、1回しか呼ばれないことが明らかな書き方をシンプルに書くほうが好きかな
Avatar
3 行くらいなら僕も do なくてもいいんですが、 10-20 行くらいになってくると一度スコープ切っておきたいですね。
Avatar
Subscription作るところは複雑だけど、Bagにつめるのは複雑にはならないはず。
Avatar
Kishikawa Katsumi 2/15/2018 7:34 AM
NSLayoutConstraintのコードはまあひとかたまりでdo{}ブロックを作りつつ、長いviewDidLoadでいいと思います。
Avatar
手でLayoutConstraintは気持ちはわかるけどちょっと考えたほうが良いのがワイの自論
Avatar
Kishikawa Katsumi 2/15/2018 7:36 AM
どう違うのかというと、UIのコードはメソッドに分けて名前をつけてももわかりやすくもならないのでdoや空行で分けるくらいで十分、Swiftならdoでしょう、ということですね。
Avatar
Subscription複雑問題も、複雑なのはObservable組み合わせて川作る部分だけで
7:36 AM
結局それってsubscribeしないと無害なはずだから、そこで分ければなんとかなると思うけど
7:37 AM
Observableの時点で副作用バキバキなのは、もうちょっと頑張ったほうがいい
Avatar
分割したメソッドの中でsubscribeするんじゃなくて、Observableを返すようにしようやということだよね
Avatar
せやな
Avatar
まあ
7:38 AM
チームメンバーがみんなそういうコード書ければ…
👮 1
Avatar
警察業務がんばろ
Avatar
という感じなので誰の目にもあきらかな見た目のほうがいいんじゃね?と。
Avatar
func これこれこういうイベントで発火するObservableだよ() -> Observable<E> func viewDidLoad() { これこれこういうイベントで発火するObservableだよ() .subscribe { 期待した結果やで } .disposed(by: disposeBag) }
7:39 AM
イケルと思うけどなぁ
Avatar
func setupこれこれこういうイベントで発火する奴() { viewModel.hoge.subscribe().disposed(by: bag) } こうなってるのがいっぱいある。
7:40 AM
わかる。
Avatar
因果が逆転している
Avatar
Kishikawa Katsumi 2/15/2018 7:41 AM
後者の方は基本的にfragileなのでまあ微妙といえば微妙だけど。
7:43 AM
func これこれこういうイベントで発火するObservableだよ() -> Observable<E> <= これ自体は何回呼んでも、いつ呼んでもいいわけですよね?
7:43 AM
前者の方。
Avatar
です。
Avatar
Kishikawa Katsumi 2/15/2018 7:43 AM
そういう風に書くのがいいんじゃないですかね。
7:44 AM
さらにstatic funcにして余計な状態を間違って変更しないようにしてしまう。
Avatar
あ、最初の話ちょっと変わっちゃうんですが、↑こういうインスタンスメソッドである必要がなくなった時にstaticにするのはよくやるんですけど、これが型のstaticプロパティにすら依存していないものだったら型の外にprivate funcとして書くのってどう思いますか
Avatar
Kishikawa Katsumi 2/15/2018 7:47 AM
それをやりたいのは型名を省略できるからですかね。
Avatar
その型の役割ですら無いメソッドのとき って感じですね
Avatar
Kishikawa Katsumi 2/15/2018 7:48 AM
いいと思いますね。
Avatar
omochimetaru 2/15/2018 7:48 AM
追いついた
Avatar
ようこそ
Avatar
omochimetaru 2/15/2018 7:48 AM
型に逃がす派の意見はあったかしら
Avatar
@tarunon がありそうだけど無理じゃねって自己解決してた
Avatar
やりたいことは出来ないなぁ→やりたいことがおかしいでしょ(完)
Avatar
シンプル
Avatar
omochimetaru 2/15/2018 7:49 AM
func outer() { var state1 = ... var state2 = ... func inner1() { } func inner2() {} inner1() inner2() } ↑これ系のスタイルは
7:50 AM
class HogeSetUpHelper { var state1 var state2 func inner1() func inner2() func setUp(...) } func outer() { HogeSetUpHelper().setUp(self) }
7:50 AM
こういうふうに逃がせるはずで
Avatar
ワイのイメッジはまさにそれだった
Avatar
omochimetaru 2/15/2018 7:50 AM
これだと、部分処理をメソッドに切り出した結果、関係ないところから2回目の呼び出しがされちゃう問題は
7:50 AM
回避できるし
7:51 AM
Helperを書くところで、依存・参照するシンボルははっきりわかるようにできる
7:51 AM
(↑の例だとself渡しちゃてるけど、必要なものをずらずら渡すと、より見通しがよくなる)
Avatar
関係ないところからはやられないんだが、 HogeSetUpHelper().setUp(self)
8:00 AM
↑こいつを複数回呼び出されることは封印できない
Avatar
omochimetaru 2/15/2018 8:00 AM
それはviewDidLoadの場合でも2回呼ばれる可能性は残ってるからねえ。 (edited)
Avatar
実際はそうなんだけどね
8:00 AM
viewDidLoad明示呼び出しとかはさすがにLintingでなんとか出来るけど
8:01 AM
これ系いっぱいあるとLintでは難しい、それ用に型作ればまあいけるかなぁ。
Avatar
vc.viewにnil突っ込んだとき以外に2回目呼ばれるときあるけ?
Avatar
昔はだな…
Avatar
愚か者が明示的に呼ぶのも覗いて
Avatar
omochimetaru 2/15/2018 8:01 AM
いや、愚か者の話
Avatar
Kishikawa Katsumi 2/15/2018 8:01 AM
今はないです。
Avatar
2018年にvc.viewにnil突っ込むことってある?
Avatar
みんなが好きな昔の viewDidLoadviewDidUnload の話だ。
Avatar
Kishikawa Katsumi 2/15/2018 8:02 AM
理由がないならやる必要はないです。
Avatar
omochimetaru 2/15/2018 8:02 AM
クラス名に HogeOnetimeSetUpHelper とでもしておけば。
Avatar
viewDidUnloadがあった(?)時代のこと僕全然知らないんですよねえ
Avatar
Kishikawa Katsumi 2/15/2018 8:04 AM
さすがにアプリ内のメソッドを複数回呼ぶことについて対策するのは徒労だと思いますね。
8:05 AM
そこまでチームが信用できないというのはそっちの方が問題。
Avatar
まあ人間というか、来週の自分すら信用できないので「おっ便利メソッドあるやんけ、ここでも呼んだろ」となりたくてもなれない仕組みを模索しているんですよね
Avatar
人間は信用できないわかる
Avatar
Kishikawa Katsumi 2/15/2018 8:07 AM
いやまあでもキリがない話じゃないかなあ。
Avatar
omochimetaru 2/15/2018 8:07 AM
2回呼べるという事が問題というより、メソッドとして同じレベルに並んじゃうと
Avatar
キリがないは、仰る通りです。
Avatar
Kishikawa Katsumi 2/15/2018 8:07 AM
viewDidLoadは直接呼ばないでください、みたいなのと同じに聞こえますね。
Avatar
二回目呼んだら激おこ型作って、それでAssertすると多少は安全になるかもしれない
Avatar
omochimetaru 2/15/2018 8:07 AM
グループ感がなくなってしまって、全部いっぺんに読むときの見通しが悪いというのがある
8:08 AM
Helperクラスに切り出してあれば、グループであることはよくわかる。
Avatar
さっきのsetupperはVCのプロパティにいれて、一回までsetup呼べますみたいな
8:08 AM
lazy var使えばちょっとシステマチックにそういうの出来るかもしれないけど考えるの面倒臭くなってきた
Avatar
omochimetaru 2/15/2018 8:10 AM
おもちがコードの見通しにグルーブ感が無くなるとか言ってて流石に何言ってんだろって思ったけどグルーブじゃなくてグループだった。
Avatar
話題の本質でないからTwitterに書いたんだぞ
😋 1
Avatar
あーーーーーー
8:21 AM
class X { lazy var setup: Void = { // only 1 time call here }() }
Avatar
どうやって呼ぶの
8:22 AM
_ = setup ?
Avatar
_ = もいらないよ
Avatar
omochimetaru 2/15/2018 8:22 AM
しぶいねw
8:22 AM
8:22 AM
Voidだからかw
Avatar
それwarningでない?
8:22 AM
あー
Avatar
Voidだからね
Avatar
うわあ
Avatar
omochimetaru 2/15/2018 8:22 AM
また変な技が・・・
Avatar
え?Functionみたいにしたいって?
8:22 AM
しょうがないにゃぁ
Avatar
いきいきしてきたな
Avatar
class X { lazy var setup: () -> Void = { print("a") return { } }() } let x = X() x.setup() ほらよ (edited)
Avatar
omochimetaru 2/15/2018 8:23 AM
嘘の () だ・・・
Avatar
嘘の()w
Avatar
ウケる
Avatar
や、うーん?
8:24 AM
2個目のだと2回目の実行できん?
Avatar
やってみろ
Avatar
omochimetaru 2/15/2018 8:24 AM
いや、嘘だからだいじょうぶ
8:24 AM
printは1回w
Avatar
8:24 AM
うわあ
8:24 AM
うわあ。
😫 2
Avatar
Kishikawa Katsumi 2/15/2018 8:24 AM
おもしろい
Avatar
脳内コンパイルにすっげえ時間かかった
Avatar
今evolutionでワイワイやってる実行可能な型が実現すれば (edited)
8:25 AM
もうちょいスッと書けるようになりそう
Avatar
return { }
Avatar
www
Avatar
虚無だ…
Avatar
無を生成するコード
8:28 AM
func nop() { } typealias Setup = () -> Void class X { lazy var setup: Setup = { // 1回だけ return nop }() } 少し見た目をマシにしてみた
😇 2
Avatar
omochimetaru 2/15/2018 8:29 AM
let setup = once { } こういう高階関数作れそうじゃない?
8:29 AM
関数じゃなくてクロージャになっちゃうけど。
Avatar
onceいいすね
Avatar
「無を生成するコード」で思い出したけど、ちょっと話がそれるけど、この前 fooLoop { (`break`: () -> Never) in ... } みたいな break を作りたかったけどできなくて悲しくなった。
Avatar
lazy 内 で self 参照出来るっていうのは正式にOKになったんだっけか。
Avatar
omochimetaru 2/15/2018 8:30 AM
おお 良さそうだけどできないのか・・・ (edited)
8:30 AM
たしかにbreak文ってそのループで見たらNever式だ。
Avatar
ウェイ func nop() {} func once(_ f: () -> Void) -> () -> Void { f() return nop } class X { lazy var setup = once { print("1time?") } } let x = X.init() x.setup() x.setup()
8:31 AM
こんなことしてる場合じゃないわ
Avatar
omochimetaru 2/15/2018 8:34 AM
public func once<T, R>(_ f: @escaping (T) -> R) -> (T) -> R { var done: Bool = false return { (t: T) -> R in guard !done else { fatalError("do not twice") } done = true return f(t) } } (edited)
Avatar
そのonceだと引数0がVoidでしか出来なくて
8:45 AM
setup(())になるからオーバーロード欲しいすね
Avatar
omochimetaru 2/15/2018 8:52 AM
gysb?
8:56 AM
func once<R> func once<T1, R> func once<T1, T2, R> ...
Avatar
よさそう
Avatar
(気になってひさびさに開きましたがやっと追いついた..) tarunon が書いた lazy var のパターンを最初の方の once にまとめた方に置き換えたことありますね.
10:16 AM
置き換え前のコード, イディオム感があって, 本当に一度しか実行されないのかぱっと見で分かりづらかったり, lazy var の最初の方と後の方のパターンが混在していて, 他のメンバーが混乱し気味だったので (書いてもらう場合も once に突っ込んでもらえば良いので楽). 後, 他の lazy var と見分けづらいとか云々.
10:17 AM
おもちさんの方の once は思いつかなかった. done 掴んでるんですねこれ.
Avatar
>追いついた どこからスタートしたんだろう🤔
Avatar
そう、doneをキャプチャしてる
Avatar
ちょっと境目がわからなかったので, do, inner func かどうかかのあたりから, もっと前はさすがに読めてない (edited)
Avatar
public func once<T, R>(_ f: @escaping (T) -> R) -> (T) -> R { var done: Bool = false return { (t: T) -> R in guard !done else { fatalError("do not twice") } done = true return f(t) } } public class Cat { public init(name: String) { self.name = name self.onBorn() } public var name: String public func onBorn() { _onBorn(self) } private let _onBorn: (Cat) -> Void = once { `self` in print("\(self.name)がうまれた") } } Cat(name: "tama")
10:23 AM
onBorn を let にしたかったけど self がキャプチャできなかったので func onBornlet _onBorn に分かれてしまう。
10:25 AM
public class Cat { public init(name: String) { self.name = name self.onBorn() } public var name: String public lazy var onBorn: () -> Void = once { [unowned self] in print("\(self.name)がうまれた") } }
10:27 AM
lazyだと使えるのか。でもこれじゃ駄目だなあ
Avatar
おもちさんのonce動かないのでは。
Avatar
まだ動かしてなかった
Avatar
public func once<T, R>(_ f: @escaping (T) -> R) -> (T) -> R { var done: Bool = false return { (t: T) -> R in guard !done else { fatalError("do not twice") } done = true return f(t) } } class Cat { let born = once { () in print("mew") } } let c = Cat() c.born(()) c.born(())
10:34 AM
動いてるように見える
Avatar
これが動いてないだけだった。 public class Cat { public init(name: String) { self.name = name self.onBorn() } public var name: String public lazy var onBorn: () -> Void = once { [unowned self] in print("\(self.name)がうまれた") } }
Avatar
メソッドの呼び出しの間はselfが生きてないといけないからそれダメなんすよね かといって強参照したら循環だし
Avatar
iOSDCで僕が言ったアレだ
10:45 AM
「Closureではメソッドの完全な代替は出来ないんですよ」
Avatar
@bannzai さんのコレの質疑ね https://speakerdeck.com/bannzai/xiang-jie-objective-c
iOSDC 2017でお話しする内容です https://iosdc.jp/2017/node/1364 Objective-Cについて熱く語ります
Avatar
それそれ
10:48 AM
[weak self] _ in guard let `self` = self else { return } これで (edited)
10:48 AM
実行した瞬間にキャプチャ生まれないかな
Avatar
weakだから間に合わない
Avatar
呼び出したときだけだわ
10:50 AM
アカン
Avatar
SwiftのARC生成のタイミング次第だけどキリキリに生成されたらダメ
Avatar
これdeinitちゃんと呼ばれるのね。 func once(_ f: () -> Void) -> () -> Void { f() return {} } public class Cat { public init(name: String) { self.name = name self.onBorn self.onBorn } public var name: String public lazy var onBorn = once { print("\(self.name)がうまれた") } deinit { print("deinit") } } do { Cat(name: "test") }
Avatar
クロージャ自体のインスタンス化は、(Cat.init時ではなく)lazyアクセス時なので、クロージャがどこにも参照残らなければ大丈夫ですね。 (edited)
Avatar
あれ?なんでだ?
Avatar
onBornがキャプチャしてるのは、無なので
11:32 AM
セーフ
Avatar
あ、よくみたら、onceの実装が。
11:33 AM
そゆことか、lazy varの右辺を使う たるのん方式の 嘘クロージャのパターンか。
11:33 AM
自分が書いたやつだとリークした。
Avatar
キャプチャ対象は無で、クロージャはキャプチャされないので。
Avatar
onceVoidではなく() -> Voidを返すのも地味に良い。
Avatar
それ嘘ですけどね
Avatar
Voidだとlazyの受け側に型指定がないとwarningが出るので。
Avatar
lazyself参照出来るようになったのはSwift 4.0から?
Avatar
それ自体はだいぶ前から出来たけど、中途半端で、正式には https://github.com/apple/swift/pull/9920 だと思います。
Avatar
Swift 3.1.1までは public struct S { init() {} public lazy var p = self.f() func f() -> String { return "f()" } } var s = S() s.perror: use of unresolved identifier 'self' public lazy var p = self.f() ^~~~ になります。 (edited)
12:23 PM
そのPRはswift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-06-a以降ですね。
Avatar
norio_nomura 2/17/2018 4:33 AM
if caseパターンって、キャスト?もされるのね。知らなかった。 import Foundation enum MyErrorEnum: Error { case message(String) } struct MyErrorStruct: Error {} class MyErrorClass: Error {} extension String: Error {} func check(error: Error) { if case MyErrorEnum.message = error { print("expected error: \(error)") } else { print("unexpected error: \(error)") } } check(error: MyErrorEnum.message("error")) check(error: NSError(domain: "custom error", code: -1, userInfo: nil)) check(error: MyErrorStruct()) check(error: MyErrorClass()) check(error: "StringError") expected error: message("error") unexpected error: Error Domain=custom error Code=-1 "(null)" unexpected error: MyErrorStruct() unexpected error: __lldb_expr_90.MyErrorClass unexpected error: StringError (edited)
Avatar
norio_nomura 2/17/2018 4:42 AM
これのおかげで、associated valueは無視して期待するError enumが投げられるかどうかのテストを XCTAssertThrowsError(try YAMLDecoder().decode(Sample.self, from: invalidYaml)) { error in if case DecodingError.typeMismatch(_, _) = error {} else { XCTFail("unexpected error: \(error)") } } の様に記述できる。 (edited)
Avatar
if case、局所的なパターンマッチなのでいろいろ出来る。後置なので補完効かないのがつらい。
Avatar
omochimetaru 2/17/2018 8:34 AM
補完効かないソレな
Avatar
Kishikawa Katsumi 2/21/2018 4:44 AM
AppCodeは switch x { case 0: break case 1: print(y) print(z) default: print(y) print(z) } こういう複数のcaseを1行に書いたら構文エラーをレポートする。コンパイルはswiftcだからビルドはできる。独自Parserがあるんだな。
Avatar
うわぁ、これは swiftc はエラー出すべきですね。
Avatar
Kishikawa Katsumi 2/21/2018 4:48 AM
あ、そっちが間違いです?じゃあ調べてバグレポートしますかね。
Avatar
Consecutive statements on a line must be separated by ';' になっちゃうと思いますが。
4:49 AM
このエラー大嫌い。
Avatar
Kishikawa Katsumi 2/21/2018 4:50 AM
それぞれのcaseラベルはstatementじゃないんじゃないですかね。
Avatar
確かに "statement" ではないですね。
Avatar
Kishikawa Katsumi 2/21/2018 4:53 AM
あ、なので構文としては正しいのかなと思っていまして。見る限り曖昧な部分もないですし。
Avatar
構文として case 1 の時に print(y);print(z) の動作ですか?
Avatar
Kishikawa Katsumi 2/21/2018 4:54 AM
そうです。
Avatar
なるほど
4:55 AM
確かに読むと case 1 見落としやすいので構文エラーにして欲しい感 is ある 🤔
Avatar
Kishikawa Katsumi 2/21/2018 4:55 AM
文は適当なので動かしてないから違うかもしれないですけど、そう動くように見えます。
Avatar
あいまい性がないのはそうですが、 func foo() {} func bar() {} これも曖昧ではないけどエラーになるので、同じポリシーで行くべきだと思います。
Avatar
omochimetaru 2/21/2018 4:57 AM
なるほど
Avatar
Kishikawa Katsumi 2/21/2018 4:58 AM
確かにそれとかclass A{}; protocol B {};とかはセミコロン必要ですよね。
4:58 AM
構文エラーでよさそうです。
5:01 AM
話変わるんですけど if value==1 {}はOKだけどif velue!=1 {}これがダメなのは理解できるけどわかりにくいから演算子は全部スペース必要でいいんじゃないかと思ったりしてます。
Avatar
omochimetaru 2/21/2018 5:03 AM
たしかに、二項演算子のスペース無しは無くても良さそう。
5:04 AM
両方ともスペースあけるか、両方ともつけないかしか許さないようになってるけど、 後者そもそもいるのか
Avatar
.. とか ..< は?
Avatar
omochimetaru 2/21/2018 5:05 AM
うっ、たしかに、それはくっつけたいw
Avatar
Kishikawa Katsumi 2/21/2018 5:05 AM
そうですね。
Avatar
そうなんですよ。これだけスペースあけないのも変な気がしつつ、くっつけたいやつなんです。
Avatar
でもオペランドに式書く場合はくっつけたくないんですよね〜 a ... (b + foo(c)) とか。 (edited)
👍 1
6:30 AM
なので全部くっつけないというのもありなのかもと思ってます。
Avatar
omochimetaru 2/21/2018 6:30 AM
丸括弧つかうときでも僕はくっつけてた 0..<(n*2) (edited)
Avatar
全部離すと単項演算子の.....<と変わるのが微妙そうですね
Avatar
omochimetaru 2/21/2018 6:31 AM
離しても単項にはならないよ
6:31 AM
1 + 2 の + は 二項
Avatar
いや0 ..< 3..<3で違うスペースの入れ方が強制されるのは微妙だなと
Avatar
omochimetaru 2/21/2018 6:33 AM
ああ、 ..<3 は許されるのに 1..<3 が許されないのは揃ってないということか
Avatar
逆に今..< 3が許されてないのはいいんかという話にもなりかねませんが
Avatar
omochimetaru 2/21/2018 6:33 AM
確かに。
Avatar
protocol A { associatedtype B associatedtype C where C == B.Hoge } struct D: A { typealias B = String typealias C = String } where C == B.HogeHogeという型がBに無いのにコンパイルが通ってしまった。
8:48 AM
そしてそこのwhere句の制約は無視されるようになってしまいました
Avatar
omochimetaru 2/21/2018 8:48 AM
protocol HasHoge { associatedtype Hoge } protocol A { associatedtype B: HasHoge associatedtype C where C == B.Hoge } struct D: A { typealias B = String typealias C = String } 健全な形はこうか。
Avatar
それです
Avatar
omochimetaru 2/21/2018 8:49 AM
B.Hoge って書いてある時点でエラーになりそうなのに確かに通るね
8:49 AM
シンプルすぎて逆に謎・・・ バグか・・・?
Avatar
Xcode9.3 beta だとエラーになりますね。
Avatar
omochimetaru 2/21/2018 8:49 AM
8:49 AM
こちら Version 9.2 (9C40b) 古い
Avatar
Avatar
こんなにシンプルなのに修正が結構最近なんですね〜
Avatar
assoctypeをwhere句で縛れるようになったのは4以降だから
3:18 AM
バグ修正のタイミングとしては妥当に見える
3:19 AM
でも報告自体は結構昔から有るのか
Avatar
kateiくんが見つけたの、まだ4に移行してないプロジェクトなんだよな
Avatar
SomeType: SomeProtocol みたいなジェネリクスはもちろん必要だけど、逆に SomeType: !SomeProtocol みたいなジェネリクスも地味に欲しいよな…
Avatar
ある
2:05 AM
直感的にはスッと出来ないのでは?という気がしている
Avatar
「ある」って
2:06 AM
あるのか?
Avatar
Kishikawa Katsumi 2/23/2018 2:06 AM
もうあるのかと思った。
Avatar
欲しい→わかる
2:06 AM
すません😇
Avatar
Kishikawa Katsumi 2/23/2018 2:06 AM
いや、またなんかHackが出てくるのかなーと思って
Avatar
期待値www
Avatar
型制約としては無理じゃない?Anyとしてしか扱えないし
Avatar
Kishikawa Katsumi 2/23/2018 2:07 AM
コードが貼り付けられるのを待っていました。
Avatar
assoctypeにホンモノの実装への参照を当ててこいつをデフォルトVoidにすることで
2:07 AM
なんちゃってやることはあるかな
2:07 AM
そしてVoidはハイダメーみたいな感じにする
Avatar
<T: FooEnum> where T != case .foo> みたいなこともしたい・・・。
2:10 AM
原理的に無理か。
Avatar
↑見返したら何もわからんかった、移動したらコード張ります
Avatar
実行時にきまるしなー
Avatar
でも case の一部を禁じたいこと多い。
2:11 AM
Kotlin だったら継承関係持たせてグルーピングできるんだけど・・・。
2:12 AM
enum じゃなくて sealed class で) (edited)
Avatar
なんかenumの部分集合のピッチだかありましたよね?それ入れてくれればいいのでは
Avatar
それ見てないな。でも自然な感じでできるのかなぁ?
Avatar
omochimetaru 2/23/2018 2:13 AM
public class Holder<T> {} extension Holder { public func ho() { print("ho1") } } extension Holder where T == String { @available(*, unavailable) public func ho() { print("ho2") } } let a = Holder<Int>() a.ho() // これでいけるかと思ったら ho1 が出力された・・・ let b = Holder<String>() b.ho() 作戦失敗 (edited)
Avatar
部分集合じゃなくて継承だったかな? ぱっと見見つからない https://forums.swift.org/t/enum-inheritance/9933
Pitch: allow enums to inherit cases. Is this idea sound? Is this even possible given the current compiler implementation? Would this be a complex feature to implement for someone who isn’t familiar with the compiler’s codebase? Example: enum NetworkError: Error { case timedOut case cannotFindHost case notConnectedToInternet } enum MyAPIError: NetworkError { case responseInvalid case sessionExpired case notEnoughMinerals case insufficientVespineGas } func didRece...
Avatar
omochimetaru 2/23/2018 2:14 AM
enumのcaseは全部同じenumの型になるから駄目じゃない?
Avatar
sealed class的な話かしら
Avatar
うーん。変数に入ってることを考えるとそうですね。
Avatar
↑の forum の、さすがに↓は壊れてるのでは? enum NetworkError: Error { case timedOut case cannotFindHost case notConnectedToInternet } enum MyAPIError: NetworkError { case responseInvalid case sessionExpired case notEnoughMinerals case insufficientVespineGas } (edited)
Avatar
omochimetaru 2/23/2018 2:16 AM
そうですか?僕はアリだと思った 互換性は満たしていますよ
Avatar
これができたら外部から case を追加できちゃわない?
Avatar
omochimetaru 2/23/2018 2:17 AM
集合 A = (a1, a2) , 集合 B = (a1, a2, b1, b2) なら A is B
Avatar
non-exhaustive enum が導入されればアリですね。
Avatar
omochimetaru 2/23/2018 2:17 AM
ん?
2:17 AM
追加された集合は別の名前。
2:17 AM
NetworkErrorが増えたわけではないです
Avatar
: NetworkError だけど、 NetworkError として扱えるわけではない?? (edited)
Avatar
メソッドやなんかについては議論してますね
Avatar
omochimetaru 2/23/2018 2:18 AM
あ〜たしかに?記法が変だな・・・
2:18 AM
当然互換性は無いと思ってたけど継承と同じだからなんかそう見えますね・・・
Avatar
@rintaro non-exhaustive enum でも、アップデートで追加されるのと、アップデートを伴わずに自由に後付できるのは意味合いが違うような。 (edited)
Avatar
omochimetaru 2/23/2018 2:19 AM
単に、 MyAPIError に対して NetworkError を代入できるって話だと思ってた。
Avatar
まあでも enum Foo: IntInt に入れられるわけじゃないからいいのかな?
Avatar
omochimetaru 2/23/2018 2:19 AM
それは .rawValue 取れば絶対入れられる
Avatar
でも直接突っ込めはしない。
2:20 AM
サブタイプではない、という意味で。
2:20 AM
ただ、この場合は突っ込めることも保証されないから、 : Foo に新たな概念を追加することになるのか・・・。
Avatar
omochimetaru 2/23/2018 2:21 AM
enum MyAPIError { spread case NetworkError case responseInvalid case sessionExpired case notEnoughMinerals case insufficientVespineGas } ↑こんな記法だったら良さそう。 (edited)
Avatar
>アップデートで追加されるのと、アップデートを伴わずに自由に後付できるのは意味合いが違うような たしかに。 むしろ non-exhaustive enum とコンフリクトするかも。
Avatar
@omochimetaru それなら良さそう。
2:22 AM
むしろ struct でもほしい。
2:22 AM
サブタイピングを伴わない継承。
Avatar
すごい、コードとちょっと戦ってたらこんなに熱い議論にw
Avatar
omochimetaru 2/23/2018 2:23 AM
@koher 手間はかかるけどprotocolとextensionを仕込めば、結構簡単にできますよ
Avatar
ちなみに今一番切実に欲しいのは T: !Optional ですねw
Avatar
Kotlin だと↓ですね。 < T: !Optional fun <T: Any> foo() (edited)
Avatar
SwiftだとOptionalもAnyに入るからな…
Avatar
ジェネリックなのを作って個別のをdeprecateとか
Avatar
omochimetaru 2/23/2018 2:27 AM
// 親?クラス struct Animal { var name: String func speak() -> String { return "I am \(name)" } } // トリックここから protocol AnimalExtend { var animal: Animal { get set } var name: String { get set } func speak() -> String } extension AnimalExtend { var name: String { get { return animal.name } set { animal.name = newValue } } func speak() -> String { return animal.speak() } } // トリックここまで // ユーザー例 // プロトコル指定は継承指示 struct Cat : AnimalExtend { // コンパイルエラーがでるのでこれを定義 var animal: Animal // 必然的にこれも書くことになる init(name: String) { animal = Animal(name: name) } } print(Cat(name: "tama").speak()) // ok
2:27 AM
こうやる。
Avatar
Kotlin は Any? がトップタイプですからねぇ。 Any で縛れば nullable を弾けますが、 Swift の Optional は union じゃないから同じことはできないんですよねぇ。
Avatar
その代わりSwiftは Optional<Optional<T>> ができるのは魅力的ですが
2:30 AM
難しいですね仕様
Avatar
Optional のネストはほしいですね。つい最近もやっぱいるよなと思ったけど何だったかな・・・。
Avatar
(JavaのOptionalを使えばいいのでは?)
Avatar
KotlinでJavaのOptional使うのは苦痛な気が。Java書いててもあまり使う気になれないのに。
2:34 AM
@omochimetaru それをやるのが面倒なんよねぇ・・・。
😟 1
2:35 AM
逆に、拡張はできない( Stored Property を追加できない)サブタイピングする struct の継承もほしい。
2:36 AM
struct Path: String { // パス操作のための便利メソッド }
2:36 AM
Path を型として分離できるし、 String として使いたいときはそのまま代入できる。
Avatar
omochimetaru 2/23/2018 2:37 AM
うっかり?stored propertyを追加しない制約ってことですか?
Avatar
値型だからメモリレイアウトが同じじゃないといけないから、 Stored Property は追加できない。
Avatar
omochimetaru 2/23/2018 2:38 AM
transparent struct Path: String { } みたいな。 (edited)
2:38 AM
なんかその話題は昔MLで見た気がする
Avatar
Path is String であるためには。
Avatar
omochimetaru 2/23/2018 2:39 AM
ん?別に is String を取るだけなら
Avatar
ここ(か Slack )で話したこともある気がする。
2:39 AM
let s: String = path ができたい。
Avatar
omochimetaru 2/23/2018 2:39 AM
func asString() -> String が 自動で is や as で呼び出されれば大丈夫
2:39 AM
型変換が暗黙に呼ばれたら良い
2:40 AM
String is Path も取りたいなら駄目ですけどね
Avatar
暗黙の型変換じゃないところがいいところだと思うんだけどなぁ。
2:40 AM
String is Path だと意味がない。
Avatar
omochimetaru 2/23/2018 2:40 AM
うーん、そういうのは明示的な方が良いと思います
Avatar
Path のところに String 渡せてしまうから。
Avatar
omochimetaru 2/23/2018 2:40 AM
.asString() で。
Avatar
いや、暗黙じゃないんよね。サブタイピングだから。
Avatar
omochimetaru 2/23/2018 2:41 AM
それだったらstored propertyが増えても良くないですか?
Avatar
Path はあくまで String なんだけど、 Path として扱っているときは String を突っ込まれたくない。
2:41 AM
StringPath は入れたいけど PathString は入れたくない。
Avatar
omochimetaru 2/23/2018 2:41 AM
1. メモリが全く同じ、互換性は両方向にある 1-2. メモリは全く同じだけど暗黙な変換は Path is String の片方だけ 2. stored propertyが増えても良い 暗黙に Path is String 3. 現在の仕様で、随時 asString で明示的にアップキャスト (edited)
Avatar
メモリが全く同じだけど互換性を片方向にしたい。
2:42 AM
typealias Path = String だと PathString を突っ込めてしまうけど
Avatar
omochimetaru 2/23/2018 2:42 AM
1-2を希望というのはなんか不自然なような・・・
Avatar
String を引数にとる関数に Path を渡すときにいちいち変換したくない。
2:43 AM
いや、 StringPath で話してるからわかりづらいのかも。
2:43 AM
struct Age: Int {}
Avatar
omochimetaru 2/23/2018 2:43 AM
AgeInt とか
2:43 AM
ダブった
Avatar
同じ例をww
Avatar
omochimetaru 2/23/2018 2:43 AM
ですよね
2:44 AM
asInt 派です
2:44 AM
FloatをDoubleに渡すときとかと一緒 (edited)
Avatar
えー
2:44 AM
Weight: IntHeight: Int から BMI 計算するときに
Avatar
omochimetaru 2/23/2018 2:44 AM
あ、ちなみにですけど
Avatar
いちいち変換するか、それとも演算子定義しないといけないよ。
Avatar
omochimetaru 2/23/2018 2:45 AM
protocol IntConvertible { func asInt() -> Int } extension Age : IntConvertible {} こうしておいて、X: IntConvertibleで受ければ
2:45 AM
Ageをそのまま渡せる場所を明示的に指定できます
Avatar
FloatDouble はメモリレイアウトが違うし別の型だけど
2:46 AM
AgeInt の用途を絞りたいだけだから、
2:46 AM
Age is Int は OK だと思うんよね。
Avatar
omochimetaru 2/23/2018 2:46 AM
あ〜aliasである意識が強いのか。
2:47 AM
いちいち変換するか、それとも演算子定義しないといけないよ。
BMI計算はそこの変換がむしろ大事だと思っている
2:48 AM
WeightとHeightが一緒の式に混ざるのが非常に危険で
2:48 AM
そういうところで明示的に数字にアップするのが大事
2:48 AM
ああそうか、 そういう型が二種類あって、合流する時が
2:48 AM
中途半端で危険だなあ
2:49 AM
Age is Intの例の方がまだ同意できて、むしろ Weight とHeightが一緒くたの式がかけるのは、ヤバイと思う (edited)
Avatar
うーん、でも今身長や体重を扱うなら Float とかにするわけでしょ?
Avatar
omochimetaru 2/23/2018 2:50 AM
いや、場合によりますね
Avatar
struct Weight { let value: Float } とか作って区別するっていうならわかるけど。
Avatar
omochimetaru 2/23/2018 2:51 AM
それがアプリケーションでたくさん出てくるならちゃんと定義してます
Avatar
なるほど。
Avatar
omochimetaru 2/23/2018 2:51 AM
なんかサーバーからとってきてちょっと表示するだけ、とかなら、危険が無いからFloatでサボるけど。
2:52 AM
個人的にやって良かったと思うのは MoneyAmount とか TimePoint, TimeInterval(これはFoundationにもあるけど) とか
2:52 AM
Date(Foundationのやつじゃなくて、時刻部分を持たない日付だけの型) とDateTimeとか
Avatar
typealias TimeInterval = Double じゃない?独自に作ったってこと?
Avatar
omochimetaru 2/23/2018 2:53 AM
密に計算対象になったりするような場合、ちゃんと明示的な境界で守ってやると、あ〜よかった〜〜ってなることが多い
2:53 AM
はい、そうです
2:53 AM
例えばメディアプログラミングだと時間軸は有理数で扱いたいので。
Avatar
それはまた別の用途な気が。 < 有理数 (edited)
Avatar
omochimetaru 2/23/2018 2:54 AM
浮動小数だと frameInterval * frame が FPS60でちゃんとかけても1.0秒にならなかったり。
2:54 AM
いや
2:54 AM
Rational型じゃなくて
2:54 AM
ちゃんとTimeInterval型にしたってところが
2:54 AM
ポイントですね。
Avatar
なるほど。
Avatar
omochimetaru 2/23/2018 2:54 AM
TimePointとTimeIntervalは明示的にRationalにもっていってから計算対象になる。
Avatar
単位計算みたいなことを考えると、安易に Float にアップキャストされない方がいいような気もしてきた。
Avatar
omochimetaru 2/23/2018 2:55 AM
ああ、そうだった、単位計算の文脈がこれなんだ。自分の中では Unit Type って呼んでた。
Avatar
↓こういうのがあるといいのかも https://qiita.com/nushio/items/7d534a08e5c30bae32d0
事情により二日ばかし遅延評価となってしまい申し訳ありませんm( )m 次元付き計算がいかに重要か ==== 皆さん、量の計算をするうえで、単位を間違えちゃいけないよ、って教わったと思います。 180cm + 55kg = 2...
Avatar
omochimetaru 2/23/2018 2:57 AM
durationは、2つの時間の間隔を表現するための型である。
2:58 AM
C++のchronoパッケージもそんなのがある ratio型の値として secondsとか milliseconds って値がある。
Avatar
1999年、NASAの火星探査衛星マーズ・クライメート・オービターは、制御プログラムの力の単位にポンド重とニュートンが混在していたために、計画よりはるかに低い軌道に投入されてしまい、火星大気との摩擦により墜落してして失われてしまいました。
Avatar
omochimetaru 2/23/2018 2:58 AM
アメリカの単位系のせいで事故る宇宙開発の話題いくつかありますよね
Avatar
単位計算のルールを型システムにエンコードできれば、コンパイル時にすべての単位エラーを検出できるはずです。
3:00 AM
単位系じゃないけど、アポロがジンバルロックで事故りかけたみたいな話もあった気が。
Avatar
Kishikawa Katsumi 2/23/2018 3:04 AM
ビットコインのライブラリを書いてるときに、基本的にリトルエンディアンで送受信するんだけどポート番号とか一部だけネットワークバイトオーダーが混ざってるという感じなので、Int8〜UInt64のそれぞれのリトルエンディアン型を最初作ったんだけど、変換が面倒でやめてしまった。ただ型として別になってて変換が面倒な方がたぶん良いという印象。いずれそういうふうに戻したい。
3:05 AM
これは色々試行錯誤しながら書いてるときには邪魔だったというだけの話です。 (edited)
Avatar
omochimetaru 2/23/2018 3:05 AM
エンディアンはシリアライズ先の型とみなせますよね
Avatar
なるほど。サブタイプじゃない方が良いような気持ちになってきました。 (edited)
Avatar
型の扱いは別にして、ラッパー struct を簡単に定義出来る方法が欲しいというのはわかります。
Avatar
omochimetaru 2/23/2018 3:06 AM
エスケープとかも同じように型付けすると良いんじゃないかと時々思います (%エンコーディングとか)
Avatar
RawRepresentableはちょっと面倒ある
Avatar
すると enum と同じように、 struct Path: String したら、 path.rawValueString が得られるとかでいいのかも?わざわざ構文増やさなくても、↓書けばいいだけかな・・・。 struct Path { let rawValue: String }
Avatar
omochimetaru 2/23/2018 3:09 AM
initをpublicにするためにinitを書かないといけないですね
3:09 AM
あれ、public struct だったら自動定義のやつも public init だっけ
Avatar
いや、 public init の実装必須のはず。 (edited)
3:10 AM
という意味では : String の意味はあるか?
3:11 AM
必要性が弱すぎてとても通ると思えない・・・。
Avatar
すごい乗り遅れましたが、一回だけ実行したいやつで無を生成するコードにするのって実は公式テクなんですよね https://swift.org/migration-guide-swift3/dispatch_once で検索すると出てくる
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
Avatar
omochimetaru 2/23/2018 3:59 AM
The free function dispatch_once is no longer available in Swift. In Swift, you can use lazily initialized globals or static properties and get the same thread-safety and called-once guarantees as dispatch_once provided. Example
(edited)
3:59 AM
let myGlobal = { … global contains initialization in a call to a closure … }() _ = myGlobal // using myGlobal will invoke the initialization code only the first time it is used.
Avatar
あー
4:00 AM
そういえばstatic letはlazyだった
Avatar
omochimetaru 2/23/2018 4:00 AM
本当だ。因果が逆だったのか。
4:00 AM
dispatch_once探してたけど、それがなくなったのはこれが言語機能にあるからか。
Avatar
でもこの間のは値ごとにやりたい感じだったからstatic letは使えない。
Avatar
staticのletがinstanceのlazy varに当たるので、インスタンスでやりたいならlazy varで無を生成する。 自然な帰結になりましたね
Avatar
omochimetaru 2/23/2018 4:05 AM
なるほど。
Avatar
This will generate commands to build gyb files if they're present in a Swift target. Currently, there are no customization available and the gyb compiler will be looked up in the environment variab...
Avatar
omochimetaru 2/23/2018 7:59 AM
おおおおおおお
Avatar
おお!
Avatar
omochimetaru 2/23/2018 7:59 AM
アツい
7:59 AM
ひさびさにワイルドな話題を見た
8:00 AM
良いのかソレw
Avatar
これ、 iOS でも対応してくれないと Carthage と両対応とかのときにまずそう?
Avatar
CarthageはxcodeprojのTarget走らせるだけなんで、各位中でgyb走らせればオッケーなのでは (edited)
Avatar
omochimetaru 2/23/2018 8:03 AM
ん〜?
8:03 AM
gybによって生成されたファイルをターゲットに入れる必要があるけど
8:03 AM
静的に決まってるからいけるか。
8:03 AM
実行前は真っ赤になってるxcodeprojになるね。
Avatar
いやなんか
8:04 AM
生成済みソースコードは最初から入れておく感じになるのでは (edited)
Avatar
omochimetaru 2/23/2018 8:04 AM
8:04 AM
自動生成が対応するのであれば、生成物はコミットしたくないけどなあ
Avatar
それは理想的にはそうなんだが、まあ結局全部入れてる
8:04 AM
なんか前にその手の話した時に、
8:04 AM
あーーー
Avatar
omochimetaru 2/23/2018 8:05 AM
このPRによって理想に近づくってはなしかと
Avatar
それはspmが対応してないから入れなしゃーないなって感じだった
Avatar
omochimetaru 2/23/2018 8:05 AM
おもったのだ
8:05 AM
そうそう。
Avatar
spm対応したらコミットせんでええな
Avatar
omochimetaru 2/23/2018 8:05 AM
そこが解決するわけでしょ。 (edited)
Avatar
ええやん
Avatar
omochimetaru 2/23/2018 8:05 AM
うむ
Avatar
でもそこまでやるんだったらこう
8:05 AM
もうちょっとgybを見える場所においてくれというお気持ち
Avatar
ま、
I am not sure if this is something we should actually land.
なんで、とりあえず作ってみた、的な。
Avatar
omochimetaru 2/23/2018 8:07 AM
ハート付けといた
Avatar
ObjectEncoderにJSONEncoderJSONDecoder互換のクラスを追加してみた。 https://github.com/norio-nomura/ObjectEncoder/pull/18
12:18 AM
stdlibで使われてるKeyStragety以外のテストは通る。
Avatar
任意の型にStrategyを設定できるObjectEncoderの機能を利用して、JSONSerializationへ渡す/から受け取るobjectをエンコード/デコードしてる。
Avatar
そういえば昨日のPre try!Swiftで @tarunon さんと話しましたけど、この記事の classの場合 のコードがうごくのはおかしいよねっとw https://qiita.com/noppefoxwolf/items/a9d2a103d54b2b1ea415
Avatar
これ関連で最近思ってるんですが、 class でも self を書き換え可能な mutating func がほしいなぁと感じてます。
Avatar
これ extension の init は通ってないんじゃないかな。
Avatar
今それやりたいなら static func で違う Self 返すしかないですね
1:47 AM
@rintaro それがなぜかビルド通ってしかもちゃんと動くんですよ、なぜか
Avatar
イミュータブルクラス Foo に対して func update(foo: Foo, ...) -> Foo { ... }class Foo { func update(...) -> Foo { ... } } があって、 (edited)
1:48 AM
var foo = ... foo = update(foo: foo, ...) foo = foo.update(...) と書くのを
Avatar
class User: Initializable { var id: Int = 1000 /* 暗黙の */ init() {} } extension Initializable { init() { self = Factory.make(type: Self.self) } } User() で、暗黙の User.init() に直接ディスパッチされていると思います。 (edited)
Avatar
func update(foo: inout Foo, ...) { ... } のように inout にして update(foo: &foo, ...) はできるけど、 mutating func がないので対応するメソッド版 update を作れないです。
1:50 AM
mutating funcselfinout に持つ関数という文脈で)
Avatar
スレッド機能欲しいw
Avatar
すみません、チャネル分けるべきでしたw
Avatar
@rintaro そうですね、そして Accountid の初期値をなくすと、それもそのままコンパイルできちゃってStackOverflowになります
Avatar
Account の暗黙init が init(id: Int) になるので Initializable.init()Factory.make(type:) で無限再帰ですね。
Avatar
そしてそのままPlaygroundで動かすと下手するとXcode強制終了させないとMacが固まる危険性がw
1:57 AM
ですね
Avatar
昨日議論したのは、Factory.makeが、Initializable.initを呼ぶときに、witnesstable無いのに具体型のinit引っ張ってくるのがおもろいねという話
Avatar
ところが確かに読み直してみるとそもそも Factory.make が呼ばれてなかったことに気づく
Avatar
もしかしてprotocol extensionに生えてるだけのfuncでもwitnesstable作られるようになった?昔はそこの挙動に差があって、おもちとワイワイやった記憶
2:01 AM
ああ、そういうことか
Avatar
Initializable.initを呼ぶときに、witnesstable無いのに具体型のinit引っ張ってくる
ということでは無い。ということです。
Avatar
じゃあそもそもそこが勘違いなので全体的に正しい
Avatar
まあそれはそうとして、昨日初めて @tarunon さんの実在が確認できてよかったです(おい
Avatar
想定通りの動きですね。コンパイラもこの手の無限ループ検知はしんどいから
2:02 AM
非実在説。まあ今度のtry!で皆さん確認できますよw
Avatar
omochimetaru 2/27/2018 2:15 AM
読んできた
2:15 AM
謎フローに見えるけどそもそも普通のinitになっただけ?
Avatar
User.initだと暗黙宣言されたinitの方が強いからそっちを使う
Avatar
omochimetaru 2/27/2018 2:16 AM
あー、protocol側にはinitの宣言が無くて、真の型が見えてるパターンだから、そうなのかな
Avatar
Protocol側をpublicにして、ライブラリの外からinitすると死ぬパターンとか色々作れるよ
Avatar
omochimetaru 2/27/2018 2:29 AM
これ元記事にはツッコミ入れた方が良いのでは
2:30 AM
筆者が誤認してると思う
Avatar
業務が落ち着いたら追記します
Avatar
追記しときますた
Avatar
omochimetaru 2/27/2018 3:38 AM
クレジットどうもw
Avatar
@tarunon さん、 @rintaro さんと @omochimetaru さんと議論して パワーワードだw
Avatar
日本のiOS界隈四天王の3人が揃った感じですね(嘘w
🙃 1
🤔 1
🐸 1
Avatar
メンツからどこで議論されたのかが容易に割れるのが草
Avatar
https://github.com/apple/swift/pull/11869 お、無限再帰検知のPRがマージされた。限定的かもしれないけど、嬉しい機能追加。
Add a new warning that detects when a function will call itself recursively on all code paths. Attempts to invoke functions like this may cause unbounded stack growth at least or undefined behavio...
👀 1
😆 1
Avatar
↑のがバレるようになるかしら
Avatar
omochimetaru 2/27/2018 9:32 AM
気になってたやつだ
9:33 AM
↑のinitのややこしいやつもちゃんと動くかな
9:34 AM
動くはずなのに無限ループだと間違ってエラーになるのが一番困るねw
Avatar
これでも検知できなかった 😢 。直接の自己再帰だけかな? func bar() { foo() } func foo() { bar() } (edited)
Avatar
ありゃー
Avatar
前見たときは相互再帰は対応してないよってテストケースのコメントに書いてあった。
Avatar
どっちか片方に @_transparent つけると、先に展開されてからの検知になるので、警告してくれましたが。
Avatar
おお
Avatar
おもしろい
Avatar
それが検出できないってことは多分これもできないんじゃないですかね? func generate() -> UInt32 { let a = arc4random_uniform(10) if a > 10 { return a } else { return generate() } }
Avatar
それはarc4randomの仕様知識が必要だからかなり厳しいね、せめて↓の形でないと func generate() -> UInt32 { let a = arc4random() % 10 if a > 10 { return a } else { return generate() } }
Avatar
ですね
10:08 AM
やはりビルド時の無限再帰検出は難しいですね
Avatar
あんまりやりすぎるとビルド時間爆発しそう
Avatar
ObjC やC++の場合、そういうのはAnalyzeビルドの時だけよね
Avatar
あった
10:10 AM
ObjCの時あったな、便利だった
Avatar
norio_nomura 3/1/2018 10:23 AM
4.1の次は5.0ではなく4.2なのか。 https://swift.org/blog/4-2-release-process/
This post describes the goals, release process, and estimated schedule for Swift 4.2.
Avatar
takuro_mizobe 3/4/2018 11:19 AM
@omochimetaru これってなんでgit submodule使ってないのかな? >これら複数のリポジトリの管理は、git submoduleなどの一般的な仕組みではなく、swiftコンパイラプロジェクトで独自に提供される管理操作用のスクリプトを用いて行います。 https://qiita.com/omochimetaru/items/fd485185bcd07c21b49f
この記事では、swiftコンパイラ開発における作業環境構築の知見を紹介します。

リポジトリ構成

swiftコンパイラプロジェクトは、複数のリポジトリから構成されています。その中で主役となるのが[apple/swift](htt...
Avatar
omochimetaru 3/4/2018 11:32 AM
さあー? でも、このやり方なら、llvmのバージョンとswiftのバージョンを疎結合にできて、楽そう
11:32 AM
サブモジュールだと外側は必ずコミットしなきゃいけないからそれだけのプルリクとか必要になるし
11:33 AM
少し古いllvmでもビルドできるのに、外側に引っ張られてチェックアウトしなきゃいけなかったら、 llvmもリビルドしなきゃいけなくて待ち時間が伸びる
Avatar
takuro_mizobe 3/4/2018 11:34 AM
なるほど
Avatar
norio_nomura 3/7/2018 7:04 AM
なぜambiguousなのだろう? $ swift Welcome to Apple Swift version 4.1 (swiftlang-902.0.43 clang-902.0.37.1). Type :help for assistance. 1> Optional(1).map(dump) error: repl.swift:1:17: error: ambiguous reference to member 'dump(_:to:name:indent:maxDepth:maxItems:)' Optional(1).map(dump) ^~~~ (edited)
Avatar
dump関数って
7:05 AM
1引数関数じゃなくて、n引数関数で幾つかがデフォルト
Avatar
norio_nomura 3/7/2018 7:05 AM
1> :type lookup dump @discardableResult @_inlineable @_semantics("optimize.sil.specialize.generic.never") func dump<T>(_ value: T, name: Swift.String? = default, indent: Swift.Int = default, maxDepth: Swift.Int = default, maxItems: Swift.Int = default) -> T @discardableResult @_inlineable @_semantics("optimize.sil.specialize.generic.never") func dump<T, TargetStream>(_ value: T, to target: inout TargetStream, name: Swift.String? = default, indent: Swift.Int = default, maxDepth: Swift.Int = default, maxItems: Swift.Int = default) -> T where TargetStream : TextOutputStream
Avatar
今ってクロージャに関数を渡すタイミングでデフォルト引数を埋めた関数オブジェクトを生成、みたいなことは出来ないんですよね
7:06 AM
mapが要求するのは1引数関数なのでダメ
Avatar
norio_nomura 3/7/2018 7:06 AM
デフォルト未設定なパラメータの数って見てくれないんだっけ?
Avatar
駄目です
Avatar
omochimetaru 3/7/2018 7:06 AM
なるほど。
Avatar
norio_nomura 3/7/2018 7:06 AM
なるほど。
Avatar
omochimetaru 3/7/2018 7:06 AM
{ }でつつんで$0を渡すなら
7:06 AM
埋まるよね
Avatar
そうそう
7:07 AM
関数オブジェクト生成時に足りないパラメータを渡す~みたいなのはない
Avatar
omochimetaru 3/7/2018 7:07 AM
じゃあ { } で包まないオシャレ記法はデフォルト引数に頼ってる時は駄目なんだなあ
Avatar
オシャレ記法、やろうと思えば出来ないことはないんだけど
7:07 AM
そういうのって#lineとか使っててマクロがないSwiftでは詰む
7:08 AM
あれ?できないか、ごめん嘘付いた
Avatar
norio_nomura 3/7/2018 7:11 AM
Playgroundのissueナビゲータには"Found this candidate (swift.dump)"ってのが2つ並ぶので「どちらか決定できない」的なエラーなのかと勘違いしたけど、そもそもどちらも使えないのか。 (edited)
Avatar
嘘っぽい
7:12 AM
なんかその辺のエラーメッセージ嘘があった気がする
7:13 AM
あでも複数あるのは本当ですね
Avatar
norio_nomura 3/7/2018 7:13 AM
そう。
Avatar
とりあえずdumpをオレオレで高階関数化して、デフォルト引数を先に埋めてTの1引数関数を生成するようにすれば
7:15 AM
func dump<T>(name: String?=nil, indent: Int=0, maxDepth: Int=0, maxItems: Int=0) -> (T) -> Void { return { value in dump(value, name: name, indent: indent, maxDepth: maxDepth, maxItems: maxItems) } } (Int?.none).map(dump())
7:16 AM
やりたいことは出来るようになるっす
7:16 AM
このindentとかどうやって取ってきてるんだろ (edited)
Avatar
Kishikawa Katsumi 3/7/2018 7:17 AM
再帰的に呼ぶ時に+1するんじゃないですかね。内部で。
🙆 1
Avatar
これ似たようなテクを使うとGenerics関数を関数オブジェクトとして取り出すみたいな事ができる
7:18 AM
例えばArray.mapは関数オブジェクトとして取り回せないけど…
Avatar
omochimetaru 3/7/2018 7:19 AM
任意の関数 f(a, b, c, d) に対して 好きな引数を埋めた関数を得る操作があると便利か?
Avatar
デフォルト引数の扱いが関数毎に違うので一般化は出来ないと思う
7:25 AM
extension Array { func mapSpecialized<U>(_ type: U.Type=U.self) -> ((Element) -> U) -> [U] { return { self.map($0) } } } こういうの作るとmapを取り回せるようになる
7:25 AM
なんかArray.mapはrethrowsが悪さしてる気がしてきた。まあそれはおいといて
7:25 AM
こんな感じのコード書いて悪さをしてるとXcodeがよく死ぬ
Avatar
Swift ↓ちゃんとできてるなぁ。 var a = [2, 3, 5] var b = a a.withUnsafeMutableBufferPointer { $0.baseAddress!.pointee = -1 } print(a) // [-1, 3, 5] print(b) // [2, 3, 5] var a = [2, 3, 5] var b = a a.withUnsafeBufferPointer { UnsafeMutablePointer(mutating: $0.baseAddress!).pointee = -1 } print(a) // [-1, 3, 5] print(b) // [-1, 3, 5]
3:27 AM
一瞬前者でも CoW が働かないんじゃないかと思ってヒヤッとした。 (edited)
Avatar
omochimetaru 3/8/2018 3:28 AM
前者はwith...Mutable... で、 後者は with... だからか。
Avatar
withUnsafeMutable~~は実行した瞬間コピーされてるんですかね? 中身で書き換えるかどうかまで判断してたら相当賢そうですけど
Avatar
omochimetaru 3/8/2018 3:29 AM
瞬間コピーでしょう
3:29 AM
CoWはそもそもそういうもの
Avatar
中身書き換えるところは無理じゃないかな。ポインタ経由だから。
Avatar
omochimetaru 3/8/2018 3:29 AM
mutatingな関数の冒頭でuniqueでなければclone
Avatar
書き換えないなら withUnsafeBufferPointer 使えばいいわけだし問題はなさそう。
Avatar
まぁそうですよねぇ
3:31 AM
前に自前Array書いた時書き換え判断できたら凄そうだなと思ったので
Avatar
omochimetaru 3/8/2018 3:32 AM
要素ごとの比較だから計算量がでかくなりますよ
3:32 AM
non-uniqueならclone、は、カウンタ見るだけだからO(1)
Avatar
ああ、もちろん実行時に必要が出て初めてコピーできたら です
Avatar
omochimetaru 3/8/2018 3:34 AM
ポインタじゃなくてgetter/setterを渡すインターフェースならできますね。
Avatar
UnsafeMutablePointerpointee に参照型のインスタンス set するとリファレンスカウント増える??増えないと思ってた。 extension Array { mutating func update(_ body: (inout Element) throws -> ()) rethrows { let count = self.count try withUnsafeMutableBufferPointer { var pointer = $0.baseAddress! for _ in 0..<count { try body(&pointer.pointee) pointer += 1 } } } } class Cat { let name: String init(_ name: String) { self.name = name } deinit { print("deinit: \(name)") } } var a = [Cat("a"), Cat("b"), Cat("c")] a.update { $0 = Cat("\($0.name)2") } deinit: a deinit: b deinit: c
Avatar
omochimetaru 3/8/2018 3:53 AM
増えますよ
3:53 AM
増えないとやばくて
3:53 AM
もともと入ってる値が消えることを考えるとわかりやすいかと。
3:53 AM
そっちはreleaseされないといけないですよね。
Avatar
はい。なので参照型入れるときは明示的に色々やんなきゃいけないのかと思ってた。
3:55 AM
UnsafeRawPointer としてコピーとかすると壊れるのか。
Avatar
omochimetaru 3/8/2018 3:55 AM
そうですね
Avatar
そうすると↑の update は問題なさそうだけど、これより速い実装ってあるかな?
Avatar
omochimetaru 3/8/2018 4:00 AM
改善点は思いつかないです
Avatar
最初、 count が無駄かと思ってポインタを比較してループ回してたけど
4:02 AM
計測したら↑の方が速かった。
Avatar
norio_nomura 3/8/2018 4:02 AM
DispatchQueue.concurrentPerformを使ったconcurrentUpdateとか。
Avatar
↓みたいな感じ。 extension Array { mutating func update(_ body: (inout Element) throws -> ()) rethrows { let count = self.count try withUnsafeMutableBufferPointer { var pointer = $0.baseAddress! let end = pointer + count while pointer != end { try body(&pointer.pointee) pointer += 1 } } } }
4:04 AM
@norio_nomura なるほど。でも Dispatch に依存したくないですねぇ。。。 < concurrentUpdate (edited)
4:06 AM
いや、違うのかな。↑はインデックス操作がなくなってるところがポイントだけど、 concurrent だとそれができない?それでも並行になると速くなりそうだけど。
4:07 AM
領域を N 分割すれば並行でもポインタ操作でできるか。 (edited)
Avatar
議論を見ていて思ったのですが、 getBase() ..< getBase() + countgetBase() 一回で綺麗に書く構文って現状ありましたっけ?
4:16 AM
for pointer in $0.baseAddress! ..< $0.baseAddress! + count { try body(&pointer.pointee) } をもっと短く書きたい。
Avatar
omochimetaru 3/8/2018 4:22 AM
string[string.index(string.startIndex, offsetBy: 3) ..< string.index(string.startIndex, offestBy: 6)] これも短く書きたい (edited)
Avatar
Kishikawa Katsumi 3/8/2018 4:22 AM
わかる
4:23 AM
まあ現状そうなってる理由も納得できるけど
Avatar
string[offset: 3..<6] の議論はどんな感じなんだっけな。
Avatar
omochimetaru 3/8/2018 4:25 AM
ありましたねそのスレ、現状の理由とかスルーしてとりあえず気持ちが書いてある感じがしたから流したけど、発展したかな
Avatar
This seems like another case that would be well served by an operator ..<+ hack: infix operator ..<+ extension Strideable { static func ..<+ (lhs: Self, rhs: Stride) -> Range { return lhs..
Avatar
..<+ 良さそう。
4:35 AM
$0.baseAddress! ..< $0.baseAddress! + count できるの知らなかったー😣
Avatar
今まったく同じ ..<+ 書いてた…
🙃 1
4:38 AM
The objection is going to be: 5..< +10 which means something else.
4:38 AM
なるほど
Avatar
似たケースで+じゃなくて-の問題を変な回避法してたのを思い出した。 https://github.com/t-ae/ndarray/blob/master/Sources/NDArray/Core/Indexing.swift#L75-L102
ndarray - Float NDArray library for Swift, accelerated with Accelerate Framework
Avatar
なんかすごい演算子がいっぱいだ・・・
4:47 AM
infix operator ~> : StridePrecedence prefix operator ~> infix operator ~>- : StridePrecedence prefix operator ~>- infix operator ...~> infix operator ...~>-
Avatar
このへんが笑いどころ public func ~>-(range: CountableRange<Int>, stride: Int) -> NDArrayIndexElement { return range ~> (-stride) }
Avatar
omochimetaru 3/8/2018 4:49 AM
a~>-ba ~> (-b) なのね
Avatar
operator の上書きが出来ることを初めて知った。 ~> は stdlib で既に定義されているので、
Avatar
omochimetaru 3/8/2018 4:50 AM
マジ
Avatar
あれ?別であるんですね。
Avatar
norio_nomura 3/8/2018 11:53 PM
大喜利みたいだ>Shorthand for Offsetting startIndex and endIndex https://forums.swift.org/t/shorthand-for-offsetting-startindex-and-endindex/9397/172 (edited)
If we’re going to start using symbols, then clearly this is a job for emoji. I recommend arr[🔜(1)..<🔚(2)]. Like @DeFrenZ, I don’t understand this desire to avoid words, which everyone understands.
😆 1
Avatar
XcodeもSlackとかみたいに :soon: 入れると勝手に 🔜 出してくれるようになって欲しい(嘘 (edited)
Avatar
omochimetaru 3/9/2018 2:45 AM
このスレ2/1からなのに170もレスあるのか・・・
Avatar
今日のAfter talks用のサンプル(クソ)アプリ作ったので皆さん遊んでみようぜw https://github.com/el-hoshino/zundoko brewで入れられるので、こんな感じでインストールできます: brew tap el-hoshino/zundoko brew install zundoko そして使い方は zundoko の後に適当に何か英文章書きます、何が出力されるかはEnter押してからのお楽しみw zundoko try! Swift is Good
zundoko - A joke program that outputs random words from your command arguments each at a time. If eventually it output the words in the correct order, it will output the sentence again adding ! a...
Avatar
4ワードは長いw
5:32 AM
↑今日、めっちゃ仕事が忙しいので、さっそくbrewでインストールしてみましたw
5:58 AM
まあ長い文だとものすごい実行時間長いですね、仕方ないですw
Avatar
sil出したい時いつもswiftc --emit-silと書いてしまう
Avatar
omochimetaru 3/9/2018 9:11 AM
ハイフンが一個多いってこと?
Avatar
java -version さんパターンだ
Avatar
それです。
9:35 AM
javaのバージョンを調べたいことは一生に何度もないので問題ないんですが
Avatar
環境ガチャガチャしてると時々調べたくなってキレてる
😇 1
9:39 AM
java 9 でついに邪悪なのが --version になるよみたいな話を観た気がしてウキウキして java 9 いれて --version してそんなオプションネーヨと言われた気持ち
java 1
Avatar
ここでJava邪悪というのは卑怯なのでTwitterでやろう
Avatar
はい
9:46 AM
にしてもなんで swiftc も 1 個ハイフンにしちゃったんだろ
Avatar
KillSequence - A proposal to do away with Swift's Sequence protocol
Avatar
omochimetaru 3/11/2018 1:06 AM
うーん、よくわからなかった
1:07 AM
シングルパスと無限長を言ってるけど、最小の定義がそれだと思うし、 Collectionがあるんだから困る時はそっち使えば良いし・・・
Avatar
norio_nomura 3/11/2018 1:12 AM
なんとなく気持ちが悪いのはわかる気がするけど、どうなってると今より良いのか?はわからないな。
Avatar
do try 文だとネストが深くなるから、guard try let error {as XxxError} 文欲しくなった今日の今頃
Avatar
Kishikawa Katsumi 3/12/2018 5:17 AM
それはtryの処理はdo tryとネストのレベル一緒じゃないんですか?
Avatar
omochimetaru 3/12/2018 5:17 AM
どういう挙動?
Avatar
単純に guard try? else と同じような挙動で、guard と同じ階層で正常系を描く処理ですね、ただ guard try?error を消すけどこちらは消さない
Avatar
1個関数作ったら解決しそう
Avatar
omochimetaru 3/12/2018 5:19 AM
Xxxエラーの場合、else節でそれをハンドルして脱出 他のエラーの場合throwが飛んで行く か
Avatar
guard let player = try AVAudioPlayer(name: name) catch let error as NSError { print(error) // エラーハンドリング return } catch let error { return } player.play() みたいな (edited)
5:20 AM
1個関数作ったら解決しそう
確かに…? 🤔
Avatar
Kishikawa Katsumi 3/12/2018 5:21 AM
do { try ... } catch { print(error) // エラーハンドリング return }
Avatar
Voidで握りつぶすのはあんまり好きな感じではないんですが、型を変えたErrorを投げるパターンならなんとかなりそう
Avatar
Kishikawa Katsumi 3/12/2018 5:21 AM
^ これとあまり変わらない気がするんですよね。
Avatar
要は do の中で書くとネストが深くなるのがちょっと微妙に嫌ですね
Avatar
Hello dear Swift community, this proposal might seem like some new syntax sugar, but it also aims to escape the 'do { }' scope from the 'do try catch‘ mechanism while making the existing error handling more powerful. Lets assume we have some ...
Guard statements interact with pattern-matching to ensure that control flow cannot continue unless a pattern is matched. This is a very convenient way to introduce non-optional variables from optional-valued expressions:     // func foo() ...
Avatar
おおそういう議論上がってるんですね!
Avatar
Kishikawa Katsumi 3/12/2018 5:26 AM
Adrianさんのいうcatchしたあとは早期脱出を強制させられるというメリットは少し理解できる。 (edited)
Avatar
理論上は guard let Type = Type?guard let Type = try Type も同じようなものだと思うんですよね、どちらも「確実な Type が欲しい」というわけで
Avatar
Amazing proposal, I love it and thinking back there's plenty of times where I would have used the guard-catch instead of the non-swifty (to me) do-catch. A guard-catch construct still allows to handle errors explicitly, with the added convenience...
Avatar
Kishikawa Katsumi 3/12/2018 5:39 AM
この提案はまさに @lovee さんの欲してるものそのままって感じですね。
5:40 AM
ネストを嫌ってるところも。
Avatar
ですね、個人的には是非通って欲しいです
Avatar
議論止まっているので何らかアクション起こさないと動かないと思いますよ。
Avatar
つまりReplyすべき、と
Avatar
むしろ Proposal と実装まで行ってしまいましょうYO!
Avatar
Proposal自体は上がってるのではないんですか?この場合 🤔
5:45 AM
マージ?されてないけど
Avatar
一度上がったことはありますが、review 前に reject されています。 https://github.com/apple/swift-evolution/pull/734
This pull request adds a proposal for a guard/catch construct for the language. It would allow code to use throwing functions and handle errors fully, without straying from a happy path. do/catch c...
5:48 AM
あとこれ、 Parse, TypeChecker, SILGen まで影響与えるので、現時点で実装者見つけるのは厳しいかもしれないですね。
Avatar
ふむふむ、ProposalはImplementationがないからRejectされた、という感じですねコメント読む限り
5:49 AM
(つまりImplementがあればワンチャンあると 💪
Avatar
ParseからSILGenまで通しでやるのアツい
Avatar
あとこれ、 Parse, TypeChecker, SILGen まで影響与えるので、現時点で実装者見つけるのは厳しいかもしれないですね。
厳しそうですね
Avatar
https://forums.swift.org/t/guard-catch/6264 現状の最新議論はこれでした。
I’d like to propose a guard/catch construct to the language. It would allow code to use throwing functions and handle errors fully, without straying from a happy path. do/catch can be a bit heavy-handed sometimes, and it would be nice to be abl...
Avatar
あのリジェクトされたProposalのPRを出した人のですね
Avatar
A really cool "hidden" feature of UserDefaults is that it contains any arguments that were passed to the app at launch! 🚀 Super useful both in Swift command line tools & scripts, but also to temporarily override a value when debugging iOS ...
Likes
171
12:39 AM
しらなかった。
Avatar
さすがだw
Avatar
Kishikawa Katsumi 3/13/2018 12:42 AM
^ これね。Cocoaの起動時引数は恐ろしいほど複雑な処理をしている。
12:43 AM
たかだか起動時引数でPlist, XMLをParseするとか(悪い意味で)頭おかしいんじゃないかと思っている。
😆 1
Avatar
「悪い意味で」w
Avatar
Kishikawa Katsumi 3/13/2018 1:12 AM
いやあ、この仕様は明らかに無駄に複雑で、便利は便利なんだけどそれだったら1種類のフォーマットを受け付けておけば良いはずで、 -plistArg '{"foo" = bar; "array" = ("foo", {"bar" = "baz"; } ); }'-xmlArg "<dict><key>foo</key><string>bar </string><key>baz</key><string>qux</string></dict>" をフォーマットを事前に指定することもなく、両方使えるようにするとか普通に考えておかしいなあと。
1:14 AM
まあでも引数をUserDefaultsに食わせるだけみたいな実際の実装は意外とシンプルなのかな。 (edited)
Avatar
norio_nomura 3/13/2018 1:44 AM
swift-corelibs-foundation - The Foundation Project, providing core utilities, internationalization, and OS independence
Avatar
とりあえずPropertyListSerializationに丸投げしているんですね。
Avatar
Kishikawa Katsumi 3/13/2018 1:47 AM
実際に行われることは複雑だけどその部分に限って言えばシンプルで必要最小限のコードですね。
Avatar
norio_nomura 3/13/2018 1:48 AM
実際(Darwin)の実装はswiftではないと思いますが、大きくは違わないと思います。 (edited)
Avatar
Kishikawa Katsumi 3/13/2018 1:49 AM
そうでしょうね。その形で実装するのが普通だと思います。
1:51 AM
これを調べてる過程で勘違いしたのは、ProcessInfoで取れる起動時の引数とUserDefaultsに渡されるのものはそもそも互いに独立なので、不完全なPlistを渡した場合はUserDefaultsにはもちろん渡らないのだけど、起動時引数としては普通に取れる。
1:51 AM
調べてる最中に起動時引数が意図せず失われるんじゃないか、とか色々考えてしまった。
Avatar
protocol HasCodingKeys: Codable {} extension HasCodingKeys { func encode(to encoder: Encoder) throws { fatalError() } init(from decoder: Decoder) throws { fatalError() } } struct A: HasCodingKeys { private typealias Keys = CodingKeys // Use of undeclared type 'CodingKeys' } Codableinit(from decoder: Decoder)func encode(to encoder: Encoder) をprotocol extensionに実装すると、Aの中でCodingKeys がundeclaredになるんですが、どういう仕組みになってるんですかね。 (edited)
Avatar
omochimetaru 3/13/2018 9:59 AM
普通のinitとfuncだったら大丈夫なんだっけ。
Avatar
あ、proto extension 関係ないか
10:07 AM
initとfunc両方実装されている時に使えない
Avatar
ふむ
10:26 AM
いやどうだろ
Avatar
struct A: HasCodingKeys { typealias Keys = CodingKey }
10:38 AM
通ったよ。タイポでは
Avatar
struct A: Codable { struct B {} let b: B typealias Keys = CodingKeys } これを通したかったみたいでした。 (edited)
10:44 AM
そりゃ無理だ
Avatar
CondingKeyとCondingKeysわからなくなる
Avatar
XMLをパースするのにCodingKeyを無理やり使おうみたいなことをしていて、ハマりました。 https://github.com/kateinoigakukun/IBLinter/blob/812f9ccb34323df3fb4d5240c4f24dc8156e0a59/Sources/IBLinterCore/Models/Controllers/ViewController.swift
IBLinter - A linter tool for Interface Builder
Avatar
norio_nomura 3/15/2018 1:08 AM
プロパティのセッタだけ@available(*, unavailable)って出来ない?
Avatar
できなかった気がしますね
1:10 AM
外側に付けたら怒られますけど内側につけても何も言われず実行できますね
Avatar
norio_nomura 3/15/2018 1:10 AM
ありがとうございます。
Avatar
setterだけじゃなくgetterの場合もなんですよね。 以前subscriptsetterだけ定義したくて試してだめだったので
1:40 AM
var _x: Int = 0 var x: Int { @available(*, unavailable) get { return _x } @available(*, unavailable) set { _x = newValue } } print(x) // 0 x = 100 print(_x) // 100 (edited)
Avatar
norio_nomura 3/15/2018 1:42 AM
それは@availableだけの話では無いですよね。private(get)も無いから。
Avatar
確かに
Avatar
セッタのアクセスレベルがゲッタより低くしか設定できないとは明文化されてるんですけど具体的な根拠はあるんですかね。 現状で見えてる変数ライクなものが読み取れないパターンが無いのでそういうルールになっているんじゃないかという気もしますが。
Avatar
norio_nomura 3/15/2018 2:01 AM
ゲッタが無くても構わないものは、subscriptやプロパティである必要がない、ってことなのではないかと思います。 (edited)
Avatar
そうですね、多分みなさんこんな風にやってるんじゃなかと private var privateValue = 0 func setValue(_ value: Int) { privateValue = value }
2:03 AM
現実世界で言うといわゆる投函ボックスみたいな書き込み権限オンリーのアクセス権欲しい時 is よくある
Avatar
読み出しと書き込みで別の型を使いたいとかたしかそんなシチュエーションだった気がする
Avatar
それもありそうですね、外にはパブリックな型で暴露してるけど内部処理ではもうちょっと高度なプライベートな型で処理したいときとか 🤔
Avatar
https://github.com/apple/swift/pull/15102 deprecated は実装されそう。 (edited)
This handles the case where just one accessor is deprecated but not the other, which does come up sometimes in Apple's frameworks. Not included in this pull request: fixing availability checki...
❤ 1
2:12 AM
セッタのアクセスレベルがゲッタより低くしか設定できないとは明文化されてるんですけど具体的な根拠はあるんですかね。
foo.bar.baz = 1 で、foo の getter の方が絞られていると bar がそもそも取り出せないので、変な感じになってくるとかはありそうですね。
(edited)
Avatar
それですね。setHogehoge(~)があってgetHogehoge()がないのはそこまで違和感を覚えない
Avatar
readonly readwriteはあるけどwriteonlyがないのと同じっぽい
2:14 AM
というか書き込み専用はそれ実質1引数Functionだから、普通にFunctionとして書いて良いんじゃないかなとか思ったり (edited)
Avatar
norio_nomura 3/18/2018 5:42 AM
累乗関数が欲しくて、パフォーマンスをチェックしてた。 import XCTest @testable import pow let lhs = 10 let rhs = 10 let count = 1000000 let expect = Int(pow(Double(lhs), Double(rhs))) final class powTests: XCTestCase { func test0() { var x: Int = 0 measure { for _ in 0..<count { x = power0(lhs, rhs) } } XCTAssertEqual(x, expect) } …
5:45 AM
ここでexpectの算出に使ってるInt(pow(Double(lhs), Double(rhs)))の速度も測ろうと考え func test_() { var x: Int = 0 measure { for _ in 0..<count { x = Int(pow(Double(lhs), Double(rhs))) } } XCTAssertEqual(x, expect) } を追加したら、10000倍くらい速かった。
5:46 AM
しかしこれはコンパイラが賢くて、x = expectに書き換えてただけだった…コンパイル時に定数になってた。 (edited)
Avatar
コンパイラは pow が参照等価であることをどうやって知ってるんですか?
Avatar
同じファイルのグローバルスコープにlet expect = Int(pow(Double(lhs), Double(rhs)))ってのがあって、テストtest_()内でそのexpectを参照してるのと、Int(pow(Double(lhs), Double(rhs)を別モジュールの関数にした場合と速度差がありすぎることから、x = expectにしているという僕の推測です。 (edited)
10:12 AM
test_()内のループカウンタをどれだけ増やしても実行時間が変わらないので、ループ自体が無くなってるのかも?
Avatar
swift のベンチマークでは、 @inline(never) public func blackHole<T>(_ x: T) {} に食わせて、最適化を防いでますね。
10:16 AM
measure { for _ in 0..<count { blackHole(Int(pow(Double(lhs), Double(rhs)))) } }
10:19 AM
あー、けど x = expect になってるんだったら blackHole(expect) になるだけだから防げないか。 (edited)
Avatar
echo 'import Foundation; let lhs = 10, rhs = 9, count = 10000000, expect = Int(pow(Double(lhs), Double(rhs))); func test() { var x: Int = 0; for _ in 0..<count { x = Int(pow(Double(lhs), Double(rhs))) }; print(x == expect) }; test()'|swiftc -emit-assembly - -O|xcrun swift-demangle (edited)
10:32 AM
どうやらpowの呼び出し自体がなくなってるぽい。
10:33 AM
-Ononeにするとcallq _powが2箇所現れる。
10:34 AM
x = expectにしてるわけでは無く、コンパイル時に定数になってるぽい。 movq $10, _main.lhs : Swift.Int(%rip) movq $9, _main.rhs : Swift.Int(%rip) movq $10000000, _main.count : Swift.Int(%rip) movq $1000000000, _main.expect : Swift.Int(%rip) callq _main.test() -> () (edited)
10:35 AM
そりゃ速いわ。
Avatar
SILの時点ではpowの呼び出しが残ってる。
Avatar
LLVM IR の時点で llvm intrinsic の @llvm.pow.f64 に置き変えですか? (edited)
Avatar
-emit-irpowは無くなって定数1000000000になってますね。 define i32 @main(i32, i8** nocapture readnone) local_unnamed_addr #0 { entry: store i64 10, i64* getelementptr inbounds (%TSi, %TSi* @main.lhs : Swift.Int, i64 0, i32 0), align 8 store i64 9, i64* getelementptr inbounds (%TSi, %TSi* @main.rhs : Swift.Int, i64 0, i32 0), align 8 store i64 10000000, i64* getelementptr inbounds (%TSi, %TSi* @main.count : Swift.Int, i64 0, i32 0), align 8 store i64 1000000000, i64* getelementptr inbounds (%TSi, %TSi* @main.expect : Swift.Int, i64 0, i32 0), align 8 tail call swiftcc void @main.test() -> ()() ret i32 0 }
Avatar
ああ、 emit-ir はLLVM最適化後でした。 https://twitter.com/rintaro/status/963754184494350336
@orga_chem @omochimetaru Optimizationパス通した後の出力なので、最適化済みだと思いますよ。 https://t.co/1wx2exme0d
11:13 AM
-disable-llvm-optzns をフロントエンドに渡してあげると見えるかもしれない。
Avatar
$ echo 'import Foundation; let lhs = 10, rhs = 9, count = 10000000, expect = Int(pow(Double(lhs), Double(rhs))); func test() { var x: Int = 0; for _ in 0..<count { x = Int(pow(Double(lhs), Double(rhs))) }; print(x == expect) }; test()'|swiftc -frontend -emit-ir -primary-file - -target x86_64-apple-darwin17.4.0 -enable-objc-interop -sdk /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk -O -color-diagnostics -disable-llvm-optzns -module-name main -o - |xcrun swift-demangle
Avatar
$ echo 'import Foundation; let lhs = 10, rhs = 9, count = 10000000, expect = Int(pow(Double(lhs), Double(rhs))); func test() { var x: Int = 0; for _ in 0..<count { x = Int(pow(Double(lhs), Double(rhs))) }; print(x == expect) }; test()' | swiftc -O -emit-ir -Xfrontend -disable-llvm-optzns -
Avatar
define i32 @main(i32, i8**) #0 { entry: %2 = bitcast i8** %1 to i8* store i64 10, i64* getelementptr inbounds (%TSi, %TSi* @main.lhs : Swift.Int, i32 0, i32 0), align 8 store i64 9, i64* getelementptr inbounds (%TSi, %TSi* @main.rhs : Swift.Int, i32 0, i32 0), align 8 store i64 10000000, i64* getelementptr inbounds (%TSi, %TSi* @main.count : Swift.Int, i32 0, i32 0), align 8 %3 = call double @pow(double 1.000000e+01, double 9.000000e+00) pow残ってる。
Avatar
define i32 @main(i32, i8**) #0 { entry: %2 = bitcast i8** %1 to i8* store i64 10, i64* getelementptr inbounds (%TSi, %TSi* @_T04main3lhsSivp, i32 0, i32 0), align 8 store i64 9, i64* getelementptr inbounds (%TSi, %TSi* @_T04main3rhsSivp, i32 0, i32 0), align 8 store i64 10000000, i64* getelementptr inbounds (%TSi, %TSi* @_T04main5countSivp, i32 0, i32 0), align 8 %3 = call double @pow(double 1.000000e+01, double 9.000000e+00) %4 = bitcast double %3 to i64 ... declare double @pow(double, double) #1 この時点ではまだ 普通のpowですね。
Avatar
ちなみに僕の用途では、最適化で定数化されないpowは単純なforループ版より3~9倍遅かった。
Avatar
@norio_nomura
x = expect にしているという僕の推測です。
関数を同じ引数で複数回呼び出したときに同じ結果が返されるとは限らないので、 pow が参照等価であることをコンパイラが知らないと x = expect とすることができないんじゃないかと思ったんですが、そもそもコンパイル時に展開されているということは pow が特別扱いされてそうですね。
Avatar
llvmはそういう情報を持っている様です。 https://github.com/apple/swift-llvm/blob/stable/include/llvm/Analysis/ConstantFolding.h#L140-L142 /// canConstantFoldCallTo - Return true if its even possible to fold a call to /// the specified function. bool canConstantFoldCallTo(ImmutableCallSite CS, const Function *F);
Contribute to swift-llvm development by creating an account on GitHub.
11:59 PM
Contribute to swift-llvm development by creating an account on GitHub.
12:02 AM
Constant folding and constant propagation are related compiler optimizations used by many modern compilers. An advanced form of constant propagation known as sparse conditional constant propagation can more accurately propagate constants and simu...
Avatar
switch のパターンマッチに ? 使えるの知らなかった😇 if case let だけかと思ってた。 let a: Int? = 42 switch a { case let x?: print(x + 1) // 43 default: print("nil") }
Avatar
omochimetaru 3/30/2018 2:24 AM
そういうケースはよく .some(let x) って書いてた。
Avatar
うん、ずっと .some(let x) にしてた。
Avatar
後置letになってる👀
Avatar
omochimetaru 3/30/2018 2:25 AM
xcode補完に流されている・・・
Avatar
以前の rintaro さんの意見を聞いて以来、後置派になりました。
Avatar
omochimetaru 3/30/2018 2:27 AM
x?. の時は ?. だけど x?: の時は x? : なのが紛らわしいな。
2:27 AM
: は演算子には使えない文字なんだっけ。
Avatar
switch (open, close) { case (let open?, let close?): return "\(open)〜\(close)" case (let open?, nil): return "\(open)〜" case (nil, let close?): return "〜\(close)" case (nil, nil): return "" } 最近こんなん書いたけど、?ついてるからややこしいなーと (edited)
Avatar
たしかに .some の方が可読性高い?
Avatar
omochimetaru 3/30/2018 2:28 AM
慣れの問題かもしれんけど見づらいな
Avatar
? ついてると一瞬脳が Optional と認識してしまいそうかも?
2:30 AM
でも if case let a? = aOrNil はうまい表現だと思うんだよなぁ。宣言しているのはあくまで a? が剥がされてる感が。
2:30 AM
本当は Optional Binding も if let a? = aOrNil にしてほしい。
Avatar
Optionalの変数2つをnil or someでパターン網羅したい場合は、if文だとひたすらelse ifでかかなきゃならない?
Avatar
omochimetaru 3/30/2018 2:34 AM
網羅する時はswitchのほうがええでしょうね、網羅性チェックも効くし。
Avatar
だよね
Avatar
omochimetaru 3/30/2018 2:35 AM
if case の1行表記が欲しい
2:35 AM
1行というか式になるやつ。
Avatar
Bool で結果を得たいということ?
Avatar
omochimetaru 3/30/2018 2:40 AM
一番多いのは
2:41 AM
enum Animal { case cat(Cat) case dog ... } ↑で animal: Animal から Cat? を取り出したい (edited)
2:42 AM
現状だと1行で書こうとしても↓これだけかかる run { if case .cat(let x) = animal { return x } else { return nil } } (edited)
Avatar
Cat? を取り出しても、大抵のケースでは結局その後で分岐することになるのでは?
2:44 AM
button.isEnabled = ... みたいなときに Bool がほしいのはある気がする。
Avatar
omochimetaru 3/30/2018 2:44 AM
例えばそれを Observable<Animal> から Observable<Cat>` に変換する時とかにほしいんですよ
2:44 AM
Array<Animal> から Array<Cat> に compactMap するとかでもいいですね。
Avatar
うーん、それは switchif case して return するしかなさそうだなぁ。 (edited)
Avatar
omochimetaru 3/30/2018 2:50 AM
I wanted to circle back to this comment from @Joe_Groff: Has there been any recent discussion about this? I’d love for enums to be a bit more ergonomic via optional-chaining. Key path support would be a nice, free bonus! I can imagine it work...
2:50 AM
enum個別のケースとしては今議論されてる
2:51 AM
マッチング式は今のところ気配が無いけどとりあえずこれが来るとニーズの一つは解消するので助かる
2:51 AM
スレかなり伸びてるなあ
Avatar
conditional conformance は struct に対してだけで protocol に対しては使えないんですね。
3:50 AM
conditional conformance を public にしようとすると 'public' modifier cannot be used with extensions that declare protocol conformances と言われるんですが、なぜそうなってるんでしょう?(でも外からはちゃんと認識されてるっぽい)
3:51 AM
とりあえず多項式環が、係数が体のときにユークリッド環型になるというのができました👍 extension Polynomial: EuclideanRing where R: Field {
👍 1
Avatar
conditionalかに限らずprotocolに制約の後付けはできないはずですね。 https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#conditional-conformances-via-protocol-extensions
swift - The Swift Programming Language
Avatar
仮にprotocolに制約の後付けができるようになるとしたら、それはexistentialに対して行う操作になるのでは (edited)
Avatar
ふむふむ
Avatar
omochimetaru 3/31/2018 4:05 AM
掛け算ができるやつを多項式にすると、余り付き割り算ができるやつが、書けたのか
Avatar
そうです!
Avatar
omochimetaru 3/31/2018 4:10 AM
プロトコルに後付けするんじゃなくて、 絞ったwhere付きのプロトコルを別名で定義するのがやりたい事?
Avatar
今まではそのために係数が割り算ができることを要請しないといけなかったので、整数係数多項式ができなかったんです👍(とても嬉しい)
4:12 AM
protocol に対してもできるのかとナイーブに考えてて、できなかったので「あ、できないのか」と思った感想を呟きましたw
4:12 AM
public にできないのは何故なのか素朴に気になります。
Avatar
omochimetaru 3/31/2018 4:12 AM
あー、プロトコルに対して書いておくと、それに合致するときに満たしてるやつらが自動的に満たすってかきたいのか
Avatar
はい
4:14 AM
抽象論として環をイデアルというもので割るとまた環ができるのですが、このイデアルが「極大イデアル」だと体になるというのがあって、それを書こうとしてできなかったですw
4:15 AM
例えば整数全体を 12 の倍数で割ると時計のような環ができるのですが、割る数が 3 とか 5 とかの素数だと(対応するイデアルが極大になって)割り算もできる体になるんです。
4:16 AM
これをプロトコルのレベルでやろうとしたのですが、できなかったです😂
Avatar
omochimetaru 3/31/2018 4:16 AM
あっ、なんかそれやったことある気がする・・・素数だとうまいことズレて重ならなくて・・・みたいな
👍 1
4:17 AM
うーんそうか基本的にプロトコル準拠はノミナルな型に対して明示的に定義される形になるのか
Avatar
protocolを定義する時に protocol Collection: Sequence みたいに書くのとはまた違う感じでしょうか?
Avatar
omochimetaru 3/31/2018 4:18 AM
例えばOptionalとArrayの、中身がEquatableなときにそれ自体もEquatableであるやつとか、 個別に書かないといけない
Avatar
あー
4:19 AM
一般には出来ないわけか
4:19 AM
Ok
Avatar
omochimetaru 3/31/2018 4:19 AM
両方のモナドに対して、集合をたたみこむ特性をプロトコル化して、一気に共通定義するみたいなことを
😃 1
4:20 AM
タケトさんの発想だとできるが、 現仕様だとできなそう
Avatar
あ、ですです。
Avatar
subprotocol作ってassoctypeがあるならそこに制約入れて…みたいな感じを逐一やっていくしかないですね
Avatar
なるほどなるほど。
Avatar
omochimetaru 3/31/2018 4:24 AM
ジェネリックマニフェストには将来的トピックとして書いてあるのかな? 考えたことないテーマだったけど理解不足で取りこぼしてるかも
4:24 AM
直感的にはそれを許しちゃうと言語の柔軟性にユーザーの頭がついていかない気はする
4:25 AM
IDEが良きに説明してくれたらいいんかな。
Avatar
なんか直感的には出来ない気がしてきたけどまだちゃんとわからん
Avatar
omochimetaru 3/31/2018 4:26 AM
cc @ukitaka
Avatar
ふむふむ、とりあえず僕がやりたかったことは subprotocol を作る方法で行けそうです。ありがとうございます😆 (edited)
Avatar
確かに protocol を自由に拡張できちゃうとめちゃくちゃになりそうですね。
Avatar
protocolのconform自体はできないけど、同じ名前の関数生やしておけば定義だけすれば使える、という感じにはなりそう
Avatar
既出かもしれませんが、エイプリルフールプロポーザル出てますねw https://github.com/CodaFi/swift-evolution/blob/3571229e07a03d8e3a037224267fe6525ff33ed1/proposals/NNNN-lolcode-literals.md
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
omochimetaru 4/1/2018 2:23 PM
LOLCODEの文法やばw
Avatar
@swiftbot func bar(foo: int) { func inner(arg: int = foo) {} print(inner()) } bar(foo: 3)
Avatar
swiftbot BOT 4/2/2018 2:24 AM
Swift version 4.1 (swift-4.1-RELEASE) Target: x86_64-unknown-linux-gnu
2:24 AM
/usercode/main.swift:1:15: error: use of undeclared type 'int' func bar(foo: int) { ^~~ /usercode/main.swift:2:21: error: use of undeclared type 'int' func inner(arg: int = foo) {} ^~~
Avatar
@swiftbot func bar(foo: Int) { func inner(arg: Int = foo) {} print(inner()) } bar(foo: 3)
Avatar
swiftbot BOT 4/2/2018 2:25 AM
Swift version 4.1 (swift-4.1-RELEASE) Target: x86_64-unknown-linux-gnu
2:25 AM
swift: /home/buildnode/jenkins/workspace/oss-swift-4.1-package-linux-ubuntu-16_04/swift/lib/SILGen/SILGenGlobalVariable.cpp:64: bool isGlobalLazilyInitialized(swift::VarDecl *): Assertion `!var->getDeclContext()->isLocalContext() && "not a global variable!"' failed. /usr/bin/swift[0x3f24d54] /usr/bin/swift[0x3f25096] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f15d2b98390] /lib/x86_64-linux-gnu/libc.so.6(gsignal+0x38)[0x7f15d12d7428] /lib/x86_64-linux-gnu/libc.so.6(abort+0x16a)[0x7f15d12d902a] /lib/x86_64-linux-gnu/libc.so.6(+0x2dbd7)[0x7f15d12cfbd7] /lib/x86_64-linux-gnu/libc.so.6(+0x2dc82)[0x7f15d12cfc82] /usr/bin/swift[0xc929db] /usr/bin/swift[0xc6a1e3] /usr/bin/swift[0xc6af00] /usr/bin/swift[0xc7448c] /usr/bin/swift[0xc69ee4] /usr/bin/swift[0xcc47f6] /usr/bin/swift[0xc91f8d] /usr/bin/swift[0xc2e86b] /usr/bin/swift[0xc2c51b] /usr/bin/swift[0xc2b847] /usr/bin/swift[0xcc1225] /usr/bin/swift[0xcc106e] /usr/bin/swift[0xc8fec5] /usr/bin/swift[0xc33515] /usr/bin/swift[0xc2ba85] /usr/bin/swift[0xc30f7b] /usr/bin/swift[0xc31c46] /usr/bin/swift[0xc3221d] /usr/bin/swift[0x4c27c4] /usr/bin/swift[0x4beecc] /usr/bin/swift[0x4778c4] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f15d12c2830] /usr/bin/swift[0x475179] Stack dump: 0. Program arguments: /usr/bin/swift -frontend -interpret /usercode/main.swift -disable-objc-interop -module-name main 1. While emitting SIL for 'bar(foo:)' at /usercode/main.swift:1:1 2. While silgen emitFunction SIL function "@_T04main3barySi3foo_tF". for 'bar(foo:)' at /usercode/main.swift:1:1 3. While silgen emitDefaultArgGenerator SIL function "@_T04main3barySi3foo_tF5innerL_ySi3arg_tFfA_". for expression at [/usercode/main.swift:2:27 - line:2:27] RangeText="f" Aborted (core dumped)
Avatar
壊れた
Avatar
omochimetaru 4/2/2018 2:25 AM
コンパイラこわれた
2:26 AM
Assertion !var->getDeclContext()->isLocalContext() && "not a global variable!"' failed. (edited)
2:27 AM
innerのfooがローカルコンテキストではないと期待してるけど、実際には外側のbarのローカル変数だから
2:27 AM
アサーションがこける?
Avatar
omochimetaru 4/2/2018 2:30 AM
bugs行きで良いと思います
Avatar
🙆
Avatar
omochimetaru 4/2/2018 2:31 AM
その上で、そのあたりのコードを読んで、適切な修正を試みると楽しいかもしれない・・・
Avatar
楽しそう
Avatar
Taketo Sano 4/2/2018 2:36 AM
conditional conformance 使ってガシガシ重複コードを削ってくと、いよいよ generic な extension が欲しくなってきますね🤓 (edited)
Avatar
条件付きでprotocolにconformするprotocolだと思う
2:38 AM
昨日一日考えたのですが、コンパイルが終わらなくなるケースがあって難しそうだなと思いました
Avatar
omochimetaru 4/2/2018 2:40 AM
これはできる・・・ struct Stone {} extension Stone { func aaa<T>(_ t: T) {} }
Avatar
protocol A {} protocol B {} protocol C {} extension A: B where Self: C {} extension B: C where Self: A {} extension C: A where Self: B {}
2:41 AM
仮にできたとして、↑が解けなくなりそう
2:43 AM
あれっ
2:43 AM
genericなextensionになってるw
2:43 AM
違う話かな
Avatar
omochimetaru 4/2/2018 2:43 AM
@Taketo Sano 欲しい記法を詳しく教えてくださいw
Avatar
Kishikawa Katsumi 4/2/2018 2:54 AM
@swiftbot versions
Avatar
swiftbot BOT 4/2/2018 2:54 AM
Available Swift versions: 2018-03-31-a 4.1 4.0.3 3.1.1 3.0.2
Avatar
Kishikawa Katsumi 4/2/2018 2:54 AM
@swiftbot —version 2018-03-31-a func bar(foo: Int) { func inner(arg: Int = foo) {} print(inner()) } bar(foo: 3)
Avatar
swiftbot BOT 4/2/2018 2:54 AM
Swift version 4.1 (swift-4.1-RELEASE) Target: x86_64-unknown-linux-gnu
2:54 AM
swift: /home/buildnode/jenkins/workspace/oss-swift-4.1-package-linux-ubuntu-16_04/swift/lib/SILGen/SILGenGlobalVariable.cpp:64: bool isGlobalLazilyInitialized(swift::VarDecl *): Assertion `!var->getDeclContext()->isLocalContext() && "not a global variable!"' failed. /usr/bin/swift[0x3f24d54] /usr/bin/swift[0x3f25096] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f6befe6f390] /lib/x86_64-linux-gnu/libc.so.6(gsignal+0x38)[0x7f6bee5ae428] /lib/x86_64-linux-gnu/libc.so.6(abort+0x16a)[0x7f6bee5b002a] /lib/x86_64-linux-gnu/libc.so.6(+0x2dbd7)[0x7f6bee5a6bd7] /lib/x86_64-linux-gnu/libc.so.6(+0x2dc82)[0x7f6bee5a6c82] /usr/bin/swift[0xc929db] /usr/bin/swift[0xc6a1e3] /usr/bin/swift[0xc6af00] /usr/bin/swift[0xc7448c] /usr/bin/swift[0xc69ee4] /usr/bin/swift[0xcc47f6] /usr/bin/swift[0xc91f8d] /usr/bin/swift[0xc2e86b] /usr/bin/swift[0xc2c51b] /usr/bin/swift[0xc2b847] /usr/bin/swift[0xcc1225] /usr/bin/swift[0xcc106e] /usr/bin/swift[0xc8fec5] /usr/bin/swift[0xc33515] /usr/bin/swift[0xc2ba85] /usr/bin/swift[0xc30f7b] /usr/bin/swift[0xc31c46] /usr/bin/swift[0xc3221d] /usr/bin/swift[0x4c27c4] /usr/bin/swift[0x4beecc] /usr/bin/swift[0x4778c4] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f6bee599830] /usr/bin/swift[0x475179] Stack dump: 0. Program arguments: /usr/bin/swift -frontend -interpret /usercode/main.swift -disable-objc-interop -module-name main 1. While emitting SIL for 'bar(foo:)' at /usercode/main.swift:1:1 2. While silgen emitFunction SIL function "@_T04main3barySi3foo_tF". for 'bar(foo:)' at /usercode/main.swift:1:1 3. While silgen emitDefaultArgGenerator SIL function "@_T04main3barySi3foo_tF5innerL_ySi3arg_tFfA_". for expression at [/usercode/main.swift:2:27 - line:2:27] RangeText="f" Aborted (core dumped)
Avatar
Kishikawa Katsumi 4/2/2018 2:59 AM
@swiftbot --version=2018-03-31-a func bar(foo: Int) { func inner(arg: Int = foo) {} print(inner()) } bar(foo: 3)
Avatar
swiftbot BOT 4/2/2018 2:59 AM
Swift version 4.2-dev (LLVM 0d52728a8a, Clang 1d3cad1e6b, Swift 6c42bcccbd) Target: x86_64-unknown-linux-gnu
2:59 AM
swift: /home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/swift/lib/SILGen/SILGenGlobalVariable.cpp:64: bool isGlobalLazilyInitialized(swift::VarDecl *): Assertion `!var->getDeclContext()->isLocalContext() && "not a global variable!"' failed. /usr/bin/swift[0x411c854] /usr/bin/swift[0x411cb96] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f64a8588390] /lib/x86_64-linux-gnu/libc.so.6(gsignal+0x38)[0x7f64a6cc7428] /lib/x86_64-linux-gnu/libc.so.6(abort+0x16a)[0x7f64a6cc902a] /lib/x86_64-linux-gnu/libc.so.6(+0x2dbd7)[0x7f64a6cbfbd7] /lib/x86_64-linux-gnu/libc.so.6(+0x2dc82)[0x7f64a6cbfc82] /usr/bin/swift[0xcb8bb3] /usr/bin/swift[0xc8d123] /usr/bin/swift[0xc8dde3] /usr/bin/swift[0xc9e360] /usr/bin/swift[0xc8cef4] /usr/bin/swift[0xcecb34] /usr/bin/swift[0xcb8091] /usr/bin/swift[0xc4fb59] /usr/bin/swift[0xc4d64f] /usr/bin/swift[0xc4c878] /usr/bin/swift[0xce96b5] /usr/bin/swift[0xce94fe] /usr/bin/swift[0xcb5f5b] /usr/bin/swift[0xc54c84] /usr/bin/swift[0xc4cb25] /usr/bin/swift[0xc525bb] /usr/bin/swift[0xc53266] /usr/bin/swift[0xc5385d] /usr/bin/swift[0x4d820d] /usr/bin/swift[0x4d4b9c] /usr/bin/swift[0x48a26d] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f64a6cb2830] /usr/bin/swift[0x487ac9] Stack dump: 0. Program arguments: /usr/bin/swift -frontend -interpret /usercode/main.swift -disable-objc-interop -module-name main 1. While emitting SIL for 'bar(foo:)' at /usercode/main.swift:1:1 2. While silgen emitFunction SIL function "@$S4main3bar3fooySi_tF". for 'bar(foo:)' at /usercode/main.swift:1:1 3. While silgen emitDefaultArgGenerator SIL function "@$S4main3bar3fooySi_tF5innerL_3argySi_tFfA_". for expression at [/usercode/main.swift:2:27 - line:2:27] RangeText="f" Aborted (core dumped)
Avatar
Kishikawa Katsumi 4/2/2018 3:00 AM
最新のスナップショットでも同じか。iPhoneからだとダブルハイフンがダッシュに変わってしまう。。。
Avatar
最新のスナップショットが手軽に試せるの最高ですね
Avatar
そっかiPhoneからでも試せるのか…
Avatar
Kishikawa Katsumi 4/2/2018 3:06 AM
コードを全部入れるのは大変だけど、元になるのがあればコピーペーストできるから簡単。
Avatar
@omochimetaru 多分↓これのことじゃない? < 欲しい記法 https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#parameterized-extensions (edited)
swift - The Swift Programming Language
Avatar
omochimetaru 4/2/2018 3:14 AM
それっぽい
Avatar
これほんとにほしくて、 func foo<T>(_ array: [T?]) -> [T] { ... } はできるのに↓ができないのは、関数よりもメソッドを優先する Swift としては明らかな言語仕様的不足。 extension<T> Array where Wrapped == T? { func foo() -> [T] { ... } }
Avatar
omochimetaru 4/2/2018 3:21 AM
あーたしかに・・・
Avatar
omochimetaru 4/2/2018 3:33 AM
ワイもOptionalConvertible.swift書いてある
Avatar
OptionalProtocol 、昔は where T == Int? とかでも必要だったけどこれは解消してマシになったんですけど、まだ == T? が書けないんですよねぇ。
3:44 AM
これがないから compactMap の Proposal に書かれてる compact も実装できない・・・。 https://github.com/apple/swift-evolution/blob/master/proposals/0187-introduce-filtermap.md
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
Taketo Sano 4/2/2018 3:58 AM
@koher それです!!!
3:58 AM
Parameterized extensions という名前だったんですね、適当な呼び方してしまってすいません😉
Avatar
omochimetaru 4/2/2018 3:59 AM
↑のOptionalProtocolでのワークアラウンドみたいにすることで
3:59 AM
taketoさんのユースケースで目的が果たせる可能性があります (edited)
Avatar
Taketo Sano 4/2/2018 3:59 AM
ふむふむ?
Avatar
omochimetaru 4/2/2018 3:59 AM
↓これは書けないけど extension<T> Array where Element == T? { func foo() -> [T] { ... } } (edited)
Avatar
Taketo Sano 4/2/2018 4:00 AM
Wrapped は Element のことです?
Avatar
omochimetaru 4/2/2018 4:00 AM
これは書けるので使い勝手としては同じ事ができます extension Array where Element: OptionalConvertible { ... } extension Optional : OptionalConvertble { ... } (edited)
4:00 AM
あ、ですね
Avatar
Taketo Sano 4/2/2018 4:01 AM
OptionalConvertble というのは?
Avatar
omochimetaru 4/2/2018 4:02 AM
public protocol OptionalConvertible { associatedtype _Wrapped func asOptional() -> Optional<_Wrapped> } extension Optional : OptionalConvertible { public func asOptional() -> Optional<Wrapped> { return self } }
Avatar
Taketo Sano 4/2/2018 4:05 AM
すいません、これが必要となるケースがあまりわかってないです🤔
Avatar
omochimetaru 4/2/2018 4:06 AM
あとで整理しますね
Avatar
Taketo Sano 4/2/2018 4:06 AM
すいません🙏
4:09 AM
ちなみに自分がやろうとしてできなかったのは、cond. conf. + typealias でできるだけ新しく型を作るのを抑えようとしていたのですが、 public protocol EquivalenceRelation { .. } public struct QuotientSet<X, Rel: EquivalenceRelation>: SetType where X == Rel.Base { .. } public struct ModSubgroupRelation<H: Subgroup>: EquivalenceRelation { .. } public typealias QuotientGroup<G, H: Subgroup> = QuotientSet<G, ModSubgroupRelation<H>> where G == H.Super extension QuotientGroup: Group where X: Group, Rel: ModSubgroupRelation<H> // あっ
4:10 AM
typealias するときに型を包むと、包んだ後のものについては cond. conf. が使えないということに気づいたのでした。 (edited)
4:15 AM
抽象化するとこうなると思います: protocol A {} struct X<T: A> {} struct B<S>: A{} typealias Y<S> = X<B<S>> extension<S> Y where T == B<S> { .. } // コレ (edited)
4:16 AM
generic に typealias した Y を新しい型だと思いたいのですが、そうすると extension できないという。
Avatar
こんな感じでしょうか? protocol A {} struct X<T: A> {} struct B<S>: A{} typealias Y<S> = X<B<S>> protocol BProtocol: A { associatedtype _S var bValue: B<_S> { get } } extension B : BProtocol { var bValue: B<S> { return self } } extension X where T : BProtocol { // これがやりたい }
Avatar
Taketo Sano 4/2/2018 4:33 AM
おぉ…😲
4:34 AM
これが上の Optional のと同じことをしてるんですね…(まだ飲み込めてない
Avatar
extension<S> Y where T == B<S>extension<S> X where T == B<S> と同じ意味になると思います。
Avatar
Taketo Sano 4/2/2018 4:34 AM
そうですね。
Avatar
さっきの Optional の話と合わせると BProtocolBConvertible とした方がよかったかもしれません。
4:35 AM
BProtoclB に変換できるので実質的に B のように扱えます。
Avatar
Taketo Sano 4/2/2018 4:36 AM
B<S> に対応する protocol を一段かませばいけるってことか!
4:36 AM
ちとやってみます🤓👍 (edited)
🙂 1
Avatar
Taketo Sano 4/2/2018 4:45 AM
public protocol _ModSubgroupRelation: EquivalenceRelation where Base == Sub.Super { associatedtype Sub: Subgroup } public struct ModSubgroupRelation<H: Subgroup>: _ModSubgroupRelation { public typealias Base = H.Super public typealias Sub = H ... } public typealias QuotientGroup<G, H: Subgroup> = QuotientSet<G, ModSubgroupRelation<H>> where G == H.Super extension QuotientGroup: Group where Rel: _ModSubgroupRelation, X == Rel.Base { ... } できたっぽいです!
Avatar
おおっ😀
4:47 AM
あ、多分 _ModSubgroupRelation プロトコルから ModSubgroupRelation を取り出すメソッドかプロパティをつけないといけないと思います。 (edited)
Avatar
Taketo Sano 4/2/2018 4:56 AM
そうですね、なんか今上手く行ってないですw
4:57 AM
あ、いや、大丈夫でした。
4:57 AM
ModSubgroupRelation は static method を一個持ってるだけで、インスタンスとして使われることのないものです。
4:58 AM
同値関係を型で与えて QuotientSet に埋め込むという。
4:59 AM
しかしこの書き方が分かりやすいかは怪しい気がしてきたので、ここはいくつかで実装を分ける方向で行こうかなと思います😅アドバイスありがとうございました!
Avatar
@Taketo Sano 現状の Swift でうまく抽象化できずに類似コードを何度も書かないといけないケースでは、僕らは gyb (という Swift コンパイラでも使われている)ツールを使ってコードジェネレーションに逃げてることが多いですね😅 https://qiita.com/omochimetaru/items/422ddd04e95c55dd3833#gyb

メタプログラミングとテンプレートエンジン

プログラミングにおいて、そのプログラミング言語の機能だけではプログラムを書くのが大変だったり難しいときに、外部のツールな...
Avatar
Taketo Sano 4/2/2018 5:28 AM
なるほどなるほど。
Avatar
Taketo Sano 4/2/2018 6:56 AM
protocol P{} struct A<T> {} extension A: P where T == Int {} extension A: P where T == String {} // error: redundant conformance of 'A<T>' to protocol 'P' 異なる条件でも同じ protocol への conformance はできないんですね…🙍 (edited)
Avatar
それやろうとすると
7:00 AM
protocol IntOrString {} extension Int: IntOrString {} extension String: IntOrString {} extension A: P where T: IntOrString {} みたいに回り道が必要になりますねぇ
Avatar
Taketo Sano 4/2/2018 7:00 AM
ですよね😿
Avatar
Taketo Sano 4/3/2018 2:17 AM
こういうのもエラーになることが分かりました。 @swiftbot protocol A {} protocol B: A {} protocol C: A {} protocol D: B, C {} struct X<T>: A{} extension X: D where T == Int { // Type 'X<T>' does not conform to protocol 'B' }
Avatar
swiftbot BOT 4/3/2018 2:17 AM
Swift version 4.1 (swift-4.1-RELEASE)
2:17 AM
/usercode/main.swift:7:1: error: type 'X<T>' does not conform to protocol 'B' extension X: D where T == Int { // Type 'X<T>' does not conform to protocol 'B' ^ /usercode/main.swift:4:10: note: type 'X<T>' does not conform to inherited protocol 'B' protocol D: B, C {} ^
Avatar
Taketo Sano 4/3/2018 2:18 AM
こうしないと行けない @swiftbot protocol A {} protocol B: A {} protocol C: A {} protocol D: B, C {} struct X<T>: A{} extension X: B where T == Int {} extension X: C where T == Int {} extension X: D where T == Int {}
Avatar
swiftbot BOT 4/3/2018 2:18 AM
Swift version 4.1 (swift-4.1-RELEASE)
Avatar
Taketo Sano 4/3/2018 2:18 AM
エラーメッセージがこれと気づきにくいので時間が溶けがち😔
2:21 AM
D で B の要求を C を使って protocol extension で実装する、というようなことがこれだとできない☹
2:24 AM
@swiftbot protocol A {} protocol B: A {} protocol C: A {} protocol D: B, C {} struct X<T>: A{} extension X: B, C, D where T == Int {}
Avatar
swiftbot BOT 4/3/2018 2:24 AM
Swift version 4.1 (swift-4.1-RELEASE)
Avatar
Taketo Sano 4/3/2018 2:25 AM
これでいけることが明らかになりました😆
2:25 AM
ちゃんと継承の順番通りに並べて書けばいいらしい。
Avatar
Taketo Sano 4/3/2018 3:30 AM
だいぶ慣れて来ました👍 extension BilinearMap: VectorSpace, BilinearMapType where Domain: ProductSetType & VectorSpace, Domain.Left: VectorSpace, Domain.Right: VectorSpace, Codomain: VectorSpace, Domain.CoeffRing == Codomain.CoeffRing, Domain.CoeffRing == Domain.Left.CoeffRing, Domain.CoeffRing == Domain.Right.CoeffRing {
Avatar
すごい Constraints だ・・・
Avatar
Taketo Sano 4/3/2018 3:42 AM
parametrized extension ができるようになればもっとシンプルに書けるんですが…w
3:43 AM
extension <V1: VectorSpace, V2: VectorSpace, W: VectorSpace> BilinearMap: BilinearMapType where Domain == ProductVectorSpace<V1, V2>, Domain.CoeffRing == Codomain.CoeffRing { } これで済むと思います。
🙄 1
Avatar
はやくサポートされてほしいですねぇ。昨日 parameterized extension がないと対応しようがない問題にぶち当たって(サポートする型を列挙しようがない)、トリッキーな方法で回避しないといけませんでした・・・。
Avatar
Taketo Sano 4/3/2018 3:45 AM
誠に待ち望ましいです😂
Avatar
メソッドではなく関数なら問題ないので、数学なら演算子で逃げるという手もあるかもしれませんね。
Avatar
Taketo Sano 4/3/2018 3:47 AM
それは結構辛い感じになりそう…
Avatar
extension<T> Array where Element == Optional<T> { func compact() -> Array<T> { ... } } の代わりに func compact<T>(_ array: Array<Optional<T>>) -> Array<T> { ... } になりますが、関数だと記述順が辛いところを
3:48 AM
演算子だと instance operator parameter の順に書けるのでメソッドっぽくなります。
3:48 AM
ただ、その操作に数学で一般的な演算子の記号がないと辛いことになりそうですね😅
3:49 AM
(一般的な演算子の記号があるならすでに演算子で実装されてますよね・・・) (edited)
Avatar
omochimetaru 4/3/2018 3:51 AM
関数後置演算子という魔法・・・
Avatar
Taketo Sano 4/3/2018 3:51 AM
読むの不可能なコードができあがりそうですw
Avatar
omochimetaru 4/3/2018 3:51 AM
func |> (a, b) { return b(a) }
Avatar
Taketo Sano 4/3/2018 3:54 AM
上の大量の constraint つきのコードビルドしたら Segmentation fault になりました 😂
😂 3
Avatar
Taketo Sano 4/3/2018 4:05 AM
これが原因らしい… 🔪 public typealias BilinearForm<V: VectorSpace> = BilinearMap<V, V, AsVectorSpace<V.CoeffRing>> extension BilinearForm: BilinearFormType where Domain: ProductSetType & VectorSpace, Domain.Left: VectorSpace, Domain.Left == Domain.Right, Domain.CoeffRing == Domain.Left.CoeffRing, Codomain == AsVectorSpace<Domain.CoeffRing> { }
Avatar
typealias に対して extension を書かない方がいいかもしれませんね。
Avatar
Taketo Sano 4/3/2018 4:22 AM
元のものに戻してもダメでした 😫
😣 1
Avatar
コンパイラクラッシュはなんにせよバグなので、最小際限ケースがわかればバグレポートするのがいいのですが・・・(誰かが直してくれる可能性がある)
Avatar
Taketo Sano 4/3/2018 4:26 AM
SegFault の原因を探るのってどうしたらいいんでしょう?w
4:26 AM
Contribute to SwiftyAlgebra development by creating an account on GitHub.
Avatar
僕は徐々にコードをシンプルにしていきながら問題が発生する限界を見極めますが、もっと良い方法があるかもしれません。
Avatar
Taketo Sano 4/3/2018 4:27 AM
該当部分を消せばコンパイルが通るので、原因は確実にそれなんですが…
Avatar
既存プロジェクトでやると大きすぎて原因特定が大変なので、似たようなコードを単独の swift ファイルで作成し、同じ状況を作り上げるところから始めて、徐々にコードを削りながらバグが際限する最小ケースを探すという手順が良いんじゃないかと思います。
4:31 AM
(そこまでするかどうかですが😅
Avatar
Taketo Sano 4/3/2018 4:47 AM
上のはやりすぎに思えてきたので、諦めて途中段階の struct をもう一個作ることにしましたw
🙂 1
Avatar
元々特殊化された generic タイプ に対する extension は認められていないので、 typealias も extension 付けられません。
5:15 AM
@swiftbot class C<T> {} typealias IntC = C<Int> extension IntC {}
Avatar
swiftbot BOT 4/3/2018 5:15 AM
Swift version 4.1 (swift-4.1-RELEASE)
5:15 AM
/usercode/main.swift:3:1: error: constrained extension must be declared on the unspecialized generic type 'C' with constraints specified by a 'where' clause extension IntC {} ^ ~~~~
Avatar
https://bugs.swift.org/browse/SR-4875 でも generic パラメータ付きの typealias が素通りしてしまうバグがあります。
Avatar
Taketo Sano 4/3/2018 5:53 AM
なるほど、バグなんですね!
5:53 AM
素通りするから認められてるものと思っていました。
5:54 AM
ありがとうございます🙏
Avatar
ただ、このバグは generic パラメータが無視されるだけなので、 segfault はまた別のバグですね。
Avatar
norio_nomura 4/5/2018 2:28 AM
@swiftbot #if swift(>=4.1.0) let version = "4.1.0" #elsif swift(>=4.0.3) // it should be `elseif` let version = "4.0.3" #endif
Avatar
swiftbot BOT 4/5/2018 2:28 AM
Swift version 4.1 (swift-4.1-RELEASE)
2:28 AM
/usercode/main.swift:3:9: error: expected expression #elsif swift(>=4.0.3) // it should be `elseif` ^ /usercode/main.swift:4:17: error: invalid redeclaration of 'version' let version = "4.0.3" ^ /usercode/main.swift:2:17: note: 'version' previously declared here let version = "4.1.0" ^
Avatar
norio_nomura 4/5/2018 2:30 AM
@swiftbot --options=-swift-version 3 #if swift(>=4.1.0) let version = "4.1.0" #elsif swift(>=4.0.3) // it should be `elseif` let version = "4.0.3" #endif
Avatar
swiftbot BOT 4/5/2018 2:30 AM
Swift version 4.1 (swift-4.1-RELEASE)
2:30 AM
error: failed to launch REPL process: process launch failed: 'A' packet returned an error: 8
Avatar
norio_nomura 4/5/2018 2:30 AM
@swiftbot --options="-swift-version 3" #if swift(>=4.1.0) let version = "4.1.0" #elsif swift(>=4.0.3) // it should be `elseif` let version = "4.0.3" #endif
Avatar
swiftbot BOT 4/5/2018 2:30 AM
Swift version 4.1 (swift-4.1-RELEASE)
Avatar
norio_nomura 4/5/2018 2:31 AM
-swift-version 3が付いた時に#elsifってのがそのまま通ってしまうぽい?
Avatar
#if から #endif の間が swift(>=4.1.0) じゃないので、パースの対象外になるので、
2:34 AM
無視されますね。
Avatar
norio_nomura 4/5/2018 2:34 AM
なるほど…
Avatar
手元のplaygroundsでも通りましたけどversionが参照できなかったです
Avatar
norio_nomura 4/5/2018 2:36 AM
このtypoに気づけなくて、何か対策コードを書けないかと思ったのだけれど、難しそう。 https://github.com/realm/SwiftLint/pull/2143/commits/2ab42cdec10ae6c3ff5839d498500103a92b932c
Avatar
そのあとに_ = version書いとけば判定はできそうですね。 一般的には使えなそうですが。
Avatar
norio_nomura 4/5/2018 2:39 AM
SourceKitへ渡すソースなので、コンパイルされない文字列なのですよね。 (edited)
😫 1
Avatar
パースの対象とするか否かを、現在の言語モードではなく、コンパイラの対応バージョンで決定するべきだ。という主張は出来ると思います。
2:41 AM
つまり -swift-version 3 でも 4.2 対応のコンパイラなら swift(>=4.1.0)false だけども内容はパースする。
Avatar
norio_nomura 4/5/2018 2:43 AM
その場合、canImport()とかの新しい条件が含まれてた時にエラーになったりしないですかね。
Avatar
そういうのも含めて考慮すべき点はいくつかあると思います。
Avatar
norio_nomura 4/5/2018 2:45 AM
Swiftのドキュメントを確認しようとしたらリンク切れになってた。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html
2:47 AM
The definitive guide to Swift, Apple’s programming language for building iOS, macOS, watchOS, and tvOS apps.
Avatar
norio_nomura 4/5/2018 2:56 AM
つまり -swift-version 3 でも 4.2 対応のコンパイラなら swift(>=4.1.0) は false だけども内容はパースする。 コードが想定する対応バージョンのコンパイラでちゃんとテストしろ、で済んでしまう問題ではあるのですよね…
Avatar
fatalErrorとpreconditionFailureって明確なルールをもって使い分けてる方いたらどういうふうにやってるか知りたいです
Avatar
omochimetaru 4/9/2018 7:43 AM
完全には明確じゃないけど
7:43 AM
preconditionFailureってそもそもあんまり使わなくて
7:43 AM
preconditionで書けるならそのほうがいいから(削除時に分岐ごと消えるカラーとして
7:43 AM
preconditionFailure自体の使い所にあまり出会わないけど
7:44 AM
使う場合はやっぱりそこに突入するのが事前条件違反での死の場合で (edited)
7:44 AM
fatalErrorはそこで死ぬ事自体が関数の機能な場合に使うようにしてる
Avatar
ふむ
7:45 AM
僕はおもちが「それは強制アンラップでいい」って言いそうなシーンでfatalErrorを使って、アプリ固有のロジック上ここにはいることはありえないみたいな時にpreconditionFailureを使うようにしてる
Avatar
omochimetaru 4/9/2018 7:46 AM
あ、まさにそれだ
7:46 AM
extension Optional { public func unwrap(_ message: @autoclosure () -> String = "", file: StaticString = #file, line: UInt = #line) -> Wrapped { guard let value = self else { let m = message() fatalError("Optional unwrap failed" + (!m.isEmpty ? ": " + m : ""), file: file, line: line) } return value }
7:46 AM
↑今使ってるやつだけど、強制アンラップだと、ヒント情報が付けられないのが気に食わないのでこれを使ってて
7:46 AM
これは違反時に死ぬ事自体が明確な機能だからfatalErrorで書いてるわ
Avatar
guard let tableView = tableViewController.tableView else { fatalError("UITableViewControllerじゃなくなった?") }
7:47 AM
とか
Avatar
omochimetaru 4/9/2018 7:47 AM
let tableView = tableViewController.tableView.unwrap("UITableViewControllerじゃなくなった?") ↑こうかいたほうがよくない?
Avatar
あまり差はなく感じる
Avatar
omochimetaru 4/9/2018 7:47 AM
1行と3行
Avatar
これはguardであるということは主張しておきたい
7:47 AM
って前もこんな話したなw
Avatar
omochimetaru 4/9/2018 7:48 AM
それがノイズなんだよね
7:48 AM
えっと、
7:48 AM
guardであることをコードリーダーが「読むたびに」把握するべきことなのか
7:48 AM
「問題発生時に解析可能であればいい」のか
7:48 AM
の違いだと思ってて
7:49 AM
一般的なguard(returnするケース)は、アプリケーションロジックだから
7:49 AM
コードで表されたアプリケーション仕様だから、把握しておく必要があるんだけど
7:49 AM
!とか、死ぬケースっていうのは、把握しておく必要はないはずなんだよね
7:49 AM
なぜなら書いた時にそれが起こらない事が「検証済みなはず」で
7:49 AM
それについてはもう忘れて良いはずだから。
7:50 AM
で、それについて思い出すのは、テストして落ちた時でいい。
Avatar
それはそのメソッドの実装者も利用者も一人だけのときでないと無理じゃない?
Avatar
omochimetaru 4/9/2018 7:50 AM
いや、そんなことないでしょ
7:50 AM
「メソッドの利用者はメソッドの前提条件を知らねばならない」から。
7:51 AM
どんな使い方のメソッドなのか理解してから使うものでしょ。
Avatar
何らかの改修があったときに機能まで検証済みだった前提が壊れてないかをチェックするのにguardキーワードはあってほしいけどなあ
Avatar
omochimetaru 4/9/2018 7:51 AM
その前提がおけなくて、「型検査で通る呼び出しはなんでもされうる」っていうシナリオなら、まあそうだけど、それって厳しいケースがたくさん出てきそう
7:52 AM
そういうパターンは
7:52 AM
そもそも実行テストで洗い出さないといかんやん。
Avatar
ふむ〜
7:53 AM
非同期処理とか絡んでくると全パターン完全に網羅するの無理だとおもうんだよなあ
Avatar
omochimetaru 4/9/2018 7:54 AM
無理だからこそ
7:54 AM
頭で把握しようとしても無理なので
7:54 AM
どうせ実行テストしないといけなくて
7:55 AM
実行テストで洗い出せるようになってれば、 コードとしては3行じゃなくて1行にすませてスッキリさせといたほうが
7:55 AM
読みやすい分お得
7:55 AM
みたいな。
7:55 AM
あ、でもそもそも
7:56 AM
!相当のクラッシュとかは、メソッド冒頭に集めてあるイメージではある
7:56 AM
うーんまあそれは関係ないか?
Avatar
まあ早期離脱やでな
Avatar
omochimetaru 4/9/2018 7:58 AM
fatalErrorで殺す場合を想定してる、 returnで脱出場合はguard書くよ(ってかメソッドにできないし
7:59 AM
てかもともとの fatalError vs preconditionFailure の話でいうと、 (edited)
7:59 AM
さっきみたいに unwrap メソッドにしちゃうと
7:59 AM
それがprecondition的呼び出しかどうかはわからないせいで
7:59 AM
fatalErrorになっちゃうって問題はあるんだよね
8:00 AM
func preconditionNotNone<T>(_ t: T?) -> T
8:00 AM
これ作ったこともある。これは内部で preconditionFailureで死ぬ。
Avatar
Taketo Sano 4/9/2018 1:40 PM
四元数の掛け算の一部: let x = a.x * b.x - a.y * b.y - a.z * b.z - a.w * b.w が Expression was too complex... と言われて辛い😵 なぜかこうすると通るようにはなる… let x = a.x * b.x - (a.y * b.y + a.z * b.z + a.w * b.w)
1:41 PM
Swift3 の頃は true && true && true とかやるだけで出てた気がするのでだいぶ良くはなったんだと思いますが🙄
Avatar
Kishikawa Katsumi 4/9/2018 1:41 PM
これは演算子のオーバーロードですかね。
Avatar
Taketo Sano 4/9/2018 1:41 PM
はい、そうです。
Avatar
Kishikawa Katsumi 4/9/2018 1:41 PM
まあ、辛さはわかります。
😥 1
Avatar
Taketo Sano 4/9/2018 1:41 PM
でもここに出てくる a.x たちの型は決まってるものなので、そう複雑でもないように人間の目には見えるんですが。 (edited)
Avatar
演算子のoverloadの解決が、二要素の総当たりで型を推論して、それが重なりあったときに冪乗で計算量が増えてしまう、だった気がする
Avatar
Kishikawa Katsumi 4/9/2018 1:43 PM
演算子は結構難しいと思うんですよね。カッコをつけたら通るというのは型もそうですけど結合順位の解決が大変なんじゃ無いですか。
Avatar
==と&&もそんな感じでおそい
Avatar
結合順位って演算子ごとに決まってないですっけ?
Avatar
ここがConditionalConformanceでワンチャンはやくなるのでは?と思ってるんですが試してないな (edited)
Avatar
Kishikawa Katsumi 4/9/2018 1:44 PM
コントロールできたでしょ。
1:44 PM
違ったっけ。
Avatar
Taketo Sano 4/9/2018 1:44 PM
演算子ごとに固定だと思います(カスタム演算子は自分で設定できる)
Avatar
Kishikawa Katsumi 4/9/2018 1:45 PM
なるほど、+ とか-は変更できないのか。
1:45 PM
じゃあなんだろ。型なのかな。
Avatar
x, y, z, w の型が定まってるなら組み合わせなさそうですけどねー🤔
1:46 PM
リテラルだと ExpressibleByXxxLiteral で組み合わせ爆発するけど(ここが Swift 特有の問題だと思ってます)、この場合はどうしてだろう・・・。 (edited)
Avatar
局所的には複数の演算子にマッチし得て、式全体を通してみると一意に決定されるとか? (edited)
Avatar
Taketo Sano 4/9/2018 1:49 PM
𝐑 * 𝐑 は一通りしかないはずなんですよね…
1:50 PM
𝐑 * M みたいな感じで係数になりうるケースはあるので、その辺がマッチしちゃってるんだと思うんですが…
Avatar
𝐑 の正体は何者ですか? Double
Avatar
Taketo Sano 4/9/2018 1:51 PM
Double を wrap した struct です。
Avatar
うーん、プロトコルじゃないんですね。なら一意に定まりそうですねぇ。
1:53 PM
𝐑 * 𝐑 は一通りしかないはずなんですよね… 𝐑 * M みたいな感じで係数になりうるケースはあるので、その辺がマッチしちゃってるんだと思うんですが…
𝐑 * 𝐑 ではなく𝐑 * ? で探索始めちゃってるんですかねぇ?コンパイラの内部の挙動を確認しないとわからなさそう・・・。
Avatar
@ukitaka
1:53 PM
型推論の優先順位を見れるのがありましたよね、あれに通すと何かわかるかも
Avatar
Taketo Sano 4/9/2018 1:54 PM
おぉ、そんな機能が
Avatar
あってるかわかりませんが
2:01 PM
public static func -(a: 𝐑, b: 𝐑) -> 𝐑 { return 𝐑(a.value - b.value, a.error + b.error) }
2:01 PM
を付け加えたら通りました
😲 1
Avatar
Taketo Sano 4/9/2018 2:01 PM
Avatar
@@
Avatar
Kishikawa Katsumi 4/9/2018 2:04 PM
つまり、 (a.x * b.x )- (a.y * b.y) - (a.z * b.z) - (a.w * b.w)- を探し続けてたってこと? (edited)
2:04 PM
ちょっと式の意味変わっちゃってるけど。
Avatar
( もう解決してそうですが、型推論の挙動自体はswift -frontend -typecheck -debug-constraints ファイル名.swift で見れます )
Avatar
Kishikawa Katsumi 4/9/2018 2:05 PM
こうか。
Avatar
(ukitakaくんありがとう)
Avatar
Taketo Sano 4/9/2018 2:07 PM
ちなみに 2項 - は AdditiveGroup というプロトコルで + と単項 - を使ってこう定義してます: public extension AdditiveGroup { public static func -(a: Self, b: Self) -> Self { return (a + (-b)) } } https://github.com/taketo1024/SwiftyMath/blob/master/Sources/SwiftyMath/Abstract/AdditiveGroup.swift#L12
SwiftyMath - Pure Math in Pure Swift.
2:07 PM
今から上の方法試してみます。
Avatar
なるほど、数学的だ
👍 1
Avatar
Taketo Sano 4/9/2018 2:11 PM
おぉ、ほんとだ、通るようになった😂
2:11 PM
でもこれは普通に通っといて欲しい笑
Avatar
zと同じように
2:13 PM
let x = a.x * b.x + -a.y * b.y - a.z * b.z - a.w * b.w
2:14 PM
とすると通りますね
2:14 PM
2項の - を削除しても
Avatar
これって、デフォルト実装だと探索順位が変わってる(低い)ってことですか?? (edited)
Avatar
Taketo Sano 4/9/2018 2:15 PM
@masakihori そうなんですよね…是非そんなへんな書き方はしたくないですw
2:16 PM
@koher ってことなんですかねぇ…
Avatar
Kishikawa Katsumi 4/9/2018 2:17 PM
swift -frontend -typecheck -debug-constraints って簡単なコードでもすごい大量の出力がありますね。
2:17 PM
200MBくらいになったところで止めた。
Avatar
Taketo Sano 4/9/2018 2:18 PM
えげつなく出てきますねw 僕もいま該当の部分だけのファイル作ってるとこでしたw
Avatar
お、際限できたかも
Avatar
Kishikawa Katsumi 4/9/2018 2:20 PM
あ、そもそもリテラルでToo complexになるものにかけたので問題はそこです。組み合わせが大量にあって解決できないわけだから当然かと。
Avatar
けどもう新幹線おりなきゃ
Avatar
Kishikawa Katsumi 4/9/2018 2:20 PM
だから普通のコードでやるぶんには大丈夫。
Avatar
protocol FooProtocol { static func +(lhs: Self, rhs: Self) -> Self static func -(lhs: Self, rhs: Self) -> Self static prefix func-(value: Self) -> Self } extension FooProtocol { static func -(lhs: Self, rhs: Self) -> Self { return lhs + -rhs } } struct Foo : FooProtocol { static func +(lhs: Foo, rhs: Foo) -> Foo { return lhs } static prefix func-(value: Foo) -> Foo { return value } } let a = Foo() let b = a + a - a + a - a + a - a + a
2:21 PM
これで明示的な実装を付けたらどうなるか試したいけどもう新幹線下りるので後で・・・
Avatar
Kishikawa Katsumi 4/9/2018 2:22 PM
@swiftbot protocol FooProtocol { static func +(lhs: Self, rhs: Self) -> Self static func -(lhs: Self, rhs: Self) -> Self static prefix func-(value: Self) -> Self } extension FooProtocol { static func -(lhs: Self, rhs: Self) -> Self { return lhs + -rhs } } struct Foo : FooProtocol { static func +(lhs: Foo, rhs: Foo) -> Foo { return lhs } static prefix func-(value: Foo) -> Foo { return value } } let a = Foo() let b = a + a - a + a - a + a - a + a
2:24 PM
^ このコードだけ見るとコンパイラをいじめるだけのコードにしか見えないけど、佐野さんの例を見ると、これがコンパイルできる必要があるんだなあと。
😁 1
Avatar
いじめるだけのコードw
2:26 PM
どこかにoverloadのタネが埋まってるのかなと思ったけどそうでもないですね
Avatar
このあたりのオーバーロードの解決を軽くする改善されてたよな〜と思ったら... いつのまにかRemove されてた 😂 https://github.com/apple/swift/pull/14581
The current implementation isn't really useful in the face of generic overloads. It has never been enabled by default, and isn't useful to keep around if it is disabled. If we ever want to ...
😇 1
Avatar
↓だと大丈夫でした。 protocol FooProtocol { static func +(lhs: Self, rhs: Self) -> Self static func -(lhs: Self, rhs: Self) -> Self static prefix func-(value: Self) -> Self } extension FooProtocol { static func -(lhs: Self, rhs: Self) -> Self { return lhs + -rhs } } struct Foo : FooProtocol { static func +(lhs: Foo, rhs: Foo) -> Foo { return lhs } static prefix func-(value: Foo) -> Foo { return value } } extension Foo { static func -(lhs: Foo, rhs: Foo) -> Foo { return lhs + -rhs } } let a = Foo() let b = a + a - a + a - a + a - a + a
2:30 PM
やっぱり明示的に実装されているか、デフォルト実装かで推論の優先順位が変わってそう。
Avatar
Taketo Sano 4/9/2018 2:30 PM
infix - を明示的に入れるか否かの違いってことですね🙄
Avatar
これって推論のバグなんじゃないのかなぁ・・・。
Avatar
Taketo Sano 4/9/2018 2:31 PM
protocol extension のありがたみが… 😆
Avatar
ところで+と-で動きが違うのは
2:31 PM
-はprefixがあるからなのかな?
Avatar
- はデフォルト実装だからじゃないですか?
2:32 PM
あー、 prefix の可能性もあるのか。
Avatar
Taketo Sano 4/9/2018 2:32 PM
prefix あると思います。
Avatar
SwiftyMathのほうは+もデフォ実装です
2:32 PM
AddativeSubgroupにありますね
Avatar
でも prefix と解釈したらパースに失敗しそうな?
Avatar
Taketo Sano 4/9/2018 2:32 PM
そうなんですよねぇ
Avatar
ん?? +- かどっちかは明示的な実装が必要でないですか?
Avatar
Taketo Sano 4/9/2018 2:34 PM
infix + と prefix - が必要で、それを使って infix - がデフォルト実装されるようになってます。
2:35 PM
@tarunon AdditiveSubgroup は、整数全体の中の偶数全体のように、親の演算をそのまま子供が引き継げるケースで使うやつです。
Avatar
let x = a.x * b.x - a.y * b.y - a.z * b.z// - a.w * b.w
2:35 PM
これなら通る
Avatar
RはAddaptiveと思ってたけど見間違いかしら
Avatar
なので推論に使える「深さ」があってそれをオーバーしたのでtoo complexで諦めた?
Avatar
↑↑はあってる、で、どちらもprotocol extensionの実装
2:38 PM
具体型のimplだと通るのはそれがoverloadで静的に見つかるからと思う、witness-tableから引いてるわけではなさそう
Avatar
Taketo Sano 4/9/2018 2:40 PM
Additive というのは演算が加法的 + という意味です(のことではなく?)
2:41 PM
加法的な演算に乗法的な演算が加わって環(Ring)というものになります。
Avatar
僕の言っているのは、+も-もinfixは全部protocol extensionの実装になっているので、この場合は+がコンパイル可能だが-は不可能、その差はprefix operatorの有無では?と言う話です。そのprotocol extensionの宣言はAddativeSubGroupが持ってますよね? (edited)
Avatar
Taketo Sano 4/9/2018 2:43 PM
+ のデフォ実装は基本的にはないです、
2:44 PM
AdditiveGroup の subprotocol に AdditiveSubgroup というのがあって、sub の方は super が演算を引き継げるようになってます。
2:47 PM
(意図をくめてなかったらすみません🙏
Avatar
あでもRealNumberは+の定義も持ってた!
2:47 PM
すみません、ここは僕の読めてなかったところだ
Avatar
Taketo Sano 4/9/2018 2:47 PM
引き算と割り算が省略できる作りになってます。
Avatar
RealNumber > SubField > Subring > AddativeSubgroup
2:49 PM
ここで、AddativeSubgroupはSuperの+を使えるので、それならコンパイラから見たら同じprotocol extensionじゃないかな?と思った次第
2:49 PM
実際はちゃんと静的な定義がありました
Avatar
Taketo Sano 4/9/2018 2:49 PM
あっ、確かにそうでした😵
2:51 PM
a - b を a + -b って書き直すと通るようになったりするんで、- が infix なのか prefix なのかをコンパイラが判断できなくなってる感じがします…
Avatar
↓でもダメなんで、やっぱりデフォルト実装の問題だと思います。 protocol FooProtocol { static func +(lhs: Self, rhs: Self) -> Self static func -(lhs: Self, rhs: Self) -> Self } extension FooProtocol { static func -(lhs: Self, rhs: Self) -> Self { return lhs + rhs } } struct Foo : FooProtocol { static func +(lhs: Foo, rhs: Foo) -> Foo { return lhs } } let a = Foo() let b = a + a - a + a - a + a - a + a
Avatar
オッ RealNumberの+の実装外したらいろんなところが転けましたね
2:57 PM
これはprefix関係なさそう
3:01 PM
これで転けるとすると、、ConditionalConformanceで==と&&の組み合わせの改善は…出来てなさそうな気がしてきましたねぇ
Avatar
バグレポートしてみました。 https://bugs.swift.org/browse/SR-7389
👍 4
Avatar
thumbsupの隣にthumbsdownがあってドキドキしながら押すの、UXよくないですよね
3:04 PM
(関係ない)
Avatar
Kishikawa Katsumi 4/9/2018 3:05 PM
一度つけた絵文字って消せない。。。?
Avatar
もう一回押すと消せますけど、それでもドキドキしちゃう
Avatar
Kishikawa Katsumi 4/9/2018 3:06 PM
あ、消せた。
3:06 PM
まあ 👎🏻 これいらないですよね。
Avatar
サムズダウンしたら勝手にサムズアップにしてくれて、もう一度やり直すと本当にサムズダウンになる、みたいな
Avatar
Kishikawa Katsumi 4/9/2018 3:08 PM
Botの出番か。
Avatar
あとなんか、ディスコードのよく使う絵文字、バグってるのかここ最近固まってしまって使い勝手が悪い
Avatar
Kishikawa Katsumi 4/9/2018 3:10 PM
マジメな話、 👎🏻 いらないというのは非常に合理的だと考えていて、というのも基本的に不特定多数の集まるネットではポジティブよりネガティブなリアクションにつきやすい偏りがあるからです。
Avatar
omochimetaru 4/9/2018 4:11 PM
prefix operatorの場合は演算子をオペランドに密着させないといけないから
4:11 PM
そこの探索は生じないのじゃない?
Avatar
それは勘違いでした
4:12 PM
+と-の差がprefixの有無だと初見では思っていたが、実際は静的実装の有無だった
Avatar
@Kishikawa Katsumi さんのコミュニケーション論とか評価論、興味深いです。iOSDC飲みのときにされてたStackOverflowが唯一評価付けに成功してるという話とか。まとめが読んでみたいです🙂
😅 1
Avatar
最初は両方ともprotocol extensionに実装があったのでそれかな?と思った。静的実装は見逃していた
Avatar
みなさんありがとうございます!bug report にコメントもついてますね:
Operations that work on concrete types are always going to be simpler for the compiler to reason about than those involving protocols, but we'd still like to do better here.
Avatar
Unfortunately type-checking performance related to generics is not yet optimal (but we are working on it), because unlike for concrete types, we can't attempt bindings for arguments until all of the operator overloads are applied which leads to exponential behavior. So I would suggest for time being and if it's possible add new operator overloads only with concrete types.
2:47 AM
うーん、解決できないわきゃないと思うんだけどなぁ。
2:47 AM
オペランドの型が定まってるんだから。
Avatar
実プロジェクトで起きている問題だということをアピールすれば優先順位あげてもらえるかも。
Avatar
むしろ PR チャンス?いきなりこんなところに突っ込むと死ぬかな・・・?
😂 1
Avatar
setterで@availableを使える様にしてもらった。 https://bugs.swift.org/browse/SR-7201
👏 6
Avatar
アプリターゲットが別のアプリターゲットをtestable importするのってだめなんですかね
Avatar
Kishikawa Katsumi 4/13/2018 4:11 AM
プロダクションコードでってことですよね?
Avatar
えーっと、リリースするアプリがtestable importするのではないです。
Avatar
omochimetaru 4/13/2018 4:12 AM
そもそもアプリターゲットってリンクできるんか?
4:13 AM
.app 形式にうまくパッケージされない気が
Avatar
「MainAppターゲットに入ってるViewControllerのインスタンスを作って、順番に画面に表示していくTestApp」を作って、TestAppのUITest+fastlaneでスクショを集めるみたいなことをしたくて。
Avatar
omochimetaru 4/13/2018 4:14 AM
そもそも普通にライブラリとして作るのがいいんじゃない?
Avatar
TestAppのtarget dependenciesにMainAppを入れて、@testable import MainApp したらMainApp側の型がコード補完上見れるようになったところまではやった
Avatar
Kishikawa Katsumi 4/13/2018 4:14 AM
何となくわかる。可能ならそれは別にいいと思います。
Avatar
@omochimetaru どゆこと
Avatar
omochimetaru 4/13/2018 4:14 AM
ちゃんとpublicにしたほうがいいとおもう。
Avatar
Kishikawa Katsumi 4/13/2018 4:14 AM
多分ダイナミックリンクではなさそう。
Avatar
omochimetaru 4/13/2018 4:15 AM
@hiragram アプリターゲットじゃなくてFrameworkターゲットにする
Avatar
どっちを?
Avatar
omochimetaru 4/13/2018 4:15 AM
えーっと、ぜんぶで3つになる
4:15 AM
アプリの実質的なコード全部が入ったFrameworkと、 それをアプリとしてリリースするためのガワだけのアプリターゲットと、 それぞれの画面のスクショを撮るためのアプリターゲット。
Avatar
MainApp側が特殊なことをしたくないんだよね
4:16 AM
MainAppはどうテストされるかとかそういうのは一切考えなくて良いようにしたい
Avatar
omochimetaru 4/13/2018 4:16 AM
いずれにしても
4:16 AM
testable importするんじゃなくて
4:16 AM
例えば UserProfileViewControllerが
4:16 AM
public classなら
4:16 AM
普通のimportでいいじゃん?
Avatar
Kishikawa Katsumi 4/13/2018 4:17 AM
あと現状はコンパイル通ってるのかもしれないけどうまくいかないと思いますね。
Avatar
omochimetaru 4/13/2018 4:17 AM
僕もそれが気になってます>動くのかどうか
Avatar
Kishikawa Katsumi 4/13/2018 4:17 AM
スクリーンショットが目的ならTestAppいらないと思います。
Avatar
omochimetaru 4/13/2018 4:18 AM
Appのexecutableはdylibとしてリンクできないだろうしxibとかのリソース周りを含めたバンドルアセットが
4:18 AM
パッケージできないんじゃないか・・・?
Avatar
Kishikawa Katsumi 4/13/2018 4:18 AM
UITestのコードを書きたくないんじゃないかと思うんですけど、たぶんUITestのコードを書いた方が簡単。
Avatar
omochimetaru 4/13/2018 4:18 AM
あ、それか普通に、MainAppの中にスクショ取るための画面を作ったら良いのでは。
4:18 AM
一番最初のAppDelegateで最初の画面出すところとかでBundleIDとか見て分岐しちゃえば。 (edited)
4:19 AM
あーでもそれだといろいろと2重に登録しないといけないかあ。
4:20 AM
出荷版にスクショモードへのルーティングを含めたくないよね。
4:20 AM
まあなんかアプリ側で持ってるデバッグスイッチとかあるだろうしそれでいいか。
Avatar
Kishikawa Katsumi 4/13/2018 4:21 AM
MainAppと99%同じビルド構成のTestAppというターゲットを作るのがベターかな。
4:21 AM
MainAppで分岐するより。
Avatar
omochimetaru 4/13/2018 4:21 AM
最初そうおもったんですけど、それだとVCとかXIBとか何もかも全部ぶち込むってことですよね?
Avatar
それはちょっと
Avatar
omochimetaru 4/13/2018 4:22 AM
元々それが嫌で最初のアイデアになってるのかなと思った。
Avatar
Kishikawa Katsumi 4/13/2018 4:22 AM
たぶんTestAppの方はxcconfigでMainAppの構成を継承しつつ、一部Excludeで簡単にできると思います。
Avatar
omochimetaru 4/13/2018 4:23 AM
いけそうなきもしてきた
Avatar
Kishikawa Katsumi 4/13/2018 4:24 AM
TestAppには EXCLUDED_SOURCE_FILE_NAMES=AppDelegate.swift と書きつつ、 TestAppDelegate.swift というのだけ追加すればいいのではないかしら。 (edited)
Avatar
UITestのコードを書きたくないんじゃないかと思うんですけど、たぶんUITestのコードを書いた方が簡単。
これについては、これをやりたいんです https://qiita.com/tamaki/items/0c2ca2ee3b222321749b
先日iOSDCに個人スポンサーとして参加して来ました、いやー最高でしたね。毎年あってほしい。 非常に興味深い発表ばかりで刺激たっぷり、そこで得た知見なりを活かしたいと考え...
4:26 AM
今のMainAppのViewControllerたちは呼び出し元から渡された値のみで動作するので、スクショ取る用のモックを差し込んだVCのインスタンスを作って、その画面を直接表示する、ということができるVCなんですが、UITest側でそれができなくてこまっているので
4:26 AM
じゃあ1段テスト用のアプリを作ればええやん、testable importでMainApp突っ込めばアクセスできるはずやん、となった
4:27 AM
いまの進捗としては、MyAppのinternalなViewControllerは使えた。MyAppのinternalなprotocolのメソッドなどを使おうとするとリンカエラーになって困っている、という感じです
Avatar
Kishikawa Katsumi 4/13/2018 4:27 AM
まあその目的であれば、動くのであればTestApp側にtestable import書くのは別に問題ないと思います。
Avatar
omochimetaru 4/13/2018 4:27 AM
使えたっていうのは、実際に画面出たの?
Avatar
使えたというのはコンパイル通せたということ
Avatar
Kishikawa Katsumi 4/13/2018 4:28 AM
アプリに関していうとpublicとinternalはほとんど同義なので、publicにしてもいいと思います。
Avatar
omochimetaru 4/13/2018 4:28 AM
なるほど。コンパイルはできると思うんだけど、画面出るところまでいけなさそう。
Avatar
プロトコルのメソッド経由でinstantiateするコードが含まれてるとリンカエラーになってるので、直接initよびだして作ってみようかな
4:28 AM
それは試してないのでやります
Avatar
Kishikawa Katsumi 4/13/2018 4:29 AM
総論でいうと、UITestはそもそもテスト対象をプログラム的に触れないのが当たり前なので、普通にUITest側でUIを操作して画面を作っていくことをお勧めします。 (edited)
Avatar
それは同意です
Avatar
omochimetaru 4/13/2018 4:35 AM
@hiragram Qiitaの記事ざっと読んだんだけど > 「MainAppターゲットに入ってるViewControllerのインスタンスを作って、順番に画面に表示していくTestApp」を作って、TestAppのUITest+fastlaneでスクショを集めるみたいなことをしたくて。 これって一通りの画面を出す画面が、MainAppに入ってたらそれ + UITest でできない? (edited)
Avatar
Kishikawa Katsumi 4/13/2018 4:36 AM
うん、同じイレギュラーだったらとりあえずシンプルな方法にしといたらいいと思いますよ。
Avatar
omochimetaru 4/13/2018 4:36 AM
MainApp + TestApp + UITest(snapshot) じゃなくて MainApp + UITest(snapshot) にする。
4:37 AM
その場合の問題点はMainAppに「画面を並べた画面」の実装が入っちゃうことだけど、 Qiita記事みたいに起動オプションでAppDelegateでルーティングするなら、本番リリースではそのパラメータが来ても無視するように別途設定機能をもっといて封印したら良いと思う。 (edited)
Avatar
Kishikawa Katsumi 4/13/2018 4:38 AM
それかUITestじゃなくてUnitTestで、ビューを画像にレンダリングした方がいいんじゃないかな。。。?
4:41 AM
let viewController = ... let window = UIWindow() window.backgroundColor = .white window.rootViewController = viewController window.makeKeyAndVisible() RunLoop.main.run(until: Date(timeIntervalSinceNow: 0)) viewController.view.layer.render() ^ みたいなことをした方が簡単。
Avatar
omochimetaru 4/13/2018 4:42 AM
あ〜
4:42 AM
HostAppのあるUnitTestって結局プロセス内だからUIWindowつくってmakeKeyAndVisibleできるのか。
😀 1
Avatar
Kishikawa Katsumi 4/13/2018 4:46 AM
^ のやり方で、プレーンなViewControllerとNavController, TabBarControllerにそれぞれEmbedした場合で適切にcontentInsetsが設定されているか、などを確認しているのが https://github.com/kishikawakatsumi/SpreadsheetView/blob/master/Framework/Tests/ViewTests.swift <= このテストケースで、参考になるんじゃないかな。
SpreadsheetView - Full configurable spreadsheet view user interfaces for iOS applications. With this framework, you can easily create complex layouts like schedule, gantt chart or timetable as if y...
Avatar
omochimetaru 4/13/2018 4:48 AM
SpreadsheetView - Full configurable spreadsheet view user interfaces for iOS applications. With this framework, you can easily create complex layouts like schedule, gantt chart or timetable as if y...
4:48 AM
お〜 このテクニックおもしろい
Avatar
Kishikawa Katsumi 4/13/2018 4:49 AM
動かすとよく分かりますよ^^
Avatar
ios-snapshot-test-case - Snapshot view unit tests for iOS
Avatar
これって一通りの画面を出す画面が、MainAppに入ってたらそれ + UITest でできない?
テスト用のモックもそっちに置かなきゃいけないのはなんかいや
Avatar
omochimetaru 4/13/2018 4:52 AM
そう・・・
4:52 AM
アプリにデバッグメニューとか作ってないの?
Avatar
まだないお
Avatar
omochimetaru 4/13/2018 4:53 AM
俺はよくいろんな画面にいける画面とかAPI叩いたり内部データ書き換える画面作ってるから
4:53 AM
どうせそういうのがあるならいいじゃんって思った。
Avatar
Kishikawa Katsumi 4/13/2018 4:53 AM
iOSSnapshotTestCaseを使うと、ビューを画像にする部分がより簡単になります。
Avatar
omochimetaru 4/13/2018 4:54 AM
こんなライブラリあるのか
4:54 AM
iOSSnapshotTestCase (previously named FBSnapshotTestCase)
4:54 AM
もともとFacebookなの・・・?
4:54 AM
uber/ だけど・・・
Avatar
Kishikawa Katsumi 4/13/2018 4:54 AM
もともとFacebookが作っててDiscontinuedになってUberに引き継がれた。
Avatar
omochimetaru 4/13/2018 4:55 AM
へぇ〜〜
Avatar
Kishikawa Katsumi 4/13/2018 4:55 AM
AsyncDisplayKit => Textureも似たような感じ。
4:55 AM
Facebook => Pinterest(だったかな?)
Avatar
ですです。 snapshottestcase好きで使ってたんですがFBがやめてしまって暫くどうしよっかなと思ってたらいつの間にかUberが引き取ってました (edited)
Avatar
omochimetaru 4/13/2018 4:56 AM
ほ〜〜
Avatar
これ使うと差分検出のためにリファレンスの画像が必要になるんですが、それによってPRに変更箇所の画像も含まれるようになるので副次的効果としてレビューしやすくなるのも気に入ってます。一旦FBがアーカイブしたタイミングでXCUITestでスクショ取る方法に移してたんですがUberが引き継いだならやっぱこっちに戻そうかなとか最近考えてます。
Avatar
Swiftコンパイラボットを作成する過程で、Processで起動した子プロセスの出力をキャプチャする際にはDispatchGroupで待つと良いという知見を得た。 https://github.com/norio-nomura/SwiftCompilerDiscordappBot/blob/master/Sources/SwiftCompilerDiscordappBot/execute().swift#L27-L31
SwiftCompilerDiscordappBot - Swift Compiler Discordapp Bot
11:06 AM
パイプが64KB以上バッファしてくれないので、親側でパイプから逐次読み出さないでいると、子プロセスからの出力が64KBを越えた時点でパイプへの書き込み待ちになり、子プロセスが終了しなくなる。
11:07 AM
なので、プロセス終了待ちと標準出力受け取りと標準エラー受け取りを全部並列で実行する必要がある。
Avatar
Conditional Conformance使ってObjcDelegateに一部のGenericsのときだけConformしようとしたらコンパイル出来なかった
👀 1
Avatar
Kishikawa Katsumi 4/17/2018 2:35 AM
Avatar
omochimetaru 4/17/2018 2:36 AM
fuckingってわりに内容は使い方解説?
Avatar
Kishikawa Katsumi 4/17/2018 2:37 AM
これはいわゆるツンデレってやつですね。
🤔 1
Avatar
omochimetaru 4/17/2018 2:37 AM
なあるほど。
2:37 AM
これな〜 式にしたいことが多いんだよなあ。
Avatar
ifcase、補完出てこなくて辛いのでswitchcasedefaultやりがち
Avatar
Kishikawa Katsumi 4/17/2018 2:39 AM
f○cking~.com シリーズはたぶん4つ目くらい。たぶん初代は f○cking block syntax. 初代をリスペクトしつつ、いろんな人がわざわざドメインとって作ってるっぽい。 (edited)
Avatar
f*ckingではないが https://www.wtfautolayout.com もありましたね
Make sense of cryptic Auto Layout error logs.
Avatar
Why The Failure...
Avatar
Kishikawa Katsumi 4/17/2018 2:57 AM
普通に便利なやつ。
Avatar
omochimetaru 4/17/2018 2:58 AM
うおすげえw
2:58 AM
これアドレス見比べてヘロヘロになるんだわこれは便利
Avatar
UITableViewCellやUICollectionViewCellでコンストラクタDIを行いたい場合ってみなさんどうされていますか? 通常はdequeueReusableCell(withReuseIdentifier:for:)でインスタンス化を行うため、そもそもコンストラクタのカスタマイズはできないものなのでしょうか?
Avatar
セルの内側にViewを入れる前提で作って、CellのViewプロパティがnilならViewを生成する、その時にViewに対してConstructorInjectionは出来ますね (edited)
Avatar
セルはコードベースで生成しているので、xibなどは利用してないです。 現在は以下のようにセッターインジェクションでDIしています。 let cell = collectionView.dequeueReusableCell(with: FilterCell.self, for: indexPath) cell.configure(image: image, name: name) 内包する案もよさそうですね、ありがとうございます
Avatar
Cellに直接コンストラクタDIする方法はないのだろうか🤔 (edited)
Avatar
そもそもcellはreuse前提のapiなので基本的には無いのが正しいと思います
😀 1
Avatar
確かに、初期化コストを抑える(初期化回数を減らす)ために再利用してますもんね
Avatar
registerでReuseIdentifierを設定していますが、dequeueを実行せずにカスタムイニシャライザを呼ぶと実行時クラッシュしてしまうようです *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'the cell returned from -collectionView:cellForItemAtIndexPath: does not have a reuseIdentifier - cells must be retrieved by calling -dequeueReusableCellWithReuseIdentifier:forIndexPath:'
Avatar
はい、同様のエラーでした
Avatar
Kishikawa Katsumi 4/19/2018 2:20 AM
UICollectionViewは無理だと思います。
2:21 AM
UITableViewはindexPath引数を取らないdequeue〜については自分で作って返すことができる(レガシー)けどUICollectionViewはその仕組みは無くなりました。
👍 2
Avatar
いえいえ、できないことも知れてよかったと思ってます!ありがとうございます
Avatar
norio_nomura 4/22/2018 7:07 AM
なぜ message2でだけas [String : Any]が必要だと言われるのだろう? @swift-4.1.3 let content = "" let fields = [["name": "stdout.txt", "value": ""]] let message1 = fields.isEmpty ? ["content": content] : ["content": content, "embed": ["fields": fields]] let message2 = ["content": content, "embed": ["fields": fields]]
Avatar
exit status: 1 with stderr:main.swift:4:16: error: heterogeneous collection literal could only be inferred to '[String : Any]'; add explicit type annotation if this is intentional let message2 = ["content": content, "embed": ["fields": fields]] ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ as [String : Any]
Avatar
norio_nomura 4/22/2018 7:08 AM
message1も同じ型になるのに。
Avatar
↑の方でお話があった「UITableViewCellやUICollectionViewCellでコンストラクタDI」の件、 コンストラクタDI とは異なりますが、 Token型を作って保証するという方法を以前 kuniwa/k 氏がお話していたので使えるかもしれません(要望と全然ずれていたらすみません) https://speakerdeck.com/orgachem/ios-detesutorong-yi-nashe-ji-wo-shi-xian-surutamefalsedezainpatan?slide=133
Avatar
norio_nomura 4/24/2018 3:23 AM
dynamicMemberLookup 把握。subscript(dynamicMember:)の実装を必要とするアトリビュートなんだね。 @swift-4.2.4 @dynamicMemberLookup indirect enum UID: CustomStringConvertible { case root(String) case leaf(parent: UID, String) subscript(dynamicMember member: String) -> UID { return .leaf(parent: self, member) } var description: String { switch self { case .root(let string): return string case .leaf(let parant, let string): return "\(parant).\(string)" } } } let root = UID.root("root") print(root.a.b.c)
Avatar
root.a.b.c
Avatar
conditional conformance で Codable の auto-synthesize が効かないのはちと残念ですね…(いずれ対応されるのかしら) extension Matrix: Codable where R: Codable { //Implementation of 'Decodable' cannot be automatically synthesized in an extension
Avatar
cond confというかextensionでauto-synthesizeされない〜ですね
Avatar
あ、なるほど 🤥
Avatar
Codable は touple とあんまり相性よくないんですね 🤥
Avatar
タプルは non-nominal なので、そうですね。タプルを Codable にしたいと思った場合は、大抵は struct を作れば解決する気がします。
😀 2
Avatar
ふむふむ、なるほど。
6:51 AM
しかし cond. conf. がなかったら上のようなケースで codable にしようとするのは絶望的なのでありがたいですね👍
6:52 AM
generic な行列を json 化できました👍
Avatar
JSONSerialization を使ってキャストまみれになる頃のことしか知らなかったので、テンション上がります 🙂
Avatar
Swift 4.1 で ArrayElementCodable なときだけ Codable になりました🙂 extension Array : Codable where Element : Codable { ... }
Avatar
今ちょうどこれができるのを確認して 👍 ってなりました👍 (A, R: Codable で extend してる) let elements = try container.decode([A : R].self, forKey: .elements) (edited)
👍 1
Avatar
CGAffineTransform の逆行列は transform.inverted() なのに、 ARKit 等で使う simd の matrix_float4x4 の逆行列は matrix.inverse になってる・・・😂 (edited)
8:34 AM
CGAffineTransform はかけ算も concatenating だし、基本的に行列として扱わないネーミングなのかな? (edited)
Avatar
1. Library A の中で Vector2Codable にして JSON に変換すると {"x":2,"y":3} のように出力させる実装をする 2. Library A の中で Vector2 を持つ struct Foo : Codable を作る 3. Library A を使う App B を作る 4. App B のあるファイルで Library A を import せずVector2Codable にして JSON に変換すると [2, 3] のように出力させる実装をする 5. App B の別のファイルで Library A を import して Vector2 を JSON に変換すると [2, 3]Foo を JSON に変換するとその中の Vector2{"x":2,"y":3} というのができた。 (edited)
9:21 AM
つまり、 Vector2 に二通りの Codable の実装をして、それぞれ呼び分けることができた。なんとなくできない気がしてたけど、問題なかった。 (edited)
Avatar
スコープで参照するwitness table切り替えれるのすごいな
Avatar
衝突しそうと思ってました。
9:28 AM
↑に限らず、 importCodable の実装を切り替えたりできそうですね。
9:29 AM
Codable に限りませんが)
Avatar
protocol extensionがどのすこーぷにあるか、で、確かに優先順位が変動することがあったから
9:29 AM
この動きは可能だし妥当に思えてきた
9:30 AM
参照外のwitnesstableは見れてないなというのを思い出した
Avatar
omochimetaru 4/24/2018 9:32 AM
LibraryAをimportしないでもVector2が使えるってことはVector2はまた別のパッケージに入っている?
Avatar
in LibA import LibX has Vector2 in AppB import LibX, LibA ということでは
Avatar
Vector2 は別パッケージです。
Avatar
omochimetaru 4/24/2018 9:35 AM
なるほど。
Avatar
おや、さっきまで動いてたのに突然 redundant conformance だってエラーが出たぞ。あやしい・・・。
Avatar
omochimetaru 4/24/2018 9:37 AM
AnyXxxのerasureを使えば
9:37 AM
同じ型の値だが異なるwitness-tableを参照するオブジェクトを
9:37 AM
まぜこぜにできるってことか。
9:38 AM
AnyXxxに閉じ込めるときに解決されたconformanceが残る。
Avatar
ビルドできなくなった😂
9:40 AM
えー、ビルドのゴミ(?)が残ってる状態でのみたまたまうまく動いたのかなぁ・・・。
9:41 AM
また、今 iOS アプリで Carthage 経由でインストールしてるのもややこしい。 SwiftPM で試した方が良さそう。
Avatar
omochimetaru 4/24/2018 9:42 AM
単一パッケージの中で fileprivate で conform して実験しようとしたけど protocol が internal だから internalでconformしなさいというエラーが出てしまった。 実験するにはマルチパッケージな構成にしないといけないけどめんどくさいのでやめた。
9:43 AM
あ、SPMのソースディレクトリでターゲットをわければ簡単か?
Avatar
そう、それが面倒でこれまで検証してなかったけど、今たまたまそういう状況ができて、 import LibraryA をせずに Vector2 を持つ structCodable にしようとしたらエラーになったから、これはと思って試したんだけど
Avatar
今日だけで三回もカネパったし、結構いろいろありそうな気がしてる
Avatar
なぜか今は import LibraryA せずに Vector2 を持つ structCodable にできるようになってしまった。逆に Codable を付けようとすると redundant でエラーになる・・・。 (edited)
9:46 AM
SPMのソースディレクトリでターゲットをわければ簡単か?
これと、別リポジトリになってるときに本当に同じなのかがイマイチ確信が持てないんだけど気にしなくていいのかな?
Avatar
omochimetaru 4/24/2018 9:51 AM
できた
Avatar
omochimetaru 4/24/2018 9:58 AM
[omochi@omochi-iMacPro k (master=)]$ cat Sources/App/main.swift import Nature import Japan import US var animals: [AnimalProtocol] = [] animals.append(createJapanCat()) animals.append(createUSCat()) animals.forEach { animal in print(animal.speak()) } [omochi@omochi-iMacPro k (master=)]$ swift run にゃあ meow
9:58 AM
Contribute to swift-cross-module-conformance development by creating an account on GitHub.
10:01 AM
これと、別リポジトリになってるときに本当に同じなのかがイマイチ確信が持てないんだけど気にしなくていいのかな?
import とか public とか internal とかの振る舞いを見てると同じように見えるから同じだと思ってます。
Avatar
なんとなく罠がありそうな気がするけど、まだ見つかっていない。
12:51 PM
@koher さんの import せずに…ていうのが気になります。
Avatar
時間ができたらシンプルなプロジェクトで再現できるか試してみます。
🙏 1
Avatar
TestTarget の build-config を Release にした場合、本体も Release build されるんでしょうか?それとも Test の部分のソースコードだけ? (edited)
Avatar
全部 release になるっぽいですね
Avatar
Int 演算の overflow を catch したい… 🤥
Avatar
‘&+’?
11:26 AM
&+ ならオーバーフローしても落ちないです
11:27 AM
I was writing a program in C++ to find all solutions of ab = c, where a, b and c together use all the digits 0-9 exactly once. The program looped over values of a and b, and ran a digit-counting ro...
11:28 AM
例外投げる演算子は無いから、↑こういう感じでチェックしてはみ出すならthrowsする演算子を自分で定義するとか。
11:30 AM
こんなのあった。
11:30 AM
func addingReportingOverflow(_ other: Int) -> (partialValue: Int, overflow: Bool)
Avatar
addWithOverflow の名前が変わったんですね 🙄
11:32 AM
adding reporting って🐒
Avatar
まあこれも関数なので、これをラップして例外を投げる演算子にするのが良さそう
11:33 AM
演算子って例外投げれるのか?
Avatar
そうですねぇ 🙄
Avatar
@swiftbot infix operator %+ struct E : Error {} func %+(a: UInt32, b: UInt32) throws -> UInt32 { let c = a.addingReportingOverflow(b) if c.overflow { throw E() } return c.partialValue } try UInt32(0x80_00_00_00) %+ UInt32(0x80_00_00_00)
🛠 1
Avatar
Swift version 4.1 (swift-4.1-RELEASE)
11:35 AM
/usercode/main.swift:11:27: warning: result of operator '%+' is unused try UInt32(0x80_00_00_00) %+ UInt32(0x80_00_00_00) ~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~ Fatal error: Error raised at top level: main.E(): file /home/buildnode/jenkins/workspace/oss-swift-4.1-package-linux-ubuntu-16_04/swift/stdlib/public/core/ErrorType.swift, line 191 Current stack trace: 0 libswiftCore.so 0x00007f8e1fc285c0 _swift_stdlib_reportFatalErrorInFile + 221 1 libswiftCore.so 0x00007f8e1f9973dc <unavailable> + 1369052 2 libswiftCore.so 0x00007f8e1fbd1222 <unavailable> + 3703330 3 libswiftCore.so 0x00007f8e1fbd2689 <unavailable> + 3708553 4 libswiftCore.so 0x00007f8e1f996ad6 <unavailable> + 1366742 5 libswiftCore.so 0x00007f8e1fbd0feb <unavailable> + 3702763 6 libswiftCore.so 0x00007f8e1f996ad6 <unavailable> + 1366742 7 libswiftCore.so 0x00007f8e1fb03f79 <unavailable> + 2862969 8 libswiftCore.so 0x00007f8e1f9d4960 swift_errorInMain + 318 10 swift 0x0000000000fed1ce <unavailable> + 12505550 11 swift 0x0000000000ff1692 <unavailable> + 12523154 12 swift 0x00000000004d9076 <unavailable> + 888950 13 swift 0x00000000004c35d3 <unavailable> + 800211 14 swift 0x00000000004beecc <unavailable> + 782028 15 swift 0x00000000004778c4 <unavailable> + 489668 16 libc.so.6 0x00007f8e22141740 __libc_start_main + 240 17 swift 0x0000000000475179 <unavailable> + 479609 /usr/bin/swift[0x3f24d54] /usr/bin/swift[0x3f25096] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f8e23a17390] ...
11:35 AM
2.55 KB
Avatar
できた。
Avatar
おぉw
Avatar
でも計算性能がだいぶ落ちそうだなぁ・・・
Avatar
ですねぇ…w
11:37 AM
元々そのために入れてないっぽいですしね。
Avatar
@Taketo Sano
Int 演算の overflow を catch したい…
やりたいことにもよりますが、一般的には演算の overflow は Logic failure なので catch すべきでないと思います。
Avatar
omochimetaru 4/26/2018 2:11 AM
実際にものすごい数が出て来る計算をさせてるんかなと思ってそこはスルーしてた
Avatar
Swift において overflow が Logic failure なのは、パフォーマンス上のメリットもありますが、 array[i] などと同じく API 設計上の意図的なものだと思うので。 (edited)
Avatar
はい、大量の計算を高速にやる中で、全部に範囲チェックを入れるのはパフォーマンスに支障がありそうなので避けたい、というケースでした。
Avatar
https://stackoverflow.com/questions/39815054/how-to-include-assets-resources-in-a-swift-package-manager-library/39878338 Swift PM はまだライブラリにリソースを一緒に入れるのには対応してないんですかね。 (edited)
I would to ship my library usign Apple's Swift Package Manager. However my lib includes a .bundle file with seveal strings translated in different languages. Using cocoapods I can include it using ...
10:58 AM
実行時に json を読み込む、というようなことがしたいのですが 🙄
Avatar
対応してないですね
11:07 AM
jsonなら文字列として入れる手もあります。トリプルダブルクォートで。
11:32 AM
ちなみに今はこんな感じにやってますw
11:33 AM
10_129 まである 😵
Avatar
そこまでリテラルでかいとコンパイル遅くなりませんか?
Avatar
そうなんですよw
Avatar
ww
Avatar
なのでテキストデータとしておいておきたいなぁと 🤥
Avatar
文字列リテラルでjson持ちましょう
Avatar
それがよさそうですね、ありがとうございます。
Avatar
swift - Swift for TensorFlow documentation repository.
Avatar
let o1 = tanh(x ⊗ w1 + b1) 内積演算子(テンソル積演算子?)、どうやって入力するんだろう.. (edited)
Avatar
import TensorFlow let x = Tensor<Float>(shape: [1, 2], repeating: 0.1) let y = Tensor<Float>(shape: [3, 4], repeating: 0.1) let matmul = x ⊗ y print(matmul) test.swift:5:16: error: internal error generating TensorFlow graph: Dimensions must be equal, but are 2 and 3 for 'op.test.swift.5.16' (op: 'MatMul') with input shapes: [1,2], [3,4]. let matmul = x ⊗ y (edited)
11:08 PM
これがちゃんとコンパイルエラーになってくれる
👀 1
Avatar
良いですねえ
Avatar
norio_nomura 4/27/2018 1:05 AM
@swift-tensorflow import TensorFlow let x = Tensor<Float>(shape: [1, 2], repeating: 0.1) let y = Tensor<Float>(shape: [3, 4], repeating: 0.1) let matmul = x ⊗ y print(matmul)
Avatar
swiftTensorflow BOT 4/27/2018 1:05 AM
exit status: 1 with stderr:main.swift:4:21: error: internal error generating TensorFlow graph: GraphGen cannot lower a 'receive' from the host yet let y = Tensor<Float>(shape: [3, 4], repeating: 0.1) ^
😀 1
Avatar
omochimetaru 4/27/2018 1:06 AM
もうボットになったの
Avatar
Kishikawa Katsumi 4/27/2018 1:06 AM
Tensorflowボットできとる
1:06 AM
わしもimport
1:06 AM
できるようにしよう。
Avatar
omochimetaru 4/27/2018 1:06 AM
たしかにバージョンの1つなのかw
Avatar
norio_nomura 4/27/2018 1:07 AM
😀 1
Avatar
@Taketo Sano 巨大な array literal や dictionary literal は重いですが、 JSON にしなくてもリテラルを分割すればビルドは軽くなるんじゃないかと思います。
Avatar
Swift for Tensorflow の macOS 用ビルドって裏で Metal 使って GPU 使ってくれたりしないのかな? CPU のみ?
2:56 AM
swift-tensorflow チャネルが必要な気がしてきた。
Avatar
omochimetaru 4/27/2018 3:00 AM
#swift-tensorflow_archived 作りました
👍 5
7:47 AM
弊ライブラリでも ⊗ 使ってて、入力を楽にするために CodeSnippet を作りました👍 (edited)
😀 1
7:47 AM
https://github.com/taketo1024/SwiftyMath/blob/master/CodeSnippets/885A162B-C94C-4085-A858-99634B46259C.codesnippet @kenmaz. 👆これを ~/Library/Developer/Xcode/UserData/ に入れればすぐ出ます。 (edited)
SwiftyMath - Pure Math in Pure Swift.
😀 1
7:48 AM
もっといい方法があったら教えてください 🙏
Avatar
⌥も⌥⇧にも入ってないのか
8:06 AM
の方がまだ入力しやすい
Avatar
で自分で再定義すればいいのでは
Avatar
Kishikawa Katsumi 4/27/2018 8:13 AM
⌘+⌃+Space、「Circled times」で検索、、、かな。
8:14 AM
まあコードスニペットの方が楽そう。
Avatar
function  (lhs ... ) { ... }
Avatar
norio_nomura 5/3/2018 10:59 PM
Keyに略語などで全部大文字な単語とかが含まれると、JSONEncoder.KeyEncodingStrategy.convertToSnakeCaseJSONDecoder.KeyDecodingStrategy.convertFromSnakeCaseが非対称となる問題のスレッドがSwift Forumではじまりました。 https://forums.swift.org/t/handling-edge-cases-in-jsonencoder-jsondecoder-key-conversion-strategies-sr-6629/12384 import Foundation struct S: Codable { var myURLProperty: String } let encoder = JSONEncoder() encoder.keyEncodingStrategy = .convertToSnakeCase let data = try encoder.encode(S(myURLProperty: "property")) let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase let decoded = try decoder.decode(S.self, from: data) // "No value associated with key CodingKeys(stringValue: \"myURLProperty\", intValue: nil) (\"myURLProperty\"), converted to my_url_property." 上記コードはLinuxでは動きません。 (edited)
@hartbit recently revived some discussion about this topic in a PR by @norio_nomura, and I figured that instead of restricting the discussion to the PR, this would be a perfect opportunity to solicit some community feedback. As such: Hi all, I...
👀 4
Avatar
danger-swift使ってる人いますか?brew経由で入れようとすると依存解決に失敗してインストールできないんですけど僕の環境が悪いんだろうか
1:36 AM
Failing to resolve dependencies. What can I do? Is this due to my local environment? $ brew install danger/tap/danger-swift ==> Installing danger-swift from danger/tap ==> Downloading https:/...
Avatar
swiftの標準入力へソースコードを渡して実行させる時、-以降をCommandLine.argumentsとして取り出せるのね。 $ echo 'dump(CommandLine.arguments)' | swift -Onone - -verbose ▿ 2 elements - "-" - "-verbose"
Avatar
便利そう
Avatar
Kishikawa Katsumi 5/10/2018 1:28 PM
@swiftbot $ echo 'dump(CommandLine.arguments)' | swift -Onone - -verbose
Avatar
swiftbot BOT 5/10/2018 1:28 PM
▿ 2 elements - "-" - "-verbose"
Avatar
Kishikawa Katsumi 5/10/2018 1:28 PM
なるほど。
Avatar
norio_nomura 5/10/2018 2:42 PM
LinuxでのUserDefaults.argumentDomainサポートは4.2から。 @swift-4.1.3 @swift-4.2.4 - -param1 yes import Foundation print(CommandLine.arguments) print("param1: \(UserDefaults.standard.bool(forKey: "param1"))")
Avatar
["-", "-param1", "yes"] param1: true
Avatar
["-", "-param1", "yes"] param1: false
Avatar
Kishikawa Katsumi 5/10/2018 2:43 PM
LinuxのUserDefaultsってどこに保存されるんですかね。
Avatar
norio_nomura 5/10/2018 2:54 PM
どこだろう?
Avatar
Kishikawa Katsumi 5/10/2018 2:57 PM
デフォルトはplistなんですかね。BSDじゃないシステムにplutilとか入ってるのかな。
Avatar
Google が swift フォーマッタ開発していることが暗に公開されている。
Alex is the tech lead of Google’s Swift Language Support team, the primary maintainer of google/swift, and responsible for various open-sourced and to-be-open-sourced Swift tools such as swift-format
http://swiftfest.io/schedule/#session-030
The most community driven Swift conference!
👀 1
2:59 AM
これですかね
Avatar
おー、もうフォーク上で開発進めてるのですね。
3:03 AM
https://google.github.io/swift/ これも初めて知りました。
Google's Swift style guide.
Avatar
それ(スタイルガイド)今見てました。 GitHub のやつとかは昔話題になりましたけど、それは知りませんでした。
Avatar
すごいしっかりしたドキュメント、、
Avatar
@swiftbot protocol A{} struct S<X> {} extension S: A where X == Int {} extension S: A where X == String {}
🛠 1
Avatar
swiftbot BOT 5/30/2018 2:32 PM
Author icon
taketo1024
protocol A{} struct S<X> {} extension S: A where X == Int {} extension S: A where X == String {}
Version:
swift-4.1.1-RELEASE
Output:
Error:
/usercode/main.swift:4:14: error: redundant conformance of 'S<X>' to protocol 'A' extension S: A where X == Int {} ^ /usercode/main.swift:5:1: note: 'S<X>' declares conformance to protocol 'A' here extension S: A where X == String {} ^
Avatar
異なる条件で同一の protocol を confirm させるのってできないんですね…😟
Avatar
あ、それできないんですよ
Avatar
実務でもこれやりたいケース多そうな🙄
Avatar
なので、IntとStringをそれぞれ共通のprotocolに対応させて、共通protocolでエイヤとやります
2:35 PM
まさに、Addableみたいなのを作って適合して、Addableでcondconfする、みたいな感じになります
Avatar
omochimetaru 5/30/2018 2:37 PM
protocol IntOrString {} extension Int : IntOrString {} extension String : IntOrString {} extension S: A where X: IntOrString {}
Avatar
condconfのために、勝手に適合できないprotocolを作りたい、みたいな要求はありそう
Avatar
omochimetaru 5/30/2018 2:38 PM
↑べた書きすればこういう感じです。実際にはIntOrStringではなくこのIntとStringが満たしたい共通の性質を表したもっとよい名前のほうがいいですね。
Avatar
なるほど…😕ちと自分のケースだと難しそうです…😓
Avatar
いやなんとかなるはず
Avatar
多分厳しいですw
Avatar
enum AorB { case a(A) case b(B) } protocol AorBProtocol { var _value: AorB { get } } extension A: AorBProtocol { var _value: AorB { return .a(self) } extension B: AorBProtocol { var _value: AorB { return .b(self) } extension Array: Foo where Element: AorBProtocol { func fooFunc() { forEach { switch $0._value { case .a(let a): // write a case here case .b(let b): // write b case here } } } } (edited)
2:42 PM
一般化
2:42 PM
これをNに拡張すればOK
Avatar
それはわかるんですが、
Avatar
Generics持ちかな
Avatar
継承関係が複雑で無理っぽいです
Avatar
フーム
2:44 PM
基本的に否定以外の条件付けは全部なんとかなる認識なんですが、否定が入ってるのかな
Avatar
protocol A1 {} protocol A2: A1 {} protocol A3: A2 {} struct C<R>: A1 extension C: A2, A3 where R == X extension C: A2 where R == Y (edited)
2:47 PM
複素数体を generic な Complex<R> にして、複素数体 C = Complex<Real> と ガウス整数環 Complex<Int> を共通化しようとしまして、 (edited)
Avatar
@swiftbot protocol XorY {} struct X: XorY {} struct Y: XorY {} protocol A1 {} protocol A2: A1 {} protocol A3: A2 {} struct C<R>: A1 { } extension C: A2 where R: XorY { } extension C: A3 where R == Y { }
🛠 1
Avatar
swiftbot BOT 5/30/2018 2:47 PM
Author icon
tarunon
protocol XorY {} struct X: XorY {} struct Y: XorY {} protocol A1 {} protocol A2: A1 {} protocol A3: A2 {} struct C<R>: A1 { } extension C: A2 where R: XorY { } extension C: A3 where R == Y { }
Version:
swift-4.1.1-RELEASE
Output:
Error:
Avatar
うーん、まぁ、ちょっと厳しそうですw
Avatar
@swiftbot protocol XorY {} struct X: XorY {} struct Y: XorY {} protocol A1 { func a1() -> String } protocol A2: A1 { func a2() -> String } protocol A3: A2 { func a3() -> String } struct C<R>: A1 { func a1() -> String { return "a1\(R.self)" } } extension C: A2 where R: XorY { func a2() -> String { return "a2\(R.self)" } } extension C: A3 where R == Y { func a3() -> String { return "a3\(R.self)" } } print(C<X>().a1()) print(C<X>().a2()) // print(C<X>().a3()) // compile error print(C<Y>().a1()) print(C<Y>().a2()) print(C<Y>().a3()) シンプルな例ならイケそうな雰囲気はありますが…もしかしたら別のところでダメなのかも (edited)
🛠 1
Avatar
swiftbot BOT 5/30/2018 2:50 PM
(edited)
Author icon
tarunon
protocol XorY {} struct X: XorY {} struct Y: XorY {} protocol A1 { func a1() -> String } protocol A2: A1 { func a2() -> String } protocol A3: A2 { func a3() -> String } struct C<R>: A1 { func a1() -> String { return "a1\(R.self)" } } extension C: A2 where R: XorY { func a2() -> String { return "a2\(R.self)" } } extension C: A3 where R == Y { func a3() -> String { return "a3\(R.self)" } } print(C<X>().a1()) print(C<X>().a2()) // print(C<X>().a3()) // compile error print(C<Y>().a1()) print(C<Y>().a2()) print(C<Y>().a3())
Version:
swift-4.1.1-RELEASE
Output:
a1X a2X a1Y a2Y a3Y
Error:
Avatar
やりたいの事がダメだとわかった状態のコミットってありますか? @Taketo Sano
Avatar
いまプッシュします
Avatar
オッシャ
Avatar
EuclideanRing というのはあまりつきの割り算ができる環で、
2:59 PM
Ring > EuclideanRing > Field と継承されるのですが、
2:59 PM
Field というのは 0 でない数は逆数を持つ体で、余は常に 0 になるような特別な EuclideanRing となってます。
3:00 PM
複素数 ComplexNumber は Field で、ガウス整数は EuclideanRing なのですが、
3:01 PM
余りつき割り算のやり方が全然違うので共通化できなそう(できても可読性が著しく下がりそう)という感じでした…🙄
3:02 PM
複素数の実部と虚部を整数に制限したのがガウス整数です。
3:02 PM
複素数平面上の格子点。 (edited)
Avatar
omochimetaru 5/30/2018 3:03 PM
なるほど
3:05 PM
実装は共通化しなくてよくて、さっきのIntOrString等から、もともとのIntやStringをenum経由で取り出すメソッドをもたせちゃえばいいので
Avatar
なるほど…
Avatar
本質的に
3:07 PM
Complex: EuclideanRing, Field, NormedSpace であるためのRの条件ってなんですかね
3:08 PM
R: EuclideanRing, Field, NormedSpace ?
Avatar
R == 𝐑 です
3:09 PM
ちと記号がややこしいですがw、太字 𝐑 が実数で、 R は一般のジェネリック型です。
Avatar
omochimetaru 5/30/2018 3:09 PM
public typealias 𝐑 = RealNumber
3:09 PM
太字のRは Real.swift にあった。
Avatar
日本語が悪かった。具体型としてRealNumberではなく、なんの性質があればそれぞれどれが成り立ちますか?
Avatar
それは難しい問題ですね…🙄
Avatar
Complex: EuclidenRingはR: EuclidenRingであればなりたつ?
Avatar
一般論はちょっと分からないです
Avatar
なるほど。。。
Avatar
というのも GaussInt が EuclideanRing であるのも、R == Int であることをかなり強く使うので…
3:11 PM
もしかしたら統一的な一般論があるのかもしれませんが、僕は知らないです😣
Avatar
omochimetaru 5/30/2018 3:11 PM
突き詰めると Int の満たす性質みたいになっちゃって、数学的な議論が一段抽象化しちゃうことになりそう。
Avatar
統一的な一般論があれば、Intをその統一した型に適合して完了だと思ったのです
Avatar
例えば体上の一変数多項式環は EuclideanRing なのですが、これに i をつけたものが EuclideanRing になるかは分からないです🙄
Avatar
omochimetaru 5/30/2018 3:12 PM
git cloneが全然落ちてこない・・・
Avatar
はい、それで難しそうかなと思いました。
3:13 PM
enum AorB { case a(A) case b(B) } protocol AorBProtocol { var _value: AorB { get } } すいません、こちらはちょっと理解が不十分でした、
Avatar
結構大きいですよね、そしてコンパイルも時間かかるw
Avatar
enum も protocol も新たに作るってことだったんですね。
Avatar
omochimetaru 5/30/2018 3:13 PM
ですね、そのconformanceを無理やりやるためにadhocに記述するという感じです
Avatar
とりあえず一般論は無理ということで、RealNumberとIntだけでも満たしてみますか
Avatar
あぁ、最近実験用データを 1GB 近く別ブランチに入れたのでそのせいかもです。
Avatar
1GBw
Avatar
omochimetaru 5/30/2018 3:14 PM
githubって1リポジトリ1Gまでじゃなかったっけ。。
3:15 PM
We recommend repositories be kept under 1GB each. This limit is easy to stay within if large files are kept out of the repository. If your repository exceeds 1GB, you might receive a polite email from GitHub Support requesting that you reduce the size of the repository to bring it back down.
3:15 PM
まずいっすねw
Avatar
omochimetaru 5/30/2018 3:15 PM
ww
Avatar
3:18 PM
ああ、大丈夫か
3:19 PM
いやこれむずいすねw
Avatar
共通化するなら ComplexType みたいな protocol を作って、struct は別々に定義するのがいいんですかね。
Avatar
もうちょいでいけそう
Avatar
omochimetaru 5/30/2018 3:24 PM
こちらclone 14%
Avatar
うち1GBPS回線になったから割とぱっと落ちてきた
Avatar
omochimetaru 5/30/2018 3:26 PM
あくまでComplex<R>がEuclidenRingになるRってことだから
3:27 PM
protocol MakeComplexEuclideanRingHack (edited)
3:27 PM
とかやっとくと余計なこと考えなくて良いかも・・・
Avatar
いやー
3:28 PM
それがFieldとかと循環してる構造になってるのが難しい
Avatar
omochimetaru 5/30/2018 3:28 PM
ほう
Avatar
FieldならEuclidenRingの実装が自明になる
Avatar
omochimetaru 5/30/2018 3:32 PM
あーそゆこと
3:32 PM
R == RealNumber のときには
3:32 PM
Complex : Field のconformanceから
3:33 PM
Complex : EuclideanRingのconformanceは自動実装されるから
3:33 PM
EuclideanRingのconformanceをadhocに作っちゃうと
3:33 PM
Fieldからの経路が潰れるのか。
Avatar
そうなんです
Avatar
なんか気がついたんですが
3:35 PM
これDiagnos出てくるとRとZが崩壊しますね
Avatar
あぁ、そうなんですよねw
3:35 PM
謎の三角みたいなのが出てくるw
Avatar
omochimetaru 5/30/2018 3:35 PM
Avatar
とりあえず素朴に public protocol ComplexType: Ring { associatedtype Base: Ring init(_ x: Base) init(_ x: Base, _ y: Base) static var imaginaryUnit: Self { get } var realPart: Base { get } var imaginaryPart: Base { get } var inverse: Self? { get } var conjugate: Self { get } } ってして、 protocol extension つける方向で行こうかと思います😅
Avatar
omochimetaru 5/30/2018 3:37 PM
Complexをジェネリクスにするのを諦めて ComplexRealNumber : ComplexTypeとGaussInt : ComplexType にするってことですか?
Avatar
はい。
Avatar
omochimetaru 5/30/2018 3:37 PM
なるほど・・・素朴にはそれで逃げれますね
Avatar
さっきの enum もクールではありますが、そこまでトリッキーなことやるほどこういうケースがわんさか出てくる訳でもないので(勉強にはなりました、ありがとうございます 🙇
Avatar
あとちょっとなんじゃが
Avatar
どうすればできるのかは見て見たいですw
Avatar
これ実際に動いてるかチェックする簡単な式はありますか?
Avatar
おぉ
3:39 PM
ComplexNumber 用のテストはあります。
Avatar
めっちゃ苦しい上にForceCastもFatalErrorも出てきて敗北って感じがするw
3:51 PM
しんどすぎ、2項演算のせいでenumのcaseがはみ出すわ、返り値がSelfなので型として復元不能になるわでめちゃくちゃです
Avatar
omochimetaru 5/30/2018 3:52 PM
where付きextensionの中にenum定義できるんだw
Avatar
あとなんか、FieldなのにFieldに定義されたdefault implが参照されなくって結果全部分解した割り算を平たく各羽目に
3:52 PM
typeはprotocol内以外はどこでもかける
Avatar
omochimetaru 5/30/2018 3:53 PM
急にclone終わったから俺もやってみよ
Avatar
この間shield classをswiftでやるみたいなのやってたよね
3:55 PM
あれ応用したら少しはましになるかもしらん
Avatar
omochimetaru 5/30/2018 3:55 PM
shieldじゃなくてsealedね
3:55 PM
それもカッコいいけど
3:58 PM
==同士が衝突するのは定義の優先度が等しいからなのかな
Avatar
==どこや
Avatar
omochimetaru 5/30/2018 3:59 PM
whereの R==RealNumberと R==Zが
3:59 PM
ぶつかるそもそもの話
Avatar
condconfがなぜできないか、か
Avatar
omochimetaru 5/30/2018 4:00 PM
うん
4:00 PM
複数のがあっても、 == と : だったら
4:00 PM
衝突しないで強い方で解決するよね
Avatar
そうだっけか
4:01 PM
@swiftbot extension Array: Equatable where Element==Int {} (edited)
🛠 1
Avatar
swiftbot BOT 5/30/2018 4:01 PM
(edited)
Author icon
tarunon
extension Array: Equatable where Element==Int {}
Version:
swift-4.1.1-RELEASE
Output:
Error:
/usercode/main.swift:1:18: warning: conformance of 'Array<Element>' to protocol 'Equatable' was already stated in the type's module 'Swift' extension Array: Equatable where Element==Int {} ^ Swift.Array<Element>:1:11: note: 'Array<Element>' declares conformance to protocol 'Equatable' here extension Array : Equatable where Element : Equatable { ^
4:01 PM
Avatar
だめじゃないすかねこれ
4:02 PM
あたいぽ
Avatar
omochimetaru 5/30/2018 4:02 PM
wheseになってるよ
Avatar
ダメみたいだ
4:03 PM
えっとあとは
4:04 PM
@swiftbot extension Array: Equatable where Element==Never { static func == (lhs: Array, rhs: Array) -> Bool { return true } } (edited)
4:04 PM
あっ、リプじゃないと編集は反応しないか
4:05 PM
@swiftbot extension Array: Equatable where Element==Never { static func == (lhs: Array, rhs: Array) -> Bool { return true } }
🛠 1
Avatar
swiftbot BOT 5/30/2018 4:05 PM
Author icon
tarunon
extension Array: Equatable where Element==Never { static func == (lhs: Array, rhs: Array) -> Bool { return true } }
Version:
swift-4.1.1-RELEASE
Output:
Error:
/usercode/main.swift:1:18: warning: conformance of 'Array<Element>' to protocol 'Equatable' was already stated in the type's module 'Swift' extension Array: Equatable where Element==Never { static func == (lhs: Array, rhs: Array) -> Bool { return true } } ^ /usercode/main.swift:1:63: note: operator function '==' will not be used to satisfy the conformance to 'Equatable' extension Array: Equatable where Element==Never { static func == (lhs: Array, rhs: Array) -> Bool { return true } } ^ Swift.Array<Element>:1:11: note: 'Array<Element>' declares conformance to protocol 'Equatable' here extension Array : Equatable where Element : Equatable { ^
Avatar
だめじゃないすかねこれ
Avatar
色々ありがとうございます!
4:37 PM
ひとまず寝ます 😴
5:40 PM
本質的にたるのんと同じ状態
5:40 PM
CondConfの現実装の限界がわかってきた
5:46 PM
あれ、勘違いしてた、 Complex<GaussInt> じゃないわ
Avatar
これ割り算無限ループしなかった?
Avatar
実行してない
Avatar
norio_nomura 6/6/2018 2:34 AM
@swift-4.2.4 -swift-version 4 #if swift(>=4.2) print("swift-4.2") #elseif swift(>=4.1.50) print("swift-4.1.50") #elseif swift(>=4.1.2) print("swift-4.1.2") #endif
Avatar
swift42 BOT 6/6/2018 2:34 AM
swift-4.1.50
Avatar
omochimetaru 6/6/2018 2:36 AM
あれ?
2:36 AM
@swift-4.2.4 --version (edited)
Avatar
swift42 BOT 6/6/2018 2:36 AM
Swift version 4.2-dev (LLVM a38ff55b31, Clang 5272858825, Swift defc3e9073) Target: x86_64-unknown-linux-gnu (edited)
Avatar
norio_nomura 6/6/2018 2:38 AM
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
omochimetaru 6/6/2018 2:39 AM
introducing a new compiler directive that is syntactically equivalent to the swift directive but checks against the version of the compiler,
2:40 AM
難しいですね
Avatar
Kishikawa Katsumi 6/6/2018 9:58 AM
自分の中で2周くらい回って @lovee さんのNotAutoLayoutはだいぶセンスがあるなという気になってきました。 これがAutoLayoutが出る前に作られていたら世界を席巻したんじゃないかなあ。
9:59 AM
持って回った言い方をしてるけど皮肉でもなんでもなくて、よく考えて作ってあるなあという気持ちです。
Avatar
omochimetaru 6/6/2018 10:03 AM
ほほ〜
Avatar
@Kishikawa Katsumi ありがとうございます 🙇 ここまでくるとなんか逆に名前がふざけてるようにしか見えなくて改名すべきか悩むんですよね 🤔
Avatar
Kishikawa Katsumi 6/6/2018 1:13 PM
まあそうですねえ。こういう分かりやすさは当然反発も生むので。
1:14 PM
一般論として。
Avatar
ちなみに次の予定は @omochimetaru さんの gysb でテンプレでコード生成したい気分です
😃 1
Avatar
Kishikawa Katsumi 6/6/2018 1:14 PM
あとまあどうしてもキワモノっぽく見えるというのはありますね。
Avatar
いちいち全部直でレイアウトプロパティー作ると大変だしバグりやすいし
1:14 PM
ですね
1:15 PM
正直当時なんも考えてなかったからな 😇 最初は「ManualLayout」にしたかったけどGitHubで検索してみたら既に同じ名前のがあったので考えるのだるかったからNotAutoにした訳でそろそろ4.0の時に名前考え直さないと…
Avatar
Kishikawa Katsumi 6/6/2018 1:16 PM
NotAutoLayoutはある程度の違反はコンパイルエラーになるというのが良いです。 (edited)
Avatar
やっぱり静的型付けは間違ったらコンパイルエラーが出るのがとても助かると思いますので
1:18 PM
石川先生の言葉ですね、「いい設計とは、間違った用法をコンパイルエラーにする」
Avatar
Kishikawa Katsumi 6/6/2018 1:19 PM
読む負荷はあまり変わらないかな?個人的には。 どっちも大変。
Avatar
コンパイルエラーにできるものはその分テスト書かなくて済むというメリットもあるかと()
Avatar
Kishikawa Katsumi 6/6/2018 1:23 PM
どうかなあ。ビューのOutputは失敗ケースの範囲がさまざまだし、Inputも安定しないから、コンパイルエラーになるケースを弾いても
1:23 PM
。。。
1:24 PM
それほど安心できない。
Avatar
ああ、今のは単純に一般論的な話で、例えばSwiftだとOptionalの仕組みがあるのでObj-Cの時みたいに至る所で nil パターンのテスト書かなくて済むメリットがあるのかなという意味です
Avatar
Kishikawa Katsumi 6/6/2018 1:26 PM
ああ、それはその通りですね。
Avatar
NotAutoLayout 、名前がわかりやすくていいと思いますけどね〜 (edited)
1:23 AM
結構浸透してるのでリネームはもったいないかも?
Avatar
ふざけてるように見えるのが難点ですよね、あと英語的に「Why Not Auto Layout」と「Why NotAutoLayout」が真逆の意味なのに全く同じに聞こえるのも地味に痛い気が
Avatar
w > 「Why Not Auto Layout」と「Why NotAutoLayout」
Avatar
Kishikawa Katsumi 6/7/2018 4:44 AM
仕組みは利用者にとっては重要じゃないので、その観点でいうともっと良い名前はあると思いますね。
Avatar
Why Not Auto Layout? で、「そうなんだけど Auto Layout こういうのクソじゃん〜」からの Why NotAutoLayout で NotAutoLayout の良さを説明する、的な
Avatar
DirectLayoutとかどうでしょう 🤔
Avatar
NonAutoLayout とか?
Avatar
NonもNotもイメージ的にあんまり変わらないですね 😇
Avatar
¬AutoLayout
👍 1
Avatar
『「Why Not Auto Layout」と「Why NotAutoLayout」』問題は解決できるかと🙃 < NonAutoLayout
6:53 AM
AntiAutoLayout とかw
Avatar
omochimetaru 6/7/2018 6:53 AM
AbsoluteKiller
Avatar
物騒なライブラリーだなw > AbsoluteKiller
Avatar
omochimetaru 6/7/2018 10:18 AM
絶対殺すマンで定着しているので・・・
🍀 2
Avatar
¬AutoLayout は多分そもそもGitHubでリポジトリ作れないしCartfileとかで指定できなさそうな気が 🤔
Avatar
別にAuto Layoutの逆になってるわけでもなくて、実は素直なレイアウトエンジンなんですよねー。
Avatar
Pureとか思いついたけどもうあったマン
Avatar
Kishikawa Katsumi 6/7/2018 10:45 AM
そう、動機はそうかもしれないけど、それはもはや関係ないし、利用者にとってはもっと関係ない、と思います。
Avatar
DescribableLayout
10:56 AM
DeclarativeLayoutとかSwiftyLayoutとかは当たり前のごとくすでにある・・・
Avatar
単純にLayoutっていう名前では🤔
Avatar
Layout って名前 つよい
Avatar
@swiftbot let f = Float.nan let a = [f] let b = [f] print(f == f) // false print(a == a) // true print(a == b) // false
🛠 1
Avatar
swiftbot BOT 6/12/2018 7:32 AM
Author icon
t.ae
let f = Float.nan let a = [f] let b = [f] print(f == f) // false print(a == a) // true print(a == b) // false
Version:
swift-4.1.1-RELEASE
Output:
false true false
Error:
Avatar
これでいいんでしたっけ?
Avatar
omochimetaru 6/12/2018 7:33 AM
@swiftbot print(Float.nan == Float.nan) (edited)
Avatar
あー、バッファが同じ場合は比較を省略してるのか。
Avatar
@swiftbot let f = Float.nan let a = Optional(f) let b = Optional(f) print(f == f) // false print(a == a) // false print(a == b) // false
🛠 1
Avatar
swiftbot BOT 6/12/2018 7:35 AM
Author icon
t.ae
let f = Float.nan let a = Optional(f) let b = Optional(f) print(f == f) // false print(a == a) // false print(a == b) // false
Version:
swift-4.1.1-RELEASE
Output:
false false false
Error:
Avatar
Arrayだけおかしい気がする
Avatar
DictionarySet もおかしくなるんじゃない?
Avatar
omochimetaru 6/12/2018 7:36 AM
ああ、 a== a のところがおかしいって言いたいのか。
Avatar
です。
Avatar
Optional は中身が一つしかないからそれの == を使うだろうけど、 DictionarySet だと Array と同じショートカットが行われてそう。
Avatar
omochimetaru 6/12/2018 7:37 AM
うーん・・・
Avatar
Setもおかしいですね。
Avatar
omochimetaru 6/12/2018 7:37 AM
そもそもFloatがEquatableの規約に違反してそう。
7:37 AM
規約なんて無いけど
Avatar
これは Array のバグなのか、 Float の(というか IEEE の)問題なのか。
Avatar
omochimetaru 6/12/2018 7:37 AM
Arrayが要素に期待する前提条件が
7:37 AM
常に a == a であるとして設計されてそうだし
7:37 AM
そうあっていいと思う
Avatar
こういうの考えても浮動小数点数の nan の仕様っておかしいよね。
Avatar
omochimetaru 6/12/2018 7:38 AM
同値性
7:38 AM
反射律。 (edited)
7:39 AM
Equatableがここでいう「同値関係」を規定するのかによると思うけど
7:39 AM
そうでないとしんどいよね。
Avatar
Equatable なのに equality じゃなくて equivalence なのか・・・。英語むずい・・・。
Avatar
バッファが同一ならequalというショートカットは要素の反射率を前提にしてますね。 ショートカット必要なんだろうか
Avatar
omochimetaru 6/12/2018 7:41 AM
あったほうがいいでしょ。
7:42 AM
プロパティが1万個ある構造体とかならでかいよ。
Avatar
かといって、 Float== を変えるのも難しいよね・・・。
7:43 AM
1. この結果を受け入れる 2. Array 等のショートカットをやめる 3. Float 等の == を変える だけど。結局 1 にしかならなさそう。
Avatar
バッファが同一のときしかショートカットできないのでどのくらい働くのか微妙な気がしますが。
Avatar
omochimetaru 6/12/2018 7:44 AM
@swiftbot var d: [Float: String] = [:] d[.nan] = "a" d[.nan] = "b" d[.nan] = "c" print(d.count) print(d[.nan]) print(d == d)
🛠 1
Avatar
swiftbot BOT 6/12/2018 7:44 AM
Author icon
omochimetaru
var d: [Float: String] = [:] d[.nan] = "a" d[.nan] = "b" d[.nan] = "c" print(d.count) print(d[.nan]) print(d == d)
Version:
swift-4.1.1-RELEASE
Output:
3 nil true
Error:
/usercode/main.swift:6:7: warning: expression implicitly coerced from 'String?' to Any print(d[.nan]) ^~~~~~~ /usercode/main.swift:6:8: note: provide a default value to avoid this warning print(d[.nan]) ~^~~~~~ ?? <#default value#> /usercode/main.swift:6:8: note: force-unwrap the value to avoid this warning print(d[.nan]) ~^~~~~~ ! /usercode/main.swift:6:8: note: explicitly cast to Any with 'as Any' to silence this warning print(d[.nan]) ~^~~~~~ as Any
Avatar
いや、 3 もありな気がしてきた。
Avatar
時間かかるのが全要素equalのときなので自分自身との比較が一番時間かかることになってしまいますが (edited)
Avatar
omochimetaru 6/12/2018 7:44 AM
バッファが同一のときしかショートカットできないのでどのくらい働くのか微妙な気がしますが。
コピーして回してる間にそうなることはあると思う
Avatar
いまって Int+ とかも純粋にハード的に計算してるわけじゃなくてオーバーフローチェックとか入れてるんだから
☝ 1
Avatar
omochimetaru 6/12/2018 7:45 AM
例えば user.items = user2.items if user.items == user2.items { } とか。 (edited)
Avatar
&== を IEEE 754 に従った素の計算にして、 == だと反射率を満たすようにすればいい気が。
Avatar
&== 入れるなら == がIEEEに従う じゃないですか?
Avatar
==Equatable で規定されるものだから、 Equatable== が反射率を満たす必要があることを明記して
7:47 AM
&==&+ 等と同様の余分なオーバーヘッドのない計算をしてくれる演算子でいいのでは?
Avatar
バッファチェック=オーバーヘッドか。それはそうですね。
Avatar
omochimetaru 6/12/2018 7:49 AM
==でnanを比較したら死ぬとかは?
7:49 AM
死ぬ分には定義を満たすことになる。
Avatar
普通に true でいいんじゃないかなぁ
Avatar
omochimetaru 6/12/2018 7:49 AM
まあ == .nan とかかけたら便利か。
Avatar
他言語から来た人が死にそうだw (edited)
Avatar
omochimetaru 6/12/2018 7:50 AM
他言語から来た人は == .nan 書かずに isNaN() を使うから大丈夫では
7:50 AM
わかったうえで a != a を手書きするタイプの人だけ死にますね (edited)
Avatar
== .nan を見て、このコードバグってんぞ→バグってなかった!ってなりそう
Avatar
omochimetaru 6/12/2018 7:51 AM
問題は
7:51 AM
NaNにほぼならないとわかっているケースで
7:51 AM
NaNチェック付きの実装になってしまうことで
7:51 AM
パフォーマンスが落ちそうなことですね
Avatar
いや、それを言い出したら
7:51 AM
Int+ だってそうでしょ?
7:52 AM
FloatDouble== より Int+ を使う機会の方がずっと多いのでは?
7:52 AM
CG とかだとそうとも限らない?でも +* は使っても == はそんなに使わなさそう。
7:52 AM
だし、そもそも GPU 上で計算されてるか。
Avatar
omochimetaru 6/12/2018 7:53 AM
オーバーフローするかどうかは足し算と同時にCPU命令一発で実行されるけど
Avatar
FloatDouble で、 CPU 上で計算してる時点でパフォーマンスにこだわるケースじゃなさそう。
Avatar
omochimetaru 6/12/2018 7:53 AM
isNaNの自動チェックはコードで外側でやることになるから
7:53 AM
その分の差がありそうだなと思って。
Avatar
Kishikawa Katsumi 6/12/2018 7:53 AM
Equatableは反射律を満たしていたらOKなんですか?推移律は不要?
Avatar
オーバーフローするかどうかは足し算と同時にCPU命令一発で実行される
そうなのか・・・。
Avatar
omochimetaru 6/12/2018 7:53 AM
はい、変なレジスタで結果が返ってくる。
Avatar
@Kishikawa Katsumi 全部満たしてないといけないと思います。
Avatar
omochimetaru 6/12/2018 7:54 AM
ただ、いずれにせよ「計算後」に その、オーバーフローフラグを見る制御ロジックはSwiftレベルで実装されてるから
Avatar
Kishikawa Katsumi 6/12/2018 7:54 AM
だとするとNan == Nanをtrueにすると推移律を満たさなくなるんじゃないかな。
Avatar
omochimetaru 6/12/2018 7:54 AM
それを前にやっているだけで結局かわらない気もする
Avatar
例がnanだったので反射率を上げただけですね
Avatar
Kishikawa Katsumi 6/12/2018 7:55 AM
結果Nanになるけど同じではないものはけっこうあるんじゃないか。
Avatar
(nan == nan) and (nan == nan) iff (nan == nan)では?
Avatar
omochimetaru 6/12/2018 7:55 AM
それはnanを構成する式の段階との話ですかね
Avatar
Equatable はあくまで計算結果の値についてなので、成り立つように思います。
Avatar
ああ計算過程の話ですかね?
Avatar
Kishikawa Katsumi 6/12/2018 7:57 AM
NaNに関しては、NaNになるXとYがあるとき、X == Yではないことはけっこうあるんじゃないか、ということです。
Avatar
omochimetaru 6/12/2018 7:58 AM
NaNになるX の X が、 Float型の値じゃなくて、なんらかの計算式を想定しているなら、間違っています。
7:58 AM
(10 / 2 ) == (20 / 4) なのに 10 と 20 は違う値だ 、みたいな。
Avatar
「 10 と 20 は違う値だ」より、「 10 / 2 と 20 / 4 」は異なる式だ、かな。
8:01 AM
Equatable はあくまで値についての性質なので、どのような式で nan が導かれても推移律は満たされることになるかと。
Avatar
Kishikawa Katsumi 6/12/2018 8:02 AM
それでいい気もしますね。
Avatar
@t.ae evolution に投げてみては?
Avatar
問題提起レベルでも投げていいんですっけ
Avatar
↑の三つの選択肢があると思うけどどう思う?くらいで Pitch として投げるならいいんじゃないかな?
8:11 AM
こんな問題見つけたよ、だとバグレポートな気がするけど。
8:12 AM
「どう思う?」というか、「修正が必要じゃない?」くらいのスタンスかな? (edited)
Avatar
じゃあちょっと書いてみます
👍 1
Avatar
調べてみたら似たようなのありますね。 https://forums.swift.org/t/rationalizing-floatingpoint-conformance-to-equatable/6861 a == aのケースについて話されてるかはこれから読みます。
Ben Cohen asked to continue this conversation on swift-dev-- Included in PR #12503 is a small tweak to accommodate so-called "exceptional values" (such as NaN) in comparisons of array equality. Currently, Array.== first looks to referential equality of underlying buffer...
8:27 AM
Currently, Array.== first looks to referential equality of underlying
buffers, then (if false) compares elementwise equivalence as defined by Element.==. As a consequence, an array of NaN compares equal to another array of NaN if they share the same buffer, but otherwise false. This is an undesirable outcome. 頭から書いてあった🙃
👌 1
Avatar
The last time that this topic was brought up, competing demands voiced by different people were not possible to reconcile: 1) Equatable `==` must be a full equivalence relation. 2) Floating-point types must conform to `Equatable` and not to some alternative such as `PartiallyEquatable`. 3) Floating-point `==` must be IEEE-compliant (at least in the concrete context), and therefore *not* a full equivalence relation. 4) IEEE-compliant floating-point equivalence must be spelled `==` and not some alternative such as `&==`. 5) Behavior of `==` must not change between generic and concrete contexts.
Avatar
Swift runtimeでConditional Conformanceをサポートしてない問題なのですが、今後の対応予定とかってどこで見れるのでしょうか?🙇 protocol A { static func hoge() } struct B: A { static func hoge() { print("B") } } extension Optional: A where Wrapped: A { static func hoge() { print("Optional") } } struct F<T> { static func fuga() { switch T.self { case is A.Type: (T.self as! A.Type).hoge() default: fatalError() } } } F<B>.fuga() // B // warning: Swift runtime does not yet support dynamically querying conditional conformance F<B?>.fuga() // fatalError (edited)
Avatar
SE-0143はSwift 4.2をもってImplementedとなっていて、ランタイムチェックも4.2で実装されてます https://github.com/apple/swift-evolution/blob/master/proposals/0143-conditional-conformances.md
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
2:09 PM
実装されたのは https://github.com/apple/swift/pull/14368 これで2月ですね
When evaluating whether a given type conforms to a protocol, evaluate the conditional requirements and pass the results to the witness table accessor function. This provides the ability to query co...
2:10 PM
https://github.com/apple/swift/commit/87f7b4e5fb58cc32fd33144e5e4207d53d2e5745 このマージコミットを見ればどのタグから入っているか分かりますね
2:11 PM
^ @Nonchalant
Avatar
@ikesyo ありがとうございます!すでに実装されてたんですね...探し方も教えていただいてありがとうございます!
2:11 PM
swift-4.2-DEVELOPMENT-SNAPSHOT-2018-04-23-a
2:12 PM
ここから入っているのか
2:12 PM
Xcode 10で試してみます!
Avatar
それは4.2のsnapshotが作られ始めたタイミングだと思うので、DEVELOPMENT-SNAPSHOTにはもっと前からあるはず
2:13 PM
Xcode 10 beta 1では間違いなく入ってるはずです
Avatar
ありがとうございます!🙇
Avatar
こんにちは! 自己宣伝で申し訳ないんですが、テスト用のダミーデータを作ってみるライブラリとそれに関する記事を書いてみました。Swift初心者なので、ぜんぜんアレかもしれませんが、感想を頂けたらすごくうれしいです。 https://qiita.com/yyu/items/e8f1b4a17dac4f9108a5
👀 4
Avatar
@yyu おもしろかったです😀こういうことを学ぼうとすると読みなれないHaskellとかでやることになるので、自分が親しんでいる言語で読めてとてもわかりやすかったです。 (edited)
Avatar
おお。ありがたいですー。
Avatar
Swift だと HListHConsHNil に限定できないのが辛いですね。 enum でも書けなさそうだし・・・。
7:40 AM
普通の List なら↓みたいに書けるんですけどね〜。 enum List<Element> { case `nil` indirect case cons(Element, List<Element>) } let a: List<Int> = .cons(2, .cons(3, .cons(5, .nil))) (edited)
Avatar
そうですね。enumが型パラメータを取れないと無理なんですよね……。
Avatar
ぬうう、canImportimportの様にシンボルを使う事は出来ないのか…。 @swift-main import Foundation let killSignals: [Int32] = { var signals = [SIGILL, SIGTRAP, SIGABRT, SIGFPE, SIGBUS, SIGSEGV, SIGQUIT] #if canImport(Glibc.SIGSYS) signals.append(Glibc.SIGSYS) #endif return signals }() (edited)
Avatar
swiftNightly BOT 6/19/2018 12:14 PM
exit status: 1 with stderr:<stdin>:4:5: error: unexpected platform condition argument: expected identifier #if canImport(Glibc.SIGSYS) ^ (edited)
Avatar
omochimetaru 6/29/2018 7:54 AM
diffライブラリを自作して、 値型の配列がdidSetで更新されると、差分がUIViewに適応されるパターンを組んでみました。 Reactの最小の手動実装のような感じです。 https://github.com/omochi/SdiftExample
Contribute to SdiftExample development by creating an account on GitHub.
👍 4
Avatar
public struct Uniform { var base: RandomNumberGenerator init(base: RandomNumberGenerator) { self.base = base } /// Returns a value from uniform [low, high) distribution. public mutating func next(low: Float, high: Float) -> Float { let uint32: UInt32 = base.next() return (high - low) * (Float(bitPattern: uint32 >> 9 | 0x3f80_0000) - 1) + low } } extension RandomNumberGenerator { public var uniform: Uniform { return Uniform(base: self) } } こういうの作ろうと思ったんですがRNGがstructだと内部状態コピーされるから微妙ですね…… (edited)
Avatar
next(range: Range<Float>)RandomNumberGenerator に生やすとか?
Avatar
normalもセットで作りたかったのでuniformに切り出したんです
Avatar
それも extension で追加してもいい気も (edited)
Avatar
next(range: Range<Float>)next(mu: Float, sigma: Float)だと分かりづらくないですかね?
Avatar
そうかな?そっちの方が使いやすそうな気も
2:00 AM
RNGがstructだと内部状態コピーされる
これの問題はどこでしょう?コピーコスト?状態が複製される点?
Avatar
分布について引数からしかわからないのが微妙かと思うんですが。 他言語だとrandとrandnに分けたりしてますがRNGのインターフェースに合わない……
2:02 AM
2つunifrom rngを作ったら内部状態がコピーされるので同じ乱数列が出てくるところですね (edited)
Avatar
まず、デフォルトの Randomstruct だけどそれは起こらないのと、
Avatar
Randomはそうですね。
Avatar
それが起こる RNG を実装した struct の場合
2:03 AM
var a = FooRandom() var b = a a.next() == b.next() // true になるんだから、 Uniform もそれでいいんじゃないかな?
2:04 AM
あー
Avatar
もともと気をつけてつかってねってのがstruct RNGなのを前提としても uniformでコピーされるところがわかりにくいんじゃないかと
Avatar
var a = FooRandom() print(a.uniform.next(...) print(a.uniform.next(...) これで同じのが出るのが嫌か。
Avatar
omochimetaru 7/2/2018 2:06 AM
実際には同じものが出ないような?
Avatar
メルセンヌ・ツイスタとかだと出るはずです
Avatar
uniformget set なプロパティにして
2:07 AM
Booltoggle とかと同じように元の struct に変更を反映できない?
Avatar
その発想はなかった。ちょっとやってみます
Avatar
setbaseself に代入すればいいのか。 (edited)
Avatar
omochimetaru 7/2/2018 2:10 AM
そだね>MT (edited)
Avatar
うーんうまくいかない?
2:15 AM
setで代入してるところには行ってるみたいなんですが
2:17 AM
あ、うまくいってました。0, 1, 2...を生成するダミーを使ったからFloatにして[0, 1)区間だとprintしても全部0に見えてただけでした (edited)
🙂 1
Avatar
あーやっぱりだめでした。 書き戻しで何か変なことになってそう
2:31 AM
@swift-4.2.4 swift public struct Uniform { var base: RandomNumberGenerator init(base: RandomNumberGenerator) { self.base = base } /// Returns a value from uniform [low, high) distribution. public mutating func next(low: Float, high: Float) -> Float { print("base before; \(base)") let uint32: UInt32 = base.next() print("base after; \(base)") return (high - low) * (Float(bitPattern: uint32 >> 9 | 0x3f80_0000) - 1) + low } } extension RandomNumberGenerator { public var uniform: Uniform { get { return Uniform(base: self) } set { print("before set: \(self)") self = uniform.base as! Self print("set self: \(self) \(uniform.base)") } } } struct DummyRNG: RandomNumberGenerator { static var `default` = DummyRNG.init() var state: UInt32 = 0 mutating func next<T>() -> T where T : FixedWidthInteger, T : UnsignedInteger { state += 123456789 return T(state) } } print(DummyRNG.default.uniform.next(low: 0, high: 1)) print(DummyRNG.default.uniform.next(low: 0, high: 1)) print(DummyRNG.default.uniform.next(low: 0, high: 1))
Avatar
swift42 BOT 7/2/2018 2:31 AM
base before; DummyRNG(state: 0) base after; DummyRNG(state: 123456789) before set: DummyRNG(state: 0) set self: DummyRNG(state: 0) DummyRNG(state: 0) 0.02874446 base before; DummyRNG(state: 0) base after; DummyRNG(state: 123456789) before set: DummyRNG(state: 0) set self: DummyRNG(state: 0) DummyRNG(state: 0) 0.02874446 base before; DummyRNG(state: 0) base after; DummyRNG(state: 123456789) before set: DummyRNG(state: 0) set self: DummyRNG(state: 0) DummyRNG(state: 0) 0.02874446
Avatar
setに入ってくるuniformが変化前のになってる?
2:33 AM
あ。馬鹿だ。uniformじゃなくてnewValue使わないと
2:33 AM
大丈夫でした。
Avatar
完成品がこちらになります。 https://github.com/t-ae/rng-extension
rng-extension - Swift extension for RandomNumberGenerator
Avatar
プロトコル型で持たずに Uniform<Random : RandomNumberGenerator> にした方が Swifty じゃないですか?
Avatar
いままさにそれ考えてたんですけどextensionでself渡すところできるんですっけ?
6:53 AM
RandomNumberGeneratorに生やすとそれ自体が適合してなくて云々みたいになるとおもうんですが
6:55 AM
あれ?普通にできそうだな
Avatar
ジェネリックにしてみました。特定のRNGでextensionを生やせるようになって良い感じに
👍 1
Avatar
@t.ae basefileprivate にする PR 送ろうかと思ったら、逆に 1.0.0 から 1.0.1internalpublic な変更がされてるんですが、この意図は何でしょう?
8:28 AM
あと、この変更は後方互換のある API の変更なので、 sem ver 的には 1.0.01.1.0 の変更だと思います。
Avatar
https://github.com/t-ae/xorswift/blob/swift4.2/Sources/Uniform.swift 外部に高速実装を生やすためにbaseを参照できるようにしました。 基本見えても問題ないはずなので…… (edited)
xorswift - Xorshift pseudorandom number generator library for Swift.
8:29 AM
masterじゃなくて4.2ブランチだった
Avatar
そして、作った直後はこういう微妙な変更が発生しがちなので、しばらくは -alpha-beta, -beta.2 等を付けておくのがオススメです。
8:30 AM
(あと、 1.0.0 から始めずに 0.1.0 から始めた方が気軽に破壊的変更しやすいです。)
Avatar
アルファつけるの忘れてましたねぇ。x.x.15とかいってるのもあるので覚えておくようにします。
Avatar
patch は API の変更はないバグ修正なので、 API の修正は互換性があってもマイナーを、互換性がないとメジャーを上げないといけないので辛いです・・・。
8:32 AM
↓これも base を外部から使ってなくないですか? https://github.com/t-ae/xorswift/blob/swift4.2/Sources/Uniform.swift
xorswift - Xorshift pseudorandom number generator library for Swift.
Avatar
0.0.xでいつもはやってたんですけどね、いつまでも1にならないので……
8:33 AM
base.xとかが出てきます
Avatar
あるあるですねw < いつまでも 1 にならない
8:33 AM
しかし、 1.0.0 というのはそれだけの重みがあることの裏返しな気も
8:34 AM
Swift の 1.0 はおかしかったけど、 Kotlin とかずいぶん長い間 1.0 にならなかったし。
8:35 AM
あー、 .base で検索してた😅
Avatar
ある程度安定してから1.0.0にするのが良かったですね。今回は思いつきで他のライブラリと統合したのでタイミングが悪かった感じです
Avatar
あらためてRandomのプロポーザル見てるとFloat.random(in:)がありましたね。 normalもこっちの形式に揃えるほうがいいんだろうか……
Avatar
Qiita で通知が来て 2014 年のコメントが発掘されたけど、何もかも古くておもしろかった。 https://qiita.com/Kenya/items/dced88c4508302786f24#comment-a88dbd8e88cf31abf996
俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで Braian になっちゃった。 ##mapを使用した変換 ``` var numbersString: [St...
Avatar
omochimetaru 7/5/2018 6:54 AM
toInt
Avatar
今だったら strings.compactMap(Int.init) で、 flatMap 以前なので 3 週古くて(リネーム前の flatMapArray を返す flatmapreduce
6:55 AM
reduce 使うにしても今だったら reduce(into:_:) だし。
Avatar
@swiftbot let a = [[2], [3 ,5]] for var (i, numbers) in a.enumerated() { numbers.append(3) print("\(i): \(numbers)") }
🛠 1
Avatar
swiftbot BOT 7/5/2018 8:46 AM
Author icon
koher
let a = [[2], [3 ,5]] for var (i, numbers) in a.enumerated() { numbers.append(3) print("\(i): \(numbers)") }
Version:
swift-4.1.1-RELEASE
Output:
0: [2, 3] 1: [3, 5, 3]
Error:
/usercode/main.swift:3:10: warning: variable 'i' was never mutated; consider changing to 'let' constant for var (i, numbers) in a.enumerated() { ^
Avatar
↑の warning 出なくする方法ってありますか? numbersvar に、 ilet にしたい。
8:48 AM
あー、ちがう
8:48 AM
これはできる
8:49 AM
@swiftbot let a = [[2], [3 ,5]] for (i, var numbers) in a.enumerated() { numbers.append(3) print("\(i): \(numbers)") }
🛠 1
Avatar
swiftbot BOT 7/5/2018 8:49 AM
Author icon
koher
let a = [[2], [3 ,5]] for (i, var numbers) in a.enumerated() { numbers.append(3) print("\(i): \(numbers)") }
Version:
swift-4.1.1-RELEASE
Output:
0: [2, 3] 1: [3, 5, 3]
Error:
Avatar
↓こっち。 Optional binding で varlet に bind したい。 @swiftbot let a = [[2], [3 ,5]] var iterator = a.enumerated().makeIterator() if var (i, numbers) = iterator.next() { numbers.append(0) print("\(i): \(numbers)") }
🛠 1
Avatar
swiftbot BOT 7/5/2018 8:52 AM
Author icon
koher
let a = [[2], [3 ,5]] var iterator = a.enumerated().makeIterator() if var (i, numbers) = iterator.next() { numbers.append(0) print("\(i): \(numbers)") }
Version:
swift-4.1.1-RELEASE
Output:
0: [2, 0]
Error:
/usercode/main.swift:4:9: warning: variable 'i' was never mutated; consider changing to 'let' constant if var (i, numbers) = iterator.next() { ^
Avatar
if case (let i, var numbers)? = iterator.next() {
Avatar
あー、なるほど! case にしちゃえばいいのか。ありがとうございます!
Avatar
https://github.com/apple/swift/blob/master/stdlib/public/core/Integers.swift.gyb#L2939-L2956 このアンスコ付き_random()random(in: UnboundedRange)にしたら?って提案しようかと思うんですがこういう細かい&そもそもまだ固まってない内容もフォーラムにスレッド立てていいんですかね? RandomUnificationのスレはちょっと古くて……
swift - The Swift Programming Language
Avatar
@t.ae Random Unification はすでに implemented だから別スレで問題ないんじゃないでしょうか。 random(in: UnboundedRange) は新しい API の提案だし、 reduce(into:_:)togglecompactMapValues を考えると、単独の API の提案は全然ありな気がします。
1:24 AM
最終的には FixedWidthInteger に限らず検討することになるかもしれないにしても、 pitch は気軽に投げていいんじゃないでしょうか。
1:25 AM
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
On master branch, we have FixedWidthInteger._random() function for sampling random numbers from full range. I think we should have FixedWidthInteger.random(in: UnboundedRange) for this purpose. There is FixedWidthInteger.random(in: Range) function. So adding UnboundedRange...
2:23 AM
Discussionタグは割とラフに提案できそうだったのでそれで
Avatar
<.. がほしくなった。
1:13 AM
↓がしたくなったら struct Foo { var bar: Bar { mutating get { ... } } } ↓に書き換えた方がいいでしょうか? struct Foo { mutating func bar() -> Bar { ... } }
Avatar
目的によると思いますが、キャッシュ的なものですか?
Avatar
get されてから lazy に読み込んでキャッシュしたいケースです。
Avatar
var foo1 = Foo() var foo2 = foo1 var bar = foo2.bar というときに、foo1 にキャッシュが共有されないというのが許容出来る場合、僕なら mutating func bar() にします。
1:28 AM
許容できないなら class にするか、グローバルにキャッシュを持つしかない。
Avatar
素直にclassにした方が良さそうな気はします
1:30 AM
class+lazy varがシンプルに感じる
Avatar
キャッシュが共有されないこと自体はいいんですが、今のケースではクラスにしないとまずい気がしてきました。
Avatar
なかなかファニーなエラーが出るのですが、これ何が原因なんでしょう。基本的には健全なコードだと感じますが: protocol P { associatedtype T func f(_ g: @escaping (T) -> Void) } class C<S>: P { typealias T = S private let _f: ((S) -> Void) -> Void init<Q: P>(q: Q) where Q.T == T { // Error: cannot assign value of type '((S) -> Void) -> Void' to type '((S) -> Void) -> Void' self._f = { g -> Void in q.f(g) } } func f(_ g: @escaping (S) -> Void) { self._f(g) } }
🍰 1
Avatar
protocol P { associatedtype T func f(_ g: @escaping (T) -> Void) } class C<S>: P { typealias T = S private let _f: (@escaping (S) -> Void) -> Void init<Q: P>(q: Q) where Q.T == T { // Error: cannot assign value of type '((S) -> Void) -> Void' to type '((S) -> Void) -> Void' self._f = { g -> Void in q.f(g) } } func f(_ g: @escaping (S) -> Void) { self._f(g) } }
11:14 AM
どぞ
Avatar
あ、そこも escaping つくのか。。。
11:15 AM
ありがとうございます、明白だと勘違いしてました
Avatar
cannot assign value of typeのエラーわかりにくい問題、最新のXcodeだと治ってて一発でわかりますよ
Avatar
お、なるほど
11:16 AM
あー、9.4.1 でした
11:16 AM
ということは、Beta の方ですか?
Avatar
すんませんぱちこいた
11:16 AM
なんで俺は一瞬で見抜いたんだ
Avatar
ww
Avatar
何度試しても同じエラーです、なんでわかったんだ。。。
Avatar
天のお告げ
Avatar
omochimetaru 8/6/2018 11:17 AM
ディスコで既出だからでは?
Avatar
既出だったっけ
Avatar
omochimetaru 8/6/2018 11:17 AM
うん。
Avatar
ざっくり見たことある気はするけど、にしても@escaping入れなきゃいけない位置を秒で特定できたのはちょい謎
Avatar
_f が escaping なの明白だからという流れで、引数側も明白だと勘違いした感じですね… 引数は明白じゃないのは落ち着いて考えないとわからなかったです
Avatar
いや、@escaping必要だって、、わいのXcodeは表示したんや…そのはずや…
Avatar
omochimetaru 8/6/2018 11:19 AM
改善のコントリビュートしよう
Avatar
これは、どこでしょうね。エラーの文字列化のときに escaping の表示が外れてる匂いがしますが、コード追ったことないんで見に行ってきます
🚗 1
11:30 AM
このトピック #swift-contrib 感あるので移動します
Avatar
最近気付いたんですが、self の再宣言で LLDB 壊れますね class Example { func ok() { let f = { [weak self] in guard let strongSelf = self else { return } // Set a breakpoint at here print(strongSelf) } f() } func error() { let f = { [weak self] in guard let `self` = self else { return } // Set a breakpoint at here print(self) } f() } } Example().ok() Example().error()
😲 1
6:16 AM
(lldb) br set --file example.swift --line 7 Breakpoint 1: where = example`closure #1 () -> () in example.Example.ok() -> () + 111 at example.swift:7, address = 0x00000001000017df (lldb) br set --file example.swift --line 18 Breakpoint 2: where = example`closure #1 () -> () in example.Example.error() -> () + 111 at example.swift:18, address = 0x00000001000019cf (lldb) r Process 6298 launched: '/Users/yuki.kokubun/Development/self-self-lldb/example' (x86_64) Process 6298 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 frame #0: 0x00000001000017df example`closure #1 in Example.ok(self=0x0000000100802b30) at example.swift:7 4 guard let strongSelf = self else { return } 5 6 // Set a breakpoint at here -> 7 print(strongSelf) 8 } 9 10 f() Target 0: (example) stopped. (lldb) po self ▿ Optional<Example> - some : <Example: 0x100802b30> (lldb) c Process 6298 resuming example.Example Process 6298 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1 frame #0: 0x00000001000019cf example`closure #1 in Example.error(self=0x0000000100a01030) at example.swift:18 15 guard let `self` = self else { return } 16 17 // Set a breakpoint at here -> 18 print(self) 19 } 20 21 f() Target 0: (example) stopped. (lldb) po self error: warning: <EXPR>:12:9: warning: initialization of variable '$__lldb_error_result' was never used; consider replacing with assignment to '_' or removing it var $__lldb_error_result = __lldb_tmp_error ~~~~^~~~~~~~~~~~~~~~~~~~ _ error: <EXPR>:18:5: error: value of type 'Example' has no member '$__lldb_wrapped_expr_2' $__lldb_injected_self.$__lldb_wrapped_expr_2( ^~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
6:17 AM
この場合、fr var は下のようになるので単純な名前ベースでの解決をしようとすると死ぬのが原因…? (lldb) fr var (@lvalue example.Example?) self = 0x0000000100a01030 (example.Example) self = 0x0000000100a01030 {}
Avatar
これは strongSelf の方がデバッグしやすくていいなぁ、とか思いました
Avatar
Kishikawa Katsumi 8/9/2018 6:39 AM
簡単なものだったらself?. で書くか、 クロージャの中で必要な変数をそれぞれguardでアンラップする、って感じに最近はしてますね。
6:40 AM
guard let `self` = self else { return } ^ のところをselfじゃなくて、selfの先を3〜4つアンラップする感じd。
6:40 AM
それかあらかじめローカル変数に受けるだけどそれは使えないことも多い。
😃 1
Avatar
必要な変数をunwrap、良いんですがfunctionがきつい…と思ったけどfunctionもアンラップ出来るのでは!?
6:41 AM
guard let fooMethod = self?.fooMethod else
6:41 AM
動きそう
Avatar
omochimetaru 8/9/2018 6:41 AM
その左辺のfooMethodが内部でselfをキャプチャしてるのがちょっと怖い (edited)
Avatar
此奴を又貸ししたら崩壊しますね
Avatar
omochimetaru 8/9/2018 6:42 AM
うむ。岸川さんのやつだと、又貸しセーフなので。
Avatar
まあでも結局それってmap(fooMethod)が崩壊するいつものやつで
Avatar
Kishikawa Katsumi 8/9/2018 6:43 AM
guard let self = self else { return } <= これは見た目美しいけどトラブルが多いので良くない、 strongSelf <= これは人によって色々だしどう書いても美しくない、
Avatar
こっちもコンパイラで防ぐ仕組みはいってないからどうしようもないかなぁ
Avatar
omochimetaru 8/9/2018 6:43 AM
(まあ又貸し先でselfは消えたけど又貸ししたオブジェクトは生きてて処理続行が正なのかは微妙だけど)
Avatar
functionの是非はさておき、書き味めちゃくちゃ良いです。知れて良かった、ありがとうございます。
Avatar
Error のインスタンスが手元にあるときに、それでクラッシュさせる ( try! に失敗したのと同じ状態にする)簡単な方法ってありますっけ? fatalError("\(error)") でもいいのかもしれませんが、 Error から String に情報が落ちてしまってますし。
Avatar
omochimetaru 8/9/2018 8:13 AM
try! throw error
Avatar
try ! { throw error }() だと Never でないので guard で使えないですし。
Avatar
omochimetaru 8/9/2018 8:13 AM
おおなるほど
Avatar
try! throw errorthrow が関数じゃないからできなくない?
8:15 AM
internal func fatalError<E: Error>(with error: E) -> Never { try! { throw error }() fatalError("Never reaches here.") } という微妙なユーティリティ関数を作ろうとしたけどもっといい方法はないかなと。
Avatar
omochimetaru 8/9/2018 8:15 AM
↑自分の知見もそこまでです
Avatar
Java だと throw new RuntimeException(exception); とかでいいんだけど。
8:18 AM
( Swift でも Logic failure なら fatalError じゃなくて preconditionFailure がいいかな。 precondition なのか微妙だけど。)
Avatar
https://github.com/apple/swift/blob/d30aa32001227a860706d4b475352c46fc57b4dc/stdlib/public/core/ErrorType.swift#L180-L186 っちゅうわけなので、String(reflecting: error) で同等みたいです。
swift - The Swift Programming Language
🙏 1
Avatar
omochimetaru 8/9/2018 8:20 AM
_unexpectedError の返り値の型は Never ではないのですね
8:21 AM
swift_unexpectedError が呼ばれる命令が直接 emit されるのかな
Avatar
invoke って call と同じような意味かと思ってたけど、 "Invoked by the compiler" ってことは、ランタイム時にコンパイラ関係ないから、コンパイラが使う(コンパイル時にこの関数を呼び出すコードを差し込む)というようなニュアンス?
Avatar
一周回ってよくわからなくなった。 call にしても、関数を呼び出す主語は何だろう?プログラマ?コード?(その関数を呼び出す行が書かれている)関数?実行しているプログラム?
Avatar
CMSampleBuffer ってメソッドが何もなくて https://developer.apple.com/documentation/coremedia/cmsamplebuffer
9:40 AM
CMSampleBufferGetImageBuffer(_:) みたいな関数群があるけど https://developer.apple.com/documentation/coremedia/1489236-cmsamplebuffergetimagebuffer
9:41 AM
これらをひたすら呼び出す extension を作ってメソッド化して↓に突っ込めば良い? https://github.com/apple/swift/tree/master/stdlib/public/SDK/CoreMedia
swift - The Swift Programming Language
Avatar
EvolutionのReview開始ってAnnouncementsに流れなくなったのかな? https://forums.swift.org/c/evolution/announce
This category is for announcements of Swift evolution proposal reviews and results, as well as other administrative announcements. Creation of new topics in this category is by site admins and Swift Core Team members only, although anyone can reply to topics once created.
10:41 AM
SE-0223, SE-0224, SE-0225の開始がAnnouncementsに流れてなくて気づかなかった。
10:47 AM
あれ?Review開始は随分前からAnnouncementsに流れてなかったのか。気づいてなかった…
Avatar
そういや、すごい基本的なところお伺いしたいんですが、DispatchQueue 経由でメインスレッド以外の処理を実行するコードがあったとして、そのスレッドを breakpoint で止めたとき、この thread がどこのコードによって生成されたかってわかるのでしょうか?
Avatar
omochimetaru 8/24/2018 6:42 AM
Xcode+DispatchQueueだと表示されてますね
6:42 AM
asyncメソッドに投入する側の、投入するまでのスタックトレースが
6:42 AM
繋がって表示されます。
Avatar
なるほど、
Avatar
omochimetaru 8/24/2018 6:42 AM
仕組みはよく知らないです。
6:43 AM
あ、スレッドが生成されたかどうかは、わからないですね。
Avatar
JS でも似たような問題があって処理系が超頑張ってた覚えがあるのですが、Swift も同じような感じなのかな
Avatar
omochimetaru 8/24/2018 6:43 AM
原理的には
6:43 AM
投入するメソッドでスタックトレースを読み取って
6:44 AM
投入先のスレッドのスレッドローカルストレージとかに
6:44 AM
それをしまっておけばできる・・・?
Avatar
やっぱそんな感じになりますよね
Avatar
omochimetaru 8/24/2018 6:44 AM
多重に往復した場合にもうまくいくようになんか工夫が必要そうですが、
Avatar
Apple の NSTread のドキュメント見た感じだと、普通に触るところには露出してなさそうだったので諦めてました
Avatar
omochimetaru 8/24/2018 6:44 AM
あー
6:45 AM
Xcodeのその仕組に対応したスタックトレースをまたいでつなげるやつを
Avatar
あ、NSThread じゃなくて普通に Thread だった
Avatar
omochimetaru 8/24/2018 6:45 AM
自前の非同期機構に搭載する方法は謎ですね。
Avatar
あ、今回は DispatchQueue のやつなので、自前ではないんです
Avatar
omochimetaru 8/24/2018 6:46 AM
それならDispatchqueueの仕組みで自然と対応されません?
Avatar
DispatchQueue.global(qos: .default).async { // この中で [NSException raise] が呼ばれていて、 // breakpoint set -S raise で止まった状態を想定してください。 // ここで、この doSomething を呼び出す task を誰が追加したのか // 追跡したい感じです。 doSomething() }
6:48 AM
一応認識合わせのためにコード書いて見ました
6:49 AM
Xcode では試してないのですが、AppCode では pthread 生成のコードが callstack の底にあったので、呼び出し元がわからない感じになってました
Avatar
omochimetaru 8/24/2018 6:53 AM
stack
6:53 AM
Xcodeだとこういう感じです。
Avatar
うぉ、ほんとだ
6:53 AM
ちなみに、この時の (lldb) th b の結果はおそらく上だけな感じですよね?
6:54 AM
これどうやってるんだ、、、
Avatar
omochimetaru 8/24/2018 6:54 AM
(lldb) th backtrace * thread #3, queue = 'com.apple.root.default-qos', stop reason = breakpoint 1.1 frame #0: 0x000000010e89e001 libobjc.A.dylib`objc_exception_throw frame #1: 0x000000010f2090b9 CoreFoundation`-[NSException raise] + 9 * frame #2: 0x000000010df90ea6 StackChain`doInnerSomething() at ViewController.swift:8 frame #3: 0x000000010df90e19 StackChain`doSomething() at ViewController.swift:4 frame #4: 0x000000010df910c9 StackChain`closure #1 in ViewController.onButton() at ViewController.swift:14 frame #5: 0x000000010df910fd StackChain`thunk for @escaping @callee_guaranteed () -> () at ViewController.swift:0 frame #6: 0x000000011359b7ab libdispatch.dylib`_dispatch_call_block_and_release + 12 frame #7: 0x000000011359c7ec libdispatch.dylib`_dispatch_client_callout + 8 frame #8: 0x00000001135a1619 libdispatch.dylib`_dispatch_queue_override_invoke + 1451 frame #9: 0x00000001135a836c libdispatch.dylib`_dispatch_root_queue_drain + 664 frame #10: 0x00000001135a8076 libdispatch.dylib`_dispatch_worker_thread3 + 132 frame #11: 0x0000000113ac7169 libsystem_pthread.dylib`_pthread_wqthread + 1387 frame #12: 0x0000000113ac6be9 libsystem_pthread.dylib`start_wqthread + 13 (lldb)
6:54 AM
ほんとですね。
Avatar
てことは Xcode が何やら裏側でやっているのか。。。
Avatar
omochimetaru 8/24/2018 6:54 AM
lldbの外でやってるのか。
Avatar
む、、、これよくみたら frame #3 に変なの載ってますね。StackChain って語感からすると、別スレッドの退避された環境を戻すためのもの…?
Avatar
omochimetaru 8/24/2018 7:07 AM
StackChain、というのは僕がつけたプロジェクト名です
Avatar
あ、なるほど w
7:08 AM
これ、UI を main thread 以外で触って怒られた時のデバッグで頻出するパターンなんですが、AppCode でやりづらいのはつらいので機能要望をあげておきます
Avatar
norio_nomura 8/24/2018 9:37 AM
thread backtrace -e trueでEnqueued from…の内容も見られますね。
Avatar
(lldb) h th b Show thread call stacks. Defaults to the current thread, thread indexes can be specified as arguments. Use the thread-index "all" to see all threads. Use the thread-index "unique" to see threads grouped by unique call stacks. Syntax: Command Options Usage: thread backtrace [-c <count>] [-s <frame-index>] [-e <boolean>] -c <count> ( --count <count> ) How many frames to display (-1 for all) -e <boolean> ( --extended <boolean> ) Show the extended backtrace, if available -s <frame-index> ( --start <frame-index> ) Frame in which to start the backtrace
9:42 AM
なんと、超便利オプションだ…
9:42 AM
@norio_nomura ありがとうございます
🙂 1
Avatar
omochimetaru 8/24/2018 9:42 AM
extended backtrace!
Avatar
まったく存在に気づいていなかったw
Avatar
norio_nomura 8/24/2018 9:43 AM
/usr/lib/system/introspectionを使った機能みたいです。
Avatar
$ ls /usr/lib/system/introspection libdispatch.dylib* libsystem_pthread.dylib*
9:44 AM
なるほど、これは
9:46 AM
* @discussion * These hooks are only available in the introspection version of the library, * loaded by running a process with the environment variable * DYLD_LIBRARY_PATH=/usr/lib/system/introspection
9:46 AM
なるほど、LD_PRELOAD 的なので差し込まれるのか
9:46 AM
ありがとうございます
Avatar
norio_nomura 8/24/2018 9:50 AM
Xcodeは勝手に面倒を見てくれますが、ターミナルからlldbを直接起動する場合とかは自分で設定する必要があるみたいです。
Avatar
あー、なるほど
9:52 AM
そして AppCode では話題にも上がっていないっぽいw
9:52 AM
てことは、Scheme の環境変数に自前で追加してあげないとダメっぽいですね
9:53 AM
一応後で AppCode の LLDB で target module list かけてみて libdispatch.dylib が本物っぽいかどうかだけ確認してみます
9:54 AM
もし面倒見てくれてたら別なの見てると思うので
Avatar
norio_nomura 8/24/2018 9:55 AM
試しにprocess launch -v DYLD_LIBRARY_PATH=/usr/lib/system/introspection/usr/lib/system/introspection/libdispatch.dylibをロードしただけでは、thread backtrace -e trueは意図した通りに動きませんでした。 🤔
Avatar
なるほど、なんでしょうね、まだ必要な操作があるのか…
Avatar
/Applications/Xcode.app/Contents/Developer/usr/lib/libBacktraceRecording.dylibってのをlldb-rpc-serverは使ってるけど、lldbplugin load /Applications/Xcode.app/Contents/Developer/usr/lib/libBacktraceRecording.dylib してもダメだった。 (edited)
Avatar
process launch -v DYLD_LIBRARY_PATH=/usr/lib/system/introspection -v DYLD_INSERT_LIBRARIES=/Applications/Xcode.app/Contents/Developer/usr/lib/libBacktraceRecording.dylib でイケた。
Avatar
norio_nomura 8/28/2018 3:44 AM
swift -frontend -replなんてのがあったのね。 $ swift -frontend -repl *** You are running Swift's integrated REPL, *** *** intended for compiler and stdlib *** *** development and testing purposes only. *** *** The full REPL is built as part of LLDB. *** *** Type ':help' for assistance. *** (swift) :help Available commands: :quit - quit the interpreter (you can also use :exit or Control+D or exit(0)) :autoindent (on|off) - turn on/off automatic indentation of bracketed lines :constraints debug (on|off) - turn on/off the debug output for the constraint-based type checker :dump_ir - dump the LLVM IR generated by the REPL :dump_ast - dump the AST representation of the REPL input :dump_decl <name> - dump the AST representation of the named declarations :dump_source - dump the user input (ignoring lines with errors) :print_decl <name> - print the AST representation of the named declarations :print_module <name> - print the decls in the given module, but not submodules API documentation etc. will be here eventually. (swift)
Avatar
omochimetaru 8/28/2018 3:45 AM
$ swift のときに突入するのがそれだと思ってました (edited)
Avatar
norio_nomura 8/28/2018 3:46 AM
普通のREPLには無い機能ばかりです。lldbを使わないので、--privileged無しのdockerでも使える。
Avatar
omochimetaru 8/28/2018 3:46 AM
そうなのか!
3:47 AM
lldbを使わないので、--privileged無しのdockerでも使える。
これ地味にいいですね。
Avatar
norio_nomura 8/28/2018 3:48 AM
Herokuが--privileged無しdockerなので、Herokuで動いてるSwiftボットでも、修正すれば使える様になりそう。
Avatar
swift -deprecated-integrated-repl がそれですね。
Avatar
omochimetaru 8/28/2018 3:48 AM
deprecatedw
3:49 AM
[omochi@omochi-iMac-PC43 bne-loci (master *+=)]$ swift -deprecated-integrated-repl *** You are running Swift's integrated REPL, *** *** intended for compiler and stdlib *** *** development and testing purposes only. *** *** The full REPL is built as part of LLDB. *** *** Type ':help' for assistance. *** (swift) ^D [omochi@omochi-iMac-PC43 bne-loci (master *+=)]$ swift Welcome to Apple Swift version 4.2 (swiftlang-1000.0.36 clang-1000.0.4). Type :help for assistance. 1> ^D [omochi@omochi-iMac-PC43 bne-loci (master *+=)]$ swift -frontend -repl *** You are running Swift's integrated REPL, *** *** intended for compiler and stdlib *** *** development and testing purposes only. *** *** The full REPL is built as part of LLDB. *** *** Type ':help' for assistance. *** (swift) ^D
3:50 AM
-frontend -repl のほうが -deprecated-integrated-repl か・・・
Avatar
norio_nomura 8/28/2018 3:50 AM
使えて意味がありそうなのはprint_declprint_moduleくらいだけど、どれも出力が大きくなるからボットで使えてもありがたみが薄いかな?
Avatar
norio_nomura 8/28/2018 4:55 AM
@swift-4.2.4 -frontend -repl :print_decl Equatable
Avatar
protocol Equatable { static func == (lhs: Self, rhs: Self) -> Bool } extension Equatable { @inlinable static func != (lhs: Self, rhs: Self) -> Bool }
Avatar
norio_nomura 8/28/2018 4:55 AM
-frontend -replサポート出来た。
Avatar
norio_nomura 8/28/2018 9:37 AM
https://swift.org/download/#snapshotsswift-DEVELOPMENT-SNAPSHOT-2018-08-26-a があるけど https://github.com/apple/swift/tags にタグが無いな。gitで見ても無さげ。
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
9:39 AM
新しいツールチェインの検出をGitHubのAPIに頼ってるから、swift.orgだけに現れても検出できない…
Avatar
Go 2 のエラーハンドリングのドラフト、 Swift のエラーハンドリングについても言及されてる。 https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling-overview.md
😀 1
Avatar
結構よさそう
Avatar
omochimetaru 8/29/2018 2:51 AM
Swiftのtryオペレータみたいにcheck命令を書くんですね
2:51 AM
handleスコープをメソッド冒頭にもかけるのはSwiftに無い機能だな
Avatar
Genericsもあるらしいんですがこれであってますかね? https://go.googlesource.com/proposal/+/master/design/go2draft-contracts.md
Avatar
omochimetaru 8/29/2018 2:52 AM
これはprotocolみたいなやつじゃない?
2:52 AM
Generics名乗ってはいるんですよね
2:52 AM
overviewは↑だった
Avatar
omochimetaru 8/29/2018 2:53 AM
ただのGenericsだと、
2:53 AM
その型パラメータに何ができるのってことがわからないから
2:53 AM
型パラメータの型を制約して呼び出せるメソッドとかを宣言しないと意味がなくて
2:53 AM
Javaだと T: Hoge みたいに書けるけど、
2:54 AM
その継承縛りだけだとできない事も出てくるからSwiftのprotocolみたいなものが必要になってきて
2:54 AM
それがGoだとcontractなのではなかろうか
2:54 AM
C++も同様の問題があって concept という言語機能が検討されている
Avatar
ふむふむ
Avatar
動的型付言語から静的型付言語に揺り戻しが来たように、暗黙的エラーから明示的エラーに揺り戻しが来てんのかな。 Java が面倒過ぎた反動で動的・暗黙的に偏りすぎたけど、本来的には必要なものだったから改善して戻ってきたみたいな? (edited)
Avatar
omochimetaru 8/29/2018 2:55 AM
Goにちゃんとした型制約が提案されてるのは意外だけど。
2:55 AM
もっとやるとしてもC++ライクな適当なジェネリクスというかコンパイル時ダックタイピング的なものになるかとおもた
2:56 AM
あーでもジェネリッククラス自体をコンパイルするときにはヒントが足りないからこういう宣言機構がやっぱり必要なのかな。
2:57 AM
どうなんでしょう、Goはもともと明示的エラーハンドリングが強く推奨されていたから
2:57 AM
揺り戻すというよりGoはもともとそうだったという感じがします
Avatar
Go がというよりも、暗黙的一辺倒だったのが最近明示的が増えてきたことに対して。
3:00 AM
この冒頭に handle 書くの、気持ち悪い気がしたけど defer 的な気持ちで見れば良いのか。
3:02 AM
全体を do/catch で囲まなくてよいのでネストが深くならないのが良い?
Avatar
omochimetaru 8/29/2018 3:03 AM
Guidelines for using language features to write maintainable code.
3:03 AM
フラッタ〜に採用されとるDart2を見てるけど
3:03 AM
動的例外な気がする
Avatar
finally を採用せずに defer にしたんだったら、この handle みたいなのの方が理に適ってる気がするけどどうだろう? (edited)
Avatar
omochimetaru 8/29/2018 3:05 AM
個人的にはcatchするとdoが必要でネストするのが嫌いなのでこのネストしないhandleは良いなと思ったけど
3:05 AM
deferがあるなら、という理由で理に適ってるという理屈はよくわからないです
3:05 AM
特に、catchスコープの後ろに文が書けるけど、handleだとそれができなそう。
Avatar
これコードブロックの解析面倒くさそうだなって思ったんですが、swiftよろしく同一func内に複数handleを書こうとすると、それは無理だったりするのかな
Avatar
omochimetaru 8/29/2018 3:10 AM
このhandleはfunc内のエラーを全部捕まえそうに見える
Avatar
都度handleで綺麗な状態にするのは無理がある気はする、人間が変数の有効期限を認知できない
3:10 AM
だよね
Avatar
omochimetaru 8/29/2018 3:11 AM
あ、もしかしたら、
3:11 AM
ifの中のスコープにhandleをかけば
Avatar
swiftのdoって無名funcよろしく振る舞えるのだけど、そういうのは無理そうだな
Avatar
omochimetaru 8/29/2018 3:11 AM
そのifスコープの範囲で捕まえるのかな?
Avatar
スコープが明示的に切れてその上で出来るなら
3:11 AM
かなり良さそうですね
3:11 AM
そして #other-lang でないことに気が付く
Avatar
omochimetaru 8/29/2018 3:12 AM
Goは空スコープ作れたっけな・・・
Avatar
handle とスコープについては、 Go の defer はスコープ関係なく関数単位だったはずだから、 handle はどうなんだろう?とさっきから思ってる。
3:13 AM
そして #other-lang でないことに気が付く
最初は Swift に言及されてるよ、だったので😅 #other-lang 行きますか。
11:46 AM
こういう感じのグラフを生成できるいい感じの Swift 製ライブラリってありますかしら? (edited)
Avatar
@tarunon privateな行なのにいじると問答無用でフルビルドが始まるみたいなのってどういう状況で起こるんだっけ
Avatar
AがBをimportしているとき、Bの型の構造が少しでも変わるとAはフルビルド
11:35 AM
ABIまだだから残当な気もしている
😯 1
Avatar
それってobjc関係してるんだっけ
12:47 PM
「型の構造」っていうのは外から見た可視性は関係ない?
Avatar
objcのブリッジングがコンパイル時間の重きを占める上に本体に存在してあらゆる場面で発火するから結構ストレス
12:47 PM
経験則的に可視性関係なくメソッド変わったら発火する
12:48 PM
internalなクラスを増やしたり、overrideちょっと変えたりしても大体アウト
Avatar
AがBをimportしているとき、Bの型の構造が少しでも変わるとAはフルビルド
これはどっちかがobjc含んでたらみたいな話なんだっけ?
Avatar
swiftだけでも起きるかもだけど、被害に遭うのはアプリ本体で、往々にしてそこにobjcブリッジングがある。
12:51 PM
swiftだけで発生するかは確認していない
Avatar
モジュール分割を推し進めていくと食らう可能性があるよね
Avatar
いや、そもそも可視性関係なくswift書き換えたらobjcブリッジングが発火するのは本体アプリオンリーでも起きる
Avatar
importっていうのはそういうことか
12:53 PM
モジュールの話かと思った
Avatar
頻度の問題で、 1. 開発速度が間違いなく向上する 2. Frameworkはswiftオンリーなのでobjc書かない と言う二つの事象でswiftを書く頻度が確実に上がる
12:54 PM
これがビルドに対するストレスとして顕在化するんじゃ
Avatar
うーん
Avatar
後もう一個、 3. 全体で底上げされるのでマージ&フルビルドも増える
Avatar
norio_nomura 9/25/2018 1:14 PM
#uikit で出てたStringからNSStringへの暗黙変換が起きる条件って何だろう?
1:16 PM
例えばNSString.character(at:)は、Linuxでは4.2から起きる。 @swift-4.0.3 @swift-4.1.3 @swift-4.2.4 -frontend -repl import Foundation "test".character(at: 0) (edited)
Avatar
// r0 : unichar = 116 (edited)
Avatar
stderr:<REPL Input>:1:1: error: value of type 'String' has no member 'character' "test".character(at: 0) ^~~~~~ ~~~~~~~~~ Swift.String:42:16: note: did you mean 'characters'? public var characters: String.CharacterView { get set } ^ (edited)
Avatar
stderr:<REPL Input>:1:1: error: value of type 'String' has no member 'character' "test".character(at: 0) ^~~~~~ ~~~~~~~~~ Swift.String:10:16: note: did you mean 'characters'? public var characters: String.CharacterView { get set } ^ Swift.String:8:16: note: did you mean '_characters'? public var _characters: String._CharacterView { get set } ^ (edited)
Avatar
norio_nomura 9/25/2018 1:19 PM
macOSだと起きない。 $ echo 'import Foundation; "test".character(at: 0)'|swift -frontend -repl -sdk `xcrun --sdk macosx --show-sdk-path` <REPL Input>:1:20: error: value of type 'String' has no member 'character' import Foundation; "test".character(at: 0) ^~~~~~ ~~~~~~~~~ Swift.String:10:16: note: did you mean 'characters'? public var characters: String.CharacterView { get set } ^ Swift.String:8:16: note: did you mean '_characters'? public var _characters: String._CharacterView { get set } ^
Avatar
現状の master のソースを見る限り、1) 元のタイプが Swift.String であり、2) Swift.String_ObjectiveCBridgeable であり、 3) lookupするメンバー名が Swift.String に生えておらず、 4) ブリッジ先タイプにはそのメンバーが存在し 5) 存在するモジュールが Clang モジュールの Foundation 以外のとき。 っていう条件なので、 corelibs-foundation は 5 の条件をすり抜けて見えちゃっている感じっぽいですね。 (edited)
1:43 PM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
なるほど。Swift 4.2でNSStringにインスタンスメンバーを追加すると、Stringからも使えてしまうと。 @swift-4.0.3 @swift-4.1.3 @swift-4.2.4 -frontend -repl import Foundation extension NSString { func hoge() -> String { return "hoge" } } "test".hoge()
Avatar
// r0 : String = "hoge"
Avatar
stderr:<REPL Input>:1:1: error: value of type 'String' has no member 'hoge' "test".hoge() ^~~~~~ ~~~~
Avatar
stderr:<REPL Input>:1:1: error: value of type 'String' has no member 'hoge' "test".hoge() ^~~~~~ ~~~~
Avatar
https://swift.org/blog/swift-4-2-released/ でSupport for batch mode compilation resulting in faster build timesと言及されているものについて。 この件はWWDC 2018のセッションでも紹介がありました: https://developer.apple.com/videos/play/wwdc201...
2:40 AM
「複数ファイル単位でコンパイル」って具体的にどういうことなんだろう
2:40 AM
1コアごとに1ファイルずつ順番にコンパイルしてたのが、ってことだと思うんだけど、ピンとこないです
Avatar
omochimetaru 9/28/2018 2:40 AM
コンパイラが複数のファイルを同時に受け付けて
2:41 AM
コンパイルするか
2:41 AM
一つのファイルを受けて一つのオブジェクトを吐くか
Avatar
一時期あった「ソースコードを全部1ファイルにまとめるとコンパイル速いじゃん」と同じような話なのかなと思ったんだけど
2:42 AM
違う?
Avatar
omochimetaru 9/28/2018 2:42 AM
1つのswiftコマンドの呼び出しに
2:42 AM
いくつのソースファイルがコマンド引数として渡されているか
2:42 AM
という話です
Avatar
あーピンときた
2:43 AM
今までは1ファイルしか渡せなかったのが複数渡せるようになったってことか
Avatar
omochimetaru 9/28/2018 2:43 AM
デバッグモードに関してはそう。
Avatar
ふむ
Avatar
omochimetaru 9/28/2018 2:43 AM
リリースモードはもともと複数渡しだった。
Avatar
なるほどー
Avatar
omochimetaru 9/28/2018 2:43 AM
リリースモードは複数渡しにすることで
2:43 AM
whole module optimization
2:44 AM
つまり、「モジュールの中にサブクラスが一個も無いから実質ファイナル」とか
2:44 AM
そういう最適化ボーナスがついてたけど
2:44 AM
そのためには全部のファイルを渡さないといけないから
2:44 AM
開発中にそれをやると毎回のビルドが時間がかかってしまうから
2:45 AM
デバッグモードでは1コマンド1ファイルにして
2:45 AM
変更されたものだけビルドしてた
2:45 AM
今回のアップデートで、 変更されたいくつかのファイルを1コマンドでビルド っていう新しい挙動が実現されたんじゃないかな?
Avatar
あー
2:46 AM
インクリメンタルビルドと組み合わせて美味しさが増したって感じかあ
Avatar
omochimetaru 9/28/2018 2:46 AM
良いとこ取りって感じだと思う
Avatar
いいね
2:46 AM
「Xcode10にしたらビルドがめっちゃ速くなった」という事実だけ体感していてなんでやと思ってたけど納得した
Avatar
以前が1ビルド1ファイル渡しっていうのは ちょっと正確ではなくて、今までも全部のファイルを渡していました。 が、コンパイル対象は一つだけ。他のファイルはCにおけるヘッダファイル的に宣言のみが使われていました。当然それらの宣言のタイプチェックも必要なので、仮に3ファイルあるとすると、3回のコンパイルで、のべ9ファイル分のタイプチェックが走っていたので効率が悪かったのです。
Avatar
omochimetaru 9/28/2018 2:54 AM
あれ?そのタイプチェクした結果は、.swiftmodule ファイルとしてキャッシュされないですか?
Avatar
インクリメンタルビルドにおいて、ファイル毎.swiftmodule は依存の解決には使われていなかったと思うのですが、記憶違いかも。 (edited)
Avatar
omochimetaru 9/28/2018 2:58 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
2:58 AM
前にこのへんを読んでいて、SwiftPMの挙動は確認したんだけど、
2:58 AM
xcodebuildはよくしらべてない・・・
2:59 AM
And some build systems (coughXcodecough) want to individually track persisted output files, instead of dumping them into a temporary directory. Trying to specify the outputs for every input file on the command line would be awkward and ridiculous, so instead we use an output file map.
(edited)
2:59 AM
ここらへんで いくつかのビルドシステム(コホン Xcode コホン) のために
2:59 AM
依存ツリーをダンプしたファイルを作ってうんたらかんたら
Avatar
ちょっと挙動確認してからまた書きますね。
Avatar
盛り上がってる〜 Batch Modeの挙動・実装を正確に追うのはちょっと時間なかったので、ある程度ぼかして書いていました
Avatar
omochimetaru 9/28/2018 3:15 AM
SwiftPMならまだなんとか調べられるんだけど、xcodebuildだとSDKとかいろいろ渡されすぎてて気が遠くなるw
Avatar
やっぱりインクリメンタルビルドでファイル毎 .swiftmodule は出力されるものではありますが、他ファイルのコンパイル時に参照されて使われる物ではないですね。A.swift,B.swift, C.swiftあったときにクリーンビルドだと swift -frontend -c -primary-file A.swift B.swift C.swift swift -frontend -c A.swift -primary-file B.swift C.swift swift -frontend -c A.swift B.swift -primary-file C.swift の 3 フロントエンド実行されて、frontend に -primary-file じゃないファイルの .swiftmodule があったらそれに読み替えるみたいな機能はないので。
Avatar
norio_nomura 9/28/2018 3:31 AM
Xcode 10からデフォルトになったNew Build Systemは、SwiftPM同様にllbuildマニフェストを使います。 Xcodeはマニフェストを ${PROJECT_TEMP_ROOT}/XCBuildData/*-manifest.xcbuild に生成します。 それらをSwiftPMの.build/debug.yamlとかと比較すると違いを調べやすいかも? (edited)
Avatar
omochimetaru 9/28/2018 3:38 AM
なるほど〜〜
Avatar
$ cat A.swift @available(*, introduced: 1) public func funcA() { print("funcA") } $ cat B.swift public func funcB() { print("funcB") funcA() } $ cat C.swift public func funcC() { print("funcC") } $ cat output.json { "A.swift": { "object": "Derived/A.o", "swiftmodule": "Derived/A~partial.swiftmodule", "swift-dependencies": "Derived/A.swiftdeps", }, "B.swift": { "object": "Derived/B.o", "swiftmodule": "Derived/B~partial.swiftmodule", "swift-dependencies": "Derived/B.swiftdeps", }, "C.swift": { "object": "Derived/C.o", "swiftmodule": "Derived/C~partial.swiftmodule", "swift-dependencies": "Derived/C.swiftdeps", }, "": { "swift-dependencies": "Derived/buildrecord.swiftdeps" } } $ mkdir -p Derived な状態から、 $ xcrun swiftc -v -incremental -output-file-map output.json A.swift B.swift C.swift -module-name MyModule -emit-library -emit-module -o Derived/MyModule.dylib でとりあえずクリーンビルドして、Derived ディレクトリの中身見たり、A.swift@available消して同コマンド実行して何が起こってるか確認したりすると面白いです。 (edited)
👀 1
3:48 AM
で、 swiftc コマンドに -enable-batch-mode 追加してあげるとXcode10の挙動と同等に。 (edited)
Avatar
norio_nomura 10/1/2018 3:31 AM
ソースコードに何も変更はなく、新しい機能を使っているわけでもないのに、メジャーバージョンを上げてまでSwift 4.2に変えたい理由って何だろう? https://github.com/antitypical/Result/pull/271
Bump swift version to 4.2 and also increment pod version.
Avatar
omochimetaru 10/1/2018 3:36 AM
個人的には最新版でビルドしてない時点でライブラリは使いたくないです
3:36 AM
技術的な理由というより開発者が放置してるんじゃないか?って思ってしまう
3:36 AM
4.2にする必要はなくても、将来5.0になったときに互換性の問題が出るかもしれなくて
3:37 AM
そういうときに備えて、常に最新に対応する姿勢が見えないと
3:37 AM
後のバージョンの対応が迅速じゃないかもしれない、って心配になる。
3:38 AM
まあ、Resultぐらいなら、最悪そのときは自分でフォークして直すのも簡単だし使いますけど。
3:38 AM
あと、プロジェクトの中で、あるモジュールは4.1、あるモジュールは4.2でビルドしてからリンクします、 みたいなやつ、動くのかもしれないけど信用ならないから心配。
Avatar
Kishikawa Katsumi 10/1/2018 3:39 AM
^ に限らず、大抵のSwift 4.2対応ってくるPRはこんな感じなんですけど、
個人的には最新版でビルドしてない時点でライブラリは使いたくないです
これは使うほうが4.2のツールチェーンでビルドすればいいだけなので、ライブラリ側で互換性を崩す必要はないと思います。
Avatar
norio_nomura 10/1/2018 3:39 AM
Swift 4.2でCI通すだけで良いと思うのですよね。
Avatar
omochimetaru 10/1/2018 3:40 AM
Swift 4.2でCI通すだけで良い
ああ、READMEのところとかに、 [swift 4.2] みたいなバッジがついてたりしたら、安心です
3:40 AM
4.2で問題がないことを確認していることがわかるので。
3:41 AM
実際に問題がないかどうかじゃなくて、問題がないことをチェックしているか、がきになる。
3:41 AM
それがないと、自分の環境でビルドはできても、実行時にはなにか変なことが起きるかもしれないし。 Resultぐらいシンプルなソースだとそれも考えにくいですが。。。
Avatar
norio_nomura 10/1/2018 3:48 AM
あと、プロジェクトの中で、あるモジュールは4.1、あるモジュールは4.2でビルドしてからリンクします、 みたいなやつ、動くのかもしれないけど信用ならないから心配。 むむ、これって何かトラブルの事例ってあるのですか?
Avatar
omochimetaru 10/1/2018 3:49 AM
いや、見聞きした事例はないです
3:49 AM
個人的に、本当にちゃんと動くのかな・・・って思っているだけ (edited)
Avatar
norio_nomura 10/1/2018 3:49 AM
なるほど。
Avatar
omochimetaru 10/1/2018 3:50 AM
単純に、最も安全確実でクリーンだと思われるのが、関連ソース何もかもが最新ビタビタで揃ってる事なので。
3:50 AM
あ、昔で言えば、ライブラリがbitcode対応していないのに引きずられて、それをリンクするアプリもbitcode対応できない、とかありましたね。
3:51 AM
bitcodeが初出のバージョン間ではそういうこともありました。
Avatar
Kishikawa Katsumi 10/1/2018 3:53 AM
Swiftはちょっと特殊だから難しいですけど、 最も安全確実なのはそれなりに使われているコードなのでいまでいうとSwift 4.0か4.1だと思いますね。 (edited)
Avatar
omochimetaru 10/1/2018 3:53 AM
なるほど。
3:53 AM
たしかに、少し前のメジャーで全部揃えるのが一番安心か・・・。
Avatar
Kishikawa Katsumi 10/1/2018 3:55 AM
で、ライブラリ提供側だと、常に最新というポリシーもありだし、 使用者が選べるというのもありで、私は後者の考えを持っています。
4:00 AM
あと、できるだけ古いツールチェーンもサポートすべきと思っていて、それはそっちの方が良いはずという意図があります。自分のリポジトリは。
Avatar
norio_nomura 10/1/2018 4:05 AM
あれ?Xcode 9.xって、SWIFT_VERSION = 4.2になっててもswiftcへは-swift-version 4って渡すのかな?
Avatar
9.xだとSwift 4.2という言語バージョンは知らないと思うので、4.1の指定したときと同じで4を渡す気がします (edited)
4:11 AM
ResultでXcode 10でのCIは別PRがあるので安心してほしい https://github.com/antitypical/Result/pull/269
👍 1
Avatar
norio_nomura 10/1/2018 4:13 AM
project.pbxprojSWIFT_VERSION = 4.2になってても過去のXcodeでビルド出来るなら、SWIFT_VERSION = 4.2にしてしまっても良い様な気がしてきた。
4:20 AM
それだとbreaking changeにもならないよね。
Avatar
norio_nomura 10/1/2018 5:13 AM
project.pbxprojSWIFT_VERSION = 4.2になってても、Xcode 9.0.1, 9.1, 9.2, 9.3.1, 9.4.1はswiftc-swift-version 4を渡すのを確認した。
Avatar
norio_nomura 10/1/2018 9:24 AM
XcodeプロジェクトでSWIFT_VERSION = 4.2にしてもbreaking changeにならないとしても、podspecのswift_versionはどうなんだろう?
9:30 AM
ドキュメント読んでもよくわからないな… https://guides.cocoapods.org/syntax/podspec.html#swift_version (edited)
The Dependency Manager for iOS & Mac projects.
Avatar
Kishikawa Katsumi 10/1/2018 9:43 AM
pod_specのswift_versionはあったらそのバージョンの固定、っていう動作だからむしろ書かないほうが良いと思うんですよね。 書いてなければビルド環境に応じて4.2になるけど4.1って書いてしまったら4.1になる、はず。
Avatar
そうすると、4.2をそのままだとビルドできないライブラリがあった時に(4.2が出るまでそれが分かっていなかった時)、ユーザーがアプリターゲットを4.2にしたと同時にライブラリも4.2でビルドされようとして、突然ビルドが壊れだして、ライブラリのユーザーもメンテナーも疲弊するなーという印象です。せっかくターゲット毎に異なる言語バージョンが使えるので、できる限り安定的にビルドできる状態を保証しておきたいと個人的には思います。 (edited)
10:18 AM
まあみんなbetaの時からCI回してどの言語バージョンでもビルドできるようにしておいて、podのswift_versionを固定しないでおくのが理想的ではあると思いますが、なかなかそのリソースがないですよね (edited)
10:22 AM
Xcode 10だと、3, 4, 4.2の3モードがあるので、swift_versionを指定しない場合は理想的にはそのすべてをサポートしておく必要がありそう。
10:24 AM
Carthageだとライブラリ側のターゲット定義で言語バージョンを決められるけど、CocoaPodsだとユーザーのアプリの言語バージョン指定に引きづられてしまう(swift_versionを指定していない限り)ので難しさが増す、ということですね。 (edited)
Avatar
こうしたケースを回避しようとすると、ユーザーが各自でpost_installフックで特定のライブラリのSWIFT_VERSIONを変更しなくてはいけない。その問題を解決するためにspec.swift_versionが追加された、という認識です。
Avatar
Kishikawa Katsumi 10/1/2018 10:40 AM
固定したほうが良い場合ももちろんあります。 ただ、ResultsとかUIKit
10:41 AM
使ってなかったら4.0-4.2はだいたい互換性があるはずなんで、
10:41 AM
そういうのはむしろ固定しない方が良いと思うんですよね。
Avatar
Swift 4以上の言語機能を使っている場合はSwift 3はサポート不可なので、指定しないわけにはいかない気がしますが、どうでしょうか?Xcode 10でユーザーのアプリがSWIFT_VERSION=3だとPodのターゲットもSwift 3になってしまうと思うので。
Avatar
Kishikawa Katsumi 10/1/2018 10:45 AM
3もサポートするならコード内で分岐ですね。 まあどこかで諦めることにはなりますよ。
Avatar
ResultくらいならSwift 3サポートも頑張れなくはないと思います(リソースさえあれば……)
Avatar
Kishikawa Katsumi 10/1/2018 10:46 AM
例えば良くある例でいうとflatMap => compactMapの書き換えとか5が出るまでやりたくない感じじゃないですか?
10:47 AM
下のバージョンに向けてはエイリアス的なものを提供するっていうのもアリですけど。
Avatar
そういうAPIの差は、僕も実際によくエイリアスで対応してますね。
Avatar
@tarunon さんに教えてもらったメモリリークテストのヘルパー実装してみました! https://github.com/Kuniwak/UIKitTestable/blob/e977532c81a97998a4c776b2d1b70c167eb73841/UIKitTests/UIKitTests/MemoryLeakDetector.swift レポートもそこそこ親切にできたので、いい感じになりそうです: https://github.com/Kuniwak/UIKitTestable/blob/master/UIKitTestableTests/UIKitTestableTestsTests/MemoryLeakDetectorTests.swift 次は、UIViewController に適用するパターンですね。UIViewController の viewDidDisappear あたりまでを実行してから、UIViewController を解放するイメージで考えてますが、検証のタイミングが若干難しそうな気配が…
Make project using UIKit testable. Contribute to Kuniwak/UIKitTestable development by creating an account on GitHub.
Make project using UIKit testable. Contribute to Kuniwak/UIKitTestable development by creating an account on GitHub.
Avatar
おっ見てみます👀
5:04 PM
因みに何ですけど
5:04 PM
lazy varが.storageかつOptionalに化けるとか、Optionalを探索するのにsomeが生えるとかで問題があったりするので
5:04 PM
意外とやる事は多いw
Avatar
そのケースは考えてなかったw
5:05 PM
Optional は Mirror#children で拾えそうな気がしてるのですが、そう簡単な感じではなかった感じですか?
Avatar
拾えるんですけど、パスを生成するときにMirrorを雑に参照してlabel使っちゃうと (edited)
5:06 PM
雑なパスになってしまいますw
Avatar
あー、なるほど。理解しました
5:07 PM
しかし Mirror 側から lazy かどうかを判定するすべはなさそうなので、some が生えちゃうのは仕方なさそうなイメージですね
Avatar
いや、判定できます
5:07 PM
labelがfoo.storageみたいになるのでこれがlazyの本体 (edited)
Avatar
お、それは初めてみました。ちょっと試してみますね
5:12 PM
(indirect.storage -> some -> value)
5:12 PM
あー、なるほどw
Avatar
寝ながらデータ構造でひとつ直した方がいいところに気づいたので後で直します。循環参照の参照経路をだすだけより、リークしたオブジェクトの型や文字列表現、与えられたオブジェクトからの参照経路も併せて出した方がいい気がします
Avatar
参考までに弊社Internalのものの出力ですが
Avatar
お、見たいです!
Avatar
Found 2 object leaking children[0].viewModel: SomeViewModel children[0].textField: UITextField
2:48 AM
こんな感じで出てきます
Avatar
おー、確かにこっちの方が直感的ですね。真似します
2:50 AM
Reference.Path.Component を enum にすればいけるかな
2:53 AM
このメモリリーク判定機能、単体で切り出した方が有益そうな気配するな… UIKit 依存のあるプロジェクトにいれるのはもったいない
Avatar
Mirrorの変更で死ぬ場合があって(ついこの間死んだ)、メンテするのキビシイので会社のossとして出すのは難しいなと思っていました。出したい気持ちもあるんですがw
2:56 AM
単体の方が有益はそれはそうと思います
Avatar
Mirror は頻繁に死にますねw 私も頻繁に苦しめられてます https://github.com/Kuniwak/MirrorDiffKit/blob/master/Sources/TupleRepresentationDetector.swift
Graduation from messy XCTAssertEqual messages. Contribute to Kuniwak/MirrorDiffKit development by creating an account on GitHub.
Avatar
Summary: Found 2 leak objects Leaked objects: 0: Description: Node Type: Any Location: .linkedNodes[0] 1: Description: Node Type: Any Location: (root) Circular reference paths: 0: .linkedNodes[0].linkedNodes[0]
10:53 AM
いい感じになってきました
Avatar
iPhone5(c)などの32 bit CPUの端末の実機 でクラッシュするコードを発見したっぽいのですが既知のバグだったりしますか? Enumのassociated valueに沢山プロパティが生えたオブジェクトを渡して参照するとクラッシュするっぽい挙動です (Xcode9.4でも起きてたのですがdebugビルドでしか再現してなくて、Xcode10でreleaseビルドでも再現するようになり発覚しました...) https://gist.github.com/ainame/04b07621112484b1d6a8b2bb791fcf74
Crashed on iPhone5(c). GitHub Gist: instantly share code, notes, and snippets.
Avatar
完全にやばそう
10:38 AM
Optional壊れた話ってもしかしてこれかな
Avatar
EXC_BAD_ACCESSでメモリ周りが壊れているっぽい
Avatar
お〜
Avatar
compactMapValuesの説明書つくった https://twitter.com/d_date/status/1049618894585921537
資料です。ありがとうございました! https://t.co/OTHQuJnFmn #potatotips
👍 3
Avatar
長さが一定より小さくならない配列の型をつくって遊んでたんですが、gyb 結構簡単で便利ですね https://gist.github.com/Kuniwak/5296bef20ae923bf0c96a70d7bd16c07
GitHub Gist: instantly share code, notes, and snippets.
9:44 AM
そしてこの ArrayLongerThan1 とか ArrayLongerThan3 とか普通に便利でした
9:47 AM
悲しいのは Sequence に適合できないことですね… ArrayLongerThanN の map や enumerated は長さが変わらないことがわかっているので、戻り値を ArrayLongerThanN にしたいんですが、こうすると Sequence の定義と衝突するんですよね
9:48 AM
一応、Sequence として扱いたい用途のために ArrayLongerThanN.sequence があるのですが、まああんまりいけてない…
Avatar
@Kuniwak この前↓について話してたときって Kuniwak さんいましたっけ? https://forums.swift.org/t/implement-nonempty-collections/14246
https://github.com/pointfreeco/swift-nonempty — For when a collection is guaranteed to have at least one value.
Avatar
げ、すでにそんなものが
Avatar
swift evolution ではこれは Pitch レベルだと思います。 (edited)
1:26 PM
リンク先のライブラリは SequenceCollection ?)を型パラメータにとるのがおもしろいですね。 https://github.com/pointfreeco/swift-nonempty (edited)
🎁 A compile-time guarantee that a collection contains a value. - pointfreeco/swift-nonempty
1:27 PM
🎁 A compile-time guarantee that a collection contains a value. - pointfreeco/swift-nonempty
1:27 PM
おや、自分ができなかったことをやっている…
1:29 PM
戻り値の型だけ違うメソッドって定義できないという認識だったんですが、どうして Sequence.map と戻り値だけが異なる map を定義できるだろう
Avatar
衝突はしますが、できるとは思います。多分オーバーロードになるのかと。
Avatar
あ、これできるんですか…
Avatar
Kishikawa Katsumi 10/13/2018 1:29 PM
呼び出すときに区別する必要があるので使い勝手は良くないですがオーバーロードできます。
Avatar
てことは、自分のときの型エラーは init の誤判定な気がしてきました
1:30 PM
あー、なんかわかりました。これ NonEmpty のネストでやられそう
Avatar
僕も Image<Element>: Sequence を作ってますが Image to Imagemap ができてるので。 Sequence 由来のと曖昧になりそうな気がするんですが、 Image to Image の方が優先されてますね。
1:31 PM
protocol のデフォルト実装は優先順位が低いのかな??
Avatar
これ、NonEmpty の C 側に NonEmpty 入れると動きがやばくなりそうな予感が
Avatar
Sequencemap とかついてるのほんと微妙ですよねぇ。 makeIterator だけの純粋な Sequencemap とかを分離してほしい・・・。
Avatar
わかります
1:33 PM
そしてついでに map の戻り値を [T] じゃなくて Self にしてほしい(過激派)
Avatar
これ、NonEmpty の C 側に NonEmpty 入れると動きがやばくなりそうな予感が
その場合は Collection として扱われるので Collectionmap が呼ばれるんじゃないですか?↓とかですよね? public func map<T>(_ transform: (Element) throws -> T) rethrows -> NonEmpty<[T]> { return try NonEmpty<[T]>(transform(self.head), self.tail.map(transform)) }
Avatar
ですです
1:34 PM
なので、2要素以上配列とかを扱うとき相当不便になるのではないかと
Avatar
そしてついでに map の戻り値を [T] じゃなくて Self にしてほしい(過激派)
これ [Element][T] に変換するんで Self じゃなくて、 higher-kinded type がないとできないんですよねぇ・・・。
Avatar
確かに…
Avatar
2要素以上配列とかを扱うとき相当不便になるのではないかと
ここがよくわかってないです・・・
Avatar
NonEmpty を使った2要素以上配列は下のようになるという予想をしていて、 NonEmpty<Element, NonEmpty<Element, C>>
1:38 PM
あ、いや、なんとかなるのかな… ちょっと前に出くわしたエラーの原因に別の心当たりができました
Avatar
NonEmpty<Element, NonEmpty<Element, C>> は考えてませんでしたが(それぞれの struct を実装するイメージしてました)、多分うまくいきそうな気がします。その場合だけ init(Element, Element, C)extension で生やせると便利そうですね〜。
Avatar
まさに自分の実装は typealias ArrayLongerThan2<Element> = PrefixedArray<Element, PrefixedArray<Element, PrefixedArrayEnd<Element>>> となっていて、これで flatMap とかの実装が衝突して死んだみたいなエラーに出くわして、ウワァ、ダメなのかみたいに引き返したんです (edited)
1:43 PM
他にもいくつか不可解なエラーに出くわしていて(typealias だと動かないが、typealias を展開したものを使うと動くみたいな)、いろいろと辛い感じではありました
1:44 PM
あ、safeFirst 、なるほど。。。
1:44 PM
これも衝突してましたが、こういう風に逃げたのか…
1:44 PM
1:45 PM
いや、定義できるんですね、これちょっと前にどこかのチャンネルで話題になってた気がする
Avatar
@swift-4.2.4 protocol NonEmptySequence: Sequence { var first: Element { get } } struct NonEmptyArray<Element>: NonEmptySequence { private var array: [Element] init(_ array: [Element]) { precondition(!array.isEmpty) self.array = array } var first: Element { return array[0] } func makeIterator() -> Array<Element>.Iterator { return array.makeIterator() } } (edited)
Avatar
no output (edited)
Avatar
@swift-4.1.3 protocol NonEmptySequence: Sequence { var first: Element { get } } struct NonEmptyArray<Element>: NonEmptySequence { private var array: [Element] init(_ array: [Element]) { precondition(!array.isEmpty) self.array = array } var first: Element { return array[0] } func makeIterator() -> Array<Element>.Iterator { return array.makeIterator() } } (edited)
Avatar
no output (edited)
Avatar
@swift-4.0.3 protocol NonEmptySequence: Sequence { var first: Element { get } } struct NonEmptyArray<Element>: NonEmptySequence { private var array: [Element] init(_ array: [Element]) { precondition(!array.isEmpty) self.array = array } var first: Element { return array[0] } func makeIterator() -> Array<Element>.Iterator { return array.makeIterator() } }
Avatar
no output
Avatar
あれ? firstSequence じゃなくて Collection なのか。
Avatar
あ、そうですね。Sequence は makeIterator しか要求しないです
Avatar
extension でも生えてないんですね。 map とかは生えてるのに・・・。
2:40 PM
@swift-4.1.3 protocol I { init() } protocol P { associatedtype A: I } extension P { var bar: A? { return nil } } protocol Q: P {} extension Q { var bar: A { return A() } } struct S<T: I>: Q { typealias A = T let value: T var bar: T { return value } } extension Int: I { init() { self = 0 } } let s = S(value: 42) print(s.bar) (edited)
Avatar
42 (edited)
Avatar
safeFirst って何ができなかったんですか? Optional を非 Optional で満たすことができなかったとかではなく??
2:46 PM
これは 4.2 でもできない。 @swift-4.2.4 protocol P { associatedtype A var a: A? { get } } struct S<T>: P { typealias A = T let value: T var a: T { return value } } let s = S(value: 42) print(s.a)
Avatar
exit status: 1 with stderr:<stdin>:7:8: error: type 'S<T>' does not conform to protocol 'P' struct S<T>: P { ^ <stdin>:10:9: note: candidate has non-matching type 'T' var a: T { return value } ^ <stdin>:4:9: note: protocol requires property 'a' with type 'S<T>.A?'; do you want to add a stub? var a: A? { get } ^
Avatar
あれ、不思議ですね。なんであのコードでコンパイルが通るんだろう…
Avatar
taru non さんからアイデアを教えていただいた Memory Leak のやつ、それなりに形になってきました https://github.com/kuniwak/memoryleaktestkit
Contribute to Kuniwak/MemoryLeakTestKit development by creating an account on GitHub.
2:52 AM
どうでもいいんですが、Hacker News でいう ShowHN みたいなチャンネルがあるとこういうの投げやすいですね…
Avatar
Hacker News でいう ShowHN
を知らないのでよくわからないですが、なんてチャンネル名があればいいですか?
2:53 AM
チャンネル概要(チャンネル名の右に出る文字列)も、もしあったら指定してくれればつけます。
Avatar
ShowHN は、自分の作った成果物を Hacker News で投稿する場所なんですよね https://news.ycombinator.com/showhn.html
2:55 AM
ただ、論点もあると思っています
Avatar
なるほど。じゃあそのままのコンテキストなら #show ですかね、でも知らない人に伝わりにくいかも?
Avatar
はい
2:55 AM
例えば、成果物を適当なチャンネルに投げてもそんなうざくないなら、チャンネル作らなくても OK だと思いますね
Avatar
話題になるし普通にむしろ歓迎だと思います
Avatar
であれば、それ用のチャンネルはいらない気がしますね。例えば Metal 系のライブラリとかなら #metal とかに投げたほうがより良いと思いますし
Avatar
OKです
Avatar
Kuniwakさんのリークテストは、detectLeaksで参照グラフをスキャンして、循環を見つける設計なんですね
Avatar
いえ、循環は純粋にデバッグのための付加情報です
Avatar
createSomething() の中でリークしていても見つけられるんです?
2:58 AM
let target から到達できなかったらどうにもならない気が。
Avatar
その場合はちょっと変わった表示が出るはずです
2:59 AM
なお、やり方としては、オブジェクトグラフをたどっていって、 それぞれを weak で写しとって、weak の中身がちゃんと回収されているかみるという感じですね
2:59 AM
なので、回収自体は Swift の RC の仕組みに乗っかってます
Avatar
むむ (edited)
Avatar
循環参照が見つからない場合は 2 つの可能性が考えられるので、次のようなエラーメッセージが出ます: https://github.com/Kuniwak/MemoryLeakTestKit/blob/master/Sources/MemoryLeakTestKit/LeakedObject.swift#L47-L51
Contribute to Kuniwak/MemoryLeakTestKit development by creating an account on GitHub.
3:01 AM
Contribute to Kuniwak/MemoryLeakTestKit development by creating an account on GitHub.
3:02 AM
あ、テストケースのコメント間違ってる。。。
Avatar
リークするかどうか検査したい関数があるとして、 1. オブジェクトを全部スキャンする 2. 検査したい関数を実行する 3. スキャンしてあるweak参照の先に生きてるオブジェクトが無いことを確認する (edited)
3:02 AM
この3ステップが必要だと思うんですけど
3:02 AM
let target = createSomething() let memoryLeaks = detectLeaks(target) XCTAssertTrue( memoryLeaks.leakedObjects.isEmpty, memoryLeaks.prettyDescription )
3:03 AM
↑のUsageだと、createSomethingが「検査したい関数」で、detectLeaksがスキャンだとすると、 createSomethingの中で発生したリークが、わからないと思ったのですが、なにか僕が勘違いしてますか (edited)
Avatar
えと一点確認させて欲しいのですが、createSomething のなかで発生したリークは、具体的にどのような感じを意図されていますか
3:04 AM
可能ならこういうオブジェクトグラフですみたいなのがあれば
Avatar
class Cat { var parent: Cat? } func createSomething() -> Cat { let cat1 = Cat() let cat2 = Cat() let cat3 = Cat() cat2.parent = cat3 cat3.parent = cat2 return cat1 }
Avatar
あるいは、RC での回収タイミングの話です?実はちょっとそこ自信のない(ただしテストは通ってしまった)場所ではあります
3:06 AM
なるほど、そのケースはテストを見るかぎり捉えられています
Avatar
やってみます
3:09 AM
これ README 間違ってますね
3:09 AM
💀
3:10 AM
え、しかもテストも妙な感じだ。。。
3:11 AM
Summary: Found 0 leaked objects Leaked objects: (empty)
3:11 AM
leak してない、、、だと?
3:11 AM
あ、そりゃそうだ
3:11 AM
cat1 から cat2 と cat3 を辿れないので、そもそも参照を得られてないからですね
Avatar
はい、そうなると思ってて。
Avatar
なので、この場合は cat2 と cat3 の leak は捉えられないです
3:12 AM
戻り値のオブジェクトから辿れるものだけがわかる、みたいな感じでしょうか
Avatar
そうすると検出できるリークって、「targetから到達できて循環してる部分」になると思うんですが
3:17 AM
なお、やり方としては、オブジェクトグラフをたどっていって、 それぞれを weak で写しとって、weak の中身がちゃんと回収されているかみるという感じですね なので、回収自体は Swift の RC の仕組みに乗っかってます
1. weakで写し取る 2. Swiftのしくみで回収された後で・・・ 3. 写し取ったweakがnilになっているか確かめる
Avatar
そうすると検出できるリークって、「targetから到達できて循環してる部分」になると思うんですが
あー、これは正確にもうちょっとだけ範囲が広いです。というのも、さっきの cat2 や cat3 から cat1 への参照があった場合、cat 1 からの参照に循環参照はありませんが、cat1 が回収されないので
3:18 AM
これは検知できます
Avatar
あ、なるほど。
Avatar
ただ、概ねは omochi さんのご理解で正しいとは思います
Avatar
class Cat { var parent: Cat? var child: Cat? } func createSomething() -> Cat { let cat1 = Cat() let cat2 = Cat() let cat3 = Cat() cat2.parent = cat3 cat3.parent = cat2 cat2.child = cat1 return cat1 }
3:19 AM
この場合ですね
3:21 AM
あら
3:22 AM
detectLeaksはオブジェクトを受け取ると思ってたけど () -> T を受け取るのか。
3:23 AM
これ README 間違ってますね
そういうことか
3:24 AM
クロージャで受けてるから、detectLeaksの内部で、 「weakで全部保持」 「検査したいユーザコードの実行」と「Swiftのスコープ解放の完了待ち」ができて 「weakで保持したもののチェック」 ができるのか。
3:24 AM
Tを受け取ると思っていたので引っかかっていたけど納得しました
Avatar
そうなんですよ、すみませんでした。。。
Avatar
README 直しました 🙇
🙂 1
Avatar
let json = """ [{ "id": 0, "mode": "high" },{ "id": 1, "mode": "middle" },{ "id": 2, "mode": "moddle" },{ "id": 3, "mode": "low" }] """ enum Mode: String, Decodable { case high case middle case low } struct Object: Decodable { let id: Int let mode: Mode } let objects = try! JSONDecoder().decode([Object].self, from: json.data(using: .utf8)!) print(objects) ↑のような時に、Jsonのデコードを失敗とせずid:0,1,3のObjectの配列を返すような実装がしたい場合Arrayのラッパーみたいなものを書く感じになるのでしょうか?
Avatar
Mode を optional にして compactMap で再構成するのはめんどいです?
Avatar
enum Mode: String, Decodable { case high case middle case low } struct Object: Decodable { let id: Int let mode: Mode? } do { let decoder = JSONDecoder() let data = json.data(using: .utf8)! let objects = try decoder.decode([Object].self, from: data).compactMap({ $0.mode != nil }) print(objects) } catch { print(error) }
6:43 AM
こういうことですか? どうもキーがあるとModeのDecodeで失敗するとthrowされてしまってそうです…
Avatar
@swift-4.2.4 import Foundation let json = """ [{ "id": 0, "mode": "high" },{ "id": 1, "mode": "middle" },{ "id": 2, "mode": "moddle" },{ "id": 3, "mode": "low" }] """ enum Mode: String, Decodable { case high case middle case low } struct Object: Decodable { let id: Int let mode: Mode? enum CodingKeys: CodingKey { case id, mode } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.id = try container.decode(Int.self, forKey: .id) self.mode = try? container.decode(Mode.self, forKey: .mode) } } let objects = try! JSONDecoder().decode([Object].self, from: json.data(using: .utf8)!).filter { $0.mode != nil } print(objects)
Avatar
[main.Object(id: 0, mode: Optional(main.Mode.high)), main.Object(id: 1, mode: Optional(main.Mode.middle)), main.Object(id: 3, mode: Optional(main.Mode.low))]
Avatar
ありがとうございます!いけました、CodingKeyでマニュアル操作しないといかんのですね 何かCompactDecodableやCompactJSONDecoderのようなアプローチで実装できたら使いやすいかなと思ったのですが良い方法が思い浮かばず
Avatar
@noppe @swift-4.2.4 import Foundation let json = """ [{ "id": 0, "mode": "high" }, { "id": 1, "mode": "middle" }, { "id": 2, "mode": "moddle" }, { "id": 3, "mode": "low" } ] """ enum Mode: String, Decodable { case high case middle case low } struct Object: Decodable { let id: Int let mode: Mode init(id: Int, mode: Mode) { self.id = id self.mode = mode } } struct FailableBox<T> : Decodable where T : Decodable { init(from decoder: Decoder) throws { self.value = try? T.init(from: decoder) } var value: T? } let objects: [Object] = try! JSONDecoder() .decode([FailableBox<Object>].self, from: json.data(using: .utf8)!) .compactMap { $0.value } print(objects)
Avatar
[main.Object(id: 0, mode: main.Mode.high), main.Object(id: 1, mode: main.Mode.middle), main.Object(id: 3, mode: main.Mode.low)]
Avatar
@noppe こんなやりかたはどうでしょう
Avatar
元のモデルのインターフェイス変わらないので良さそうです!
Avatar
もしJSONツリー全体でそのような制御をしたい場合は、JSONDecoderを自作しちゃうのが早いと思います。
Avatar
そこ気になっていたのですが、JSONDecoder自作でこの辺りって制御できるのでしょうか?
Avatar
できると思うけどやってみないとはっきりといえないですね、確信度70%
Avatar
ここ出来ると使い勝手良さそうなので作ってみますー!ありがとうございます!
Avatar
他にも、デフォルトのJSONEncoderだと、
12:22 PM
Optionalがnoneになってるときはキーごと消えてしまうけど
12:22 PM
キーは常に出力して null を与えるとかも
12:22 PM
自作だとできるんじゃないかな
Avatar
あー、肝心のJSONをデコードしている部分はInternalなんですね
Avatar
ですね。Codableが提供するのは一般的な構造へのマッピングAPIだけで
1:21 PM
JSONとしてどうなるかっていうのはCodableと関係なくって
1:21 PM
そっちはJSONEncoderのoutputFormatプロパティとか、そういう個別の設定機能で調整するしかない
Avatar
なるほど、カスタマイズ性が許容されている箇所以外を弄ろうとするといきなりやること多くなってしまうんですね
Avatar
ですね
1:24 PM
できることならそういうのは要件ごと踏み倒して対応しないのがコスパ良い
1:24 PM
が、JSON使うシーンはだいたい外部システムの都合があったりするので・・・ (edited)
Avatar
Codable側で個別に対応するのが良さそうですね CodingKeysとか諸々バチっとハマるJSONなら書くことがほぼ無くなる設計になっているから、イニシャライザ一つ書くのにも楽に出来無いかと思ってしまいがちですねこの辺は (edited)
Avatar
ですね、キーのsnakeCase化とか、微妙に小回りがきいたりもする。
Avatar
@swift-4.2.4 import Foundation enum Result { case win case lose case none } var results: [Int : Result] = [:] results[0] = .win results[1] = .lose results[2] = .none if results[2] == nil { print("result.2 is nil") }
Avatar
result.2 is nil
Avatar
知らなかった
Avatar
Optionalのnoneだと思われてるわけですね、これは危険だ… 😱
Avatar
@swift-4.2.4 import Foundation enum Result { case win case lose case none } var results: [Int : Result] = [:] results[0] = .win results[1] = .lose results[2] = .some(.none) if results[2] == nil { print("result.2 is nil") }
Avatar
no output
Avatar
Optional暗黙変換の悲劇だ
Avatar
一瞬意味わからなかったけど Dictionarysubscript-> Value? だからかぁ。
1:12 AM
getset で、 getOptional だけど setOptional でなくしたいケース、ときどきある気がしてる。
Avatar
@swift-4.2.4 enum Result { case win case lose case none } func foo(_ resultOrNil: Result?) { print(resultOrNil as Any) } foo(.win) foo(.lose) foo(.none) foo(Result.none)
Avatar
Optional(main.Result.win) Optional(main.Result.lose) nil Optional(main.Result.none)
Avatar
Dictionaryの例はインパクトがあるけど、それ以外でも普通に起こるので、enumのメンバに none は避けるようにした方が無難そうですね。 (edited)
Avatar
暗黙変換の歪みは色んなところに出てきますねぇ・・・
Avatar
Kishikawa Katsumi 10/21/2018 1:41 AM
Dictionaryの例はたぶん削除が呼ばれてるんですよね。 削除はnilリテラルだけを対象にするのが良いと思うんですよね。
Avatar
削除は removeValue(forKey:) だけにして、 subscript set を非 Optional にしてほしいです・・・。
Avatar
Kishikawa Katsumi 10/21/2018 1:43 AM
^ それがベスト。
1:44 AM
そもそも削除って便利構文を用意しなければならないほどの頻度でやらないんですよね。
Avatar
ただ、たとえ今から set で非 Optional 化できるようになっても、互換性の問題で Dictionarysubscript set をなくすのってできないかもですね😂
1:45 AM
僕は、 dict[key] = nil って便利構文なんじゃなくて、 subscript の仕様制約上 set を非 Optional にできなかったため仕方なくついてるものだと思ってました。 (edited)
Avatar
Kishikawa Katsumi 10/21/2018 1:46 AM
なるほど。確かにget/setのペアで型がそろってないとダメですよね。
😭 1
1:50 AM
互換性を考慮すると、現在nilリテラルの代入で削除以外が起こることはないはずだから、nilリテラルの代入以外のOptionalの代入をコンパイラか別のLinterが警告する というのが妥当か。
Avatar
printOptional 警告はあるから、 Dictionarysubscript set でもその線が妥当そうですね。
Avatar
Kishikawa Katsumi 10/21/2018 1:53 AM
話外れちゃうけどString Interpolationの警告は良いけどprint()の警告は別にいらないですけどね。
Avatar
確かに不便なだけのことが多いですね。 String Interpolation の方は Optional(2018)年 問題回避に役立ちますけど。
1:56 AM
String Interpolation も、僕は CustomStringConvertible 以外できなくしちゃってもいいと思うんですよね。
Avatar
Kishikawa Katsumi 10/21/2018 1:56 AM
print()の話で思いついたけど、nilを受け取れるようにするしかないけど正常ケースとしてはあまり受け取りたくない/考えてない、というケースに警告を出せる @nilWarning 属性みたいなものをつけられるといいのか?
Avatar
そうですね。 Optional 暗黙変換問題はどこででも起こりうるので、そういうのがあると良いのかも?
Avatar
Kishikawa Katsumi 10/21/2018 1:57 AM
コンパイラの範疇を超えてるかな、Linterでやれって感じもする。
Avatar
うーん、でも警告を出したいかは API によるから、 @discardableResult とかと同じで Attribute 付けるとかしないとできなくないですか?
Avatar
Kishikawa Katsumi 10/21/2018 1:59 AM
あ、それはそうですね。
1:59 AM
メソッドに何らかの表明する手段が必要。。。コンパイラでやってくれるといいですね。
2:00 AM
nil以外にも「外部の入力そのまま渡してるよ」っていう警告を出したりとか言語やLinterによってあるから、そういう仕組みかな。 型以外の情報で狭める表明。
Avatar
@swift-4.2.4 -frontend -repl enum Result { case win case lose case none } let result: Result? = .none これは暗黙変換ではなく Optional<Result>.none を入れてるだけですよね。
Avatar
// result : Result? = nil
Avatar
そっちは暗黙変換じゃないですが、 .some の方が暗黙変換で、それと並べると .none も同じように見えてしまうという問題かと思います。
👍 1
Avatar
@swift-4.2.4 import Foundation enum Computer { case win case mac } enum Result { case win case lose case none case some(Computer) } func foo(_ resultOrNil: Result?) { print(resultOrNil as Any) } foo(.win) foo(.lose) foo(.none) foo(.some(.win)) print("") foo(Result.some(.win))
Avatar
Optional(main.Result.win) Optional(main.Result.lose) nil Optional(main.Result.win) Optional(main.Result.some(main.Computer.win))
Avatar
まあこんなことになるのは少なそうだけど 🙂
Avatar
caseに乗ってるassoc valueがNeverだったらswitchにそのcaseなくてもコンパイル通るの初めて知った enum Hoge { case waiwai case mu(Never) } let hoge = Hoge.waiwai switch hoge { case .waiwai: print("わいわい") }
😮 2
Avatar
↓ですね。 Result<Foo, Never>switchcase .failure 書かなくても網羅的になるはず。 https://discordapp.com/channels/291054398077927425/291054454793306112/336463567039496192
Avatar
大昔に議論されてた。
Avatar
検索したら色々出てきて楽しいです。
Avatar
正規表現書いてるとRawString早く欲しくなるなあ
Avatar
Kishikawa Katsumi 10/25/2018 4:21 AM
"([0-9a-fA-F]+)\\.\\.([0-9a-fA-F]+);([a-zA-Z]+)" そうですねえ。
Avatar
@ikesyo ↓の swiftenv の 4.2 サポート版がリリースされないままなのって何か理由があるんですか? https://github.com/kylef/swiftenv/commit/a949ff6ab8d1386f1bc99219da1ba860ea7de35a
👌🏼 1
Avatar
反応遅れました💦 特に理由はない気がします。kylefがやる気になったらリリースなのかも。
🙏 1
12:28 AM
これがなくてもswiftenv-api経由で4.2の情報は取られてダウンロードはできるはずではありますね
Avatar
↓のようなパターンで、 ielement の片方を let 、片方を var にする方法ってありますか? let array = [2, 3, 5] for var (i, element) in array.enumerated() { print("\(i): \(element)") }
9:01 AM
普通にできた。
Avatar
omochimetaru 11/8/2018 9:01 AM
え、できました?
Avatar
@swift-4.2.4 let array = [2, 3, 5] for (i, var element) in array.enumerated() { element += 1 print("\(i): \(element)") }
Avatar
0: 3 1: 4 2: 6
Avatar
omochimetaru 11/8/2018 9:02 AM
@swift-4.2.4 let array = [2, 3, 5] for (i, var element) in array.enumerated() { i += 1 element += 1 print("\(i): \(element)") }
Avatar
exit status: 1 with stderr:<stdin>:4:6: error: left side of mutating operator isn't mutable: 'i' is a 'let' constant i += 1 ~ ^
Avatar
omochimetaru 11/8/2018 9:02 AM
ほんとだ。
Avatar
これって、普通の変数/定数宣言ではできない?
Avatar
omochimetaru 11/8/2018 9:03 AM
なんか似たようなことをやろうとしてできなかったことがあった気がしたけどなんだろう・・・
Avatar
あと、 Optional Binding とか。
Avatar
omochimetaru 11/8/2018 9:03 AM
if var hoge = hogeOpt はいけます
Avatar
それはできるけど、
9:03 AM
タプルの片方だけ var
Avatar
omochimetaru 11/8/2018 9:04 AM
そうそう。タプルになっちゃうから無理という気がしてた。
Avatar
↓これしたい。 (let a, var b) = (2, 3)
Avatar
omochimetaru 11/8/2018 9:05 AM
そうだ、それだ
Avatar
var (x, y) = (0, 0) y = 190 print(x, y) この形だとx is never mutatedの警告すら出ないですね
Avatar
え?そうだっけ? > @t.ae
9:06 AM
それなら諦めて var にするのがいいのかな。
Avatar
僕の手元では少なくとも出てないですね
Avatar
let x: Int var y: Int (x, y) = (0, 0) 一応これは可能です。
9:10 AM
あと、statement condition であれば、 let point: (Int, Int)? = nil if case (let x, var y)? = point { print(x, y) }
Avatar
@rintaro なるほどー!ありがとうございます!
Avatar
static subscript って作れないのか。 @swift-4.2.4 struct S { static subscript(i: Int) -> Int { return i + 1 } }
Avatar
exit status: 1 with stderr:<stdin>:3:12: error: subscript cannot be marked 'static' static subscript(i: Int) -> Int { return i + 1 } ~~~~~~~^
Avatar
omochimetaru 11/9/2018 3:49 AM
へえ〜
Avatar
Replace this paragraph with a description of your changes and rationale. Provide links to external references/discussions if appropriate. Resolves SR-NNNN.
1:44 AM
クラスメタデータが動的に初期化されるようになるかも。 Windows対応関係でこの手のメタデータのリンクについてずっとトラブってたみたいなんだけど、 その辺の対応?の中で、Windowsをそうしてその次は他でもそうするってslavaが書いている。 定数として定義が吐き出されないケースが増えるとLLVM-IRが読みにくくなりそう? (edited)
Avatar
VWTを埋めるだけならほとんどの部分は静的なテンプレートで済みそう
2:13 AM
あー、でもVWTに依存してる奴があるのか…
Avatar
同期して初期化する関数にラップされるだけで、テーブルの中身自体は定数に出てるみたいな感じならまあ。
Avatar
type metadata自体のオフセットがすでにfull type metadataからズレてるのに、さらにテンプレートでズレると読むのがしんどそう
Avatar
こんばんは〜 class Container<Content> { init(a: Content) { // イニシャライザA fatalError() } init<T>(b: T) where T == Content { // イニシャライザB self.init(a: b as! Int) } } (edited)
11:37 AM
@swift-4.2.4 class Container<Content> { init(a: Content) { fatalError() } init<T>(b: T) where T == Content { self.init(a: b as! Int) } }
Avatar
exit status: 11 with stderr:<stdin>:7:27: error: same-type requirement makes generic parameters 'T' and 'Content' equivalent init<T>(b: T) where T == Content { ^ #0 0x000000000410ac94 PrintStackTraceSignalHandler(void*) (/usr/bin/swift+0x410ac94) #1 0x0000000004108b22 llvm::sys::RunSignalHandlers() (/usr/bin/swift+0x4108b22) #2 0x000000000410ae42 SignalHandler(int) (/usr/bin/swift+0x410ae42) #3 0x00007fdc32623390 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390) #4 0x00000000016b1b09 swift::FunctionType::get(swift::Type, swift::Type, swift::AnyFunctionType::ExtInfo const&) (/usr/bin/swift+0x16b1b09) #5 0x00000000017fde74 swift::GenericFunctionType::substGenericArgs(swift::SubstitutionMap const&) (/usr/bin/swift+0x17fde74) #6 0x00000000017fdd02 swift::GenericFunctionType::substGenericArgs(llvm::ArrayRef<swift::Substitution>) (/usr/bin/swift+0x17fdd02) #7 0x000000000147abe0 swift::UncurriedCandidate::UncurriedCandidate(swift::ValueDecl*, unsigned int) (/usr/bin/swift+0x147abe0) #8 0x000000000147f346 swift::CalleeCandidateInfo::CalleeCandidateInfo(swift::Type, llvm::ArrayRef<swift::constraints::OverloadChoice>, bool, swift::constraints::ConstraintSystem&, bool) (/usr/bin/swift+0x147f346) #9 0x0000000001466f19 (anonymous namespace)::FailureDiagnosis::visitApplyExpr(swift::ApplyExpr*) (/usr/bin/swift+0x1466f19) #10 0x000000000144d4d6 swift::ASTVisitor<(anonymous namespace)::FailureDiagnosis, bool, void, void, void, void, void>::visit(swift::Expr*) (/usr/bin/swift+0x144d4d6) #11 0x0000000001446642 swift::constraints::ConstraintSystem::diagnoseFailureForExpr(swift::Expr*) (/usr/bin/swift+0x1446642) #12 0x000000000144cb76 swift::constraints::ConstraintSystem::salvage(llvm::SmallVectorImpl<swift::constraints::Solution>&, swift::Expr*) (/usr/bin/swift+0x144cb76) #13 0x0000000001352138 swift::TypeChecker::solveForExpression(swift::Expr*&, swift::DeclContext*, swift::Type, swift::FreeTypeVariableBinding, swift::ExprTypeCheckListen
Avatar
なんか where T == Content はダメだよって正しいエラーを吐いたあとにセグフォで死ぬのを見つけた
Avatar
b as! Intは変なのでは
Avatar
それは変。
11:38 AM
エラーはちゃんと処理してコンソールに吐いたあとに死ぬのってフェーズ的にはなにで死んでるんでしょうね
11:41 AM
イニシャライザBの中でイニシャライザAを呼び出してる時点でselfの型はContainer<T>に決まっているのでその時点で T しか受けないことが決まっているイニシャライザAに T ではない Int を渡せちゃってる?
11:42 AM
Stack dump: 0. Program arguments: /Applications/Xcode_10_1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -interpret Development/MyPlayground.playground/Contents.swift -enable-objc-interop -sdk /Applications/Xcode_10_1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -color-diagnostics -module-name Contents 1. While type-checking 'init(b:)' at Development/MyPlayground.playground/Contents.swift:6:5 2. While type-checking statement at [Development/MyPlayground.playground/Contents.swift:6:38 - line:8:5] RangeText="{ self.init(a: b as! Int) }" 3. While type-checking expression at [Development/MyPlayground.playground/Contents.swift:7:9 - line:7:31] RangeText="self.init(a: b as! Int)" fish: 'swift Development/MyPlayground.…' terminated by signal SIGSEGV (Address boundary error)
11:42 AM
久々にセグフォ引いてテンション上がってしまったよ
Avatar
@swift-main class Container<Content> { init(a: Content) { fatalError() } init<T>(b: T) where T == Content { self.init(a: b as! Int) } }
Avatar
swiftNightly BOT 11/16/2018 12:04 PM
exit status: 1 with stderr:<stdin>:7:27: error: same-type requirement makes generic parameters 'T' and 'Content' equivalent init<T>(b: T) where T == Content { ^ <stdin>:8:14: error: cannot invoke 'Container<Content>.init' with an argument list of type '(a: Int)' self.init(a: b as! Int) ^ <stdin>:8:14: note: expected an argument list of type '(a: Content)' self.init(a: b as! Int) ^ <stdin>:7:5: error: designated initializer for 'Container<Content>' cannot delegate (with 'self.init'); did you mean this to be a convenience initializer? init<T>(b: T) where T == Content { ^ convenience <stdin>:8:14: note: delegation occurs here self.init(a: b as! Int) ^
Avatar
正しそう
Avatar
おっ
12:12 PM
なおってんのか
Avatar
for i in 1... { print(i) } これ無限ループになるんですね、終端値無くてもrangeになるんだ
Avatar
無限なんですか?
5:18 AM
2^63-1がでかすぎて、実質無限なだけかも?
Avatar
無限かどうか検証出来てないので実質無限かも
Avatar
あ、違うのか、終端が無いのだから、最大値が定義されていなくて、本当に無限なのかな?
5:20 AM
ちなみにその記法自体は結構便利で func eatBuffer() { self.buffer = Array(self.buffer[self.pos...]) self.pos = 0 } ↑ストリーム処理を書いているときにこれをよくやります
👏 1
Avatar
確かにbytesのlength確認せずに読めるの便利ですね
Avatar
です
Avatar
enumerated()ではないindexが欲しい時にも zip(0..., arraySlice)
Avatar
SwiftLintのルールをSwiftSyntaxを使って実装し直してみたというお話。 https://twitter.com/simjp/status/1065772315189727233 現状のSourceKitを使った場合と同等の速度が出る様になるまでどれくらいかかるかな。 (edited)
tl;dr; Implementing SwiftLint using SwiftSyntax instead of SourceKitten would make it run over 20x slower 😭
Avatar
20倍・・・
Avatar
もう少しマシになったらしい。 https://github.com/realm/SwiftLint/pull/2480
This is a follow-up to #2476 but using SourceKitten's syntaxTree request instead of invoking the swiftc process for each file. Early results are promising but it's still significantly slowe...
12:28 AM
あ、これはswiftcの代わりにSourceKitを使うSwiftSyntaxだ。
12:32 AM
swiftc -> JSON -> SwiftSyntax -> SwiftLintFramework が SourceKit -> JSON -> SwiftSyntax -> SwiftLintFramework になってる。 (edited)
12:33 AM
SourceKitネイティブのデータ構造を使う、現状の SourceKit -> SwiftLintFramework の方が速いのは当たり前だな。 (edited)
12:36 AM
あいや、ネイティブとは違うか。
Avatar
SourceKitとSwiftSyntaxとの間がByteTreeになれば、今SwiftLintが使ってる[String: Any]ベースよりも速くなる可能性があるな。 https://github.com/apple/swift-syntax/blob/master/Sources/SwiftSyntax/ByteTreeDeserialization.swift
SwiftPM package for SwiftSyntax library. Contribute to apple/swift-syntax development by creating an account on GitHub.
Avatar
Package.resolvedをコミットしていないリポジトリにいつの間にかPackage.resolvedが生成されたり、知らないうちにPackage.resolvedが更新されたりしてたりしたのが不思議だったのだけど、SourceKit-LSPを入れたVSCodeでワーキングコピーを開いてたからだった。
Avatar
VSCodeがpackage updateするんですか?
Avatar
SourceKit-LSPがビルドするんじゃないかな。
Avatar
ああ、なるほど。
9:56 AM
普通のSourceKitやXcodeはSwiftPMと一切反応しないから、
9:56 AM
SourceKit-LSPはちょっと違う設計思想になってそう
Avatar
Package.swiftの中身がLinux向けとmacOS向けで依存するライブラリが違ってて、リポジトリにはLinux向けに生成されたPackage.resolvedがコミットされてて、それをmacOSのVSCodeで開くとPackage.resolvedが更新される。
Avatar
それは地味に面倒ですねw
Avatar
Swiftボットに使ってるSwordっていうライブラリがそんなヘンテコな構成になってる。
10:29 AM
脱Swordしたい。
Avatar
いつからか分からないけど、swift-5.0-DEVELOPMENT-SNAPSHOT-…のmacOS版でStringのUTF16関連がぶっ壊れてるぽい。 (edited)
Avatar
違った。Data.withUnsafeBytes(_:)がクロージャへコピーされた一時メモリを指すポインタを渡すように変わったからだった。
Avatar
@swift-4.2.4 import Foundation let data = "test".data(using: .utf8)! dump(data) data.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) -> Void in dump(bytes) } (edited)
Avatar
▿ 4 bytes - count: 4 ▿ pointer: 0x00000000079af0d0 - pointerValue: 127594704 ▿ bytes: 4 elements - 116 - 101 - 115 - 116 ▿ 0x00000000079af0d0 - pointerValue: 127594704 (edited)
Avatar
macOSだとpointerValueが違う。 $ xcrun --toolchain org.swift.5020181225a swift swift_oss_helper command enabled. Welcome to Apple Swift version 5.0-dev (LLVM c351ac7354, Clang aadec4ff83, Swift 5cfc2e7ba9). Type :help for assistance. 1> import Foundation 2. let data = "test".data(using: .utf8)! 3. dump(data) 4. data.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) in 5. dump(bytes) 6. } ▿ 4 bytes - count: 4 ▿ pointer: 0x00007ffeefbff818 - pointerValue: 140732920756248 ▿ bytes: 4 elements - 116 - 101 - 115 - 116 ▿ 0x00007ffeefbffb30 - pointerValue: 140732920757040 (edited)
Avatar
norio_nomura 1/13/2019 6:30 AM
SwiftのCodableは便利ですが、FoundationJSONEncoder, JSONDecoderを使っていて微妙に不便に感じる事があります。自分がいろいろな案件をこなしたり、他人の困り事を聞いてきた上で、...
Avatar
omochimetaru 1/13/2019 6:30 AM
お。ありがとうございます
Avatar
norio_nomura 1/13/2019 6:31 AM
けど、LinkedListObject周りリークしまくりでは。
Avatar
omochimetaru 1/13/2019 6:35 AM
あ、たしかに。nextとprev両方ともstrongじゃダメだ。
Avatar
omochimetaru 1/13/2019 7:46 AM
XCTestにLeaksをかけてみたんですが
7:46 AM
Leaksがサイクル検出をする前にプロセスが終了しちゃうみたいで
7:46 AM
良い方法ってありますか?
Avatar
LinkedListObject.IndexLinkedListObject.Node?にしたらシンプルになるのでは?と試してたのだけど、public typealias Index = Optional<Node>を定義してもCollectionにconform出来ていないと文句を言ってくる。
12:22 PM
Collection.IndexにはOptionalを使えないのかな。
Avatar
extension Optional: Comparable where Wrapped: Comparableになってなかった。
Avatar
そのcomparableが厄介なんですよね
12:13 AM
Collectionに準拠するために実装してあるけど、func <がO(n)になっちゃってる
12:14 AM
O(1)にしろとは書いてなかったから、セーフだと思うけど、気持ち悪い
12:15 AM
たしかにNode?がcondconfしてればIndex型を無くせますね
Avatar
その場合nilが末尾なのであらゆるものより大きくなるのかしら
Avatar
そう
12:16 AM
いまのIndexもプロパティでNode?を持ってて、まさにそうなってるよ
Avatar
ウウーンそのルールをConditionalConformに追加するのは
12:16 AM
今のswiftだとキツそう
12:17 AM
キツいというのは、出来るけど汚染が
Avatar
やるならWrapped==Nodeのピンポイントcondじゃない?
12:17 AM
できないんだっけ?
Avatar
出来るけど、OptionalのComparableが他で拡張できなくなる
Avatar
あーー
Avatar
かと言ってWrappedがComparableの時にnilをmax扱いは
Avatar
Optional:Comparableが占有されちゃうんか。
Avatar
ちょっと乱暴の気がするよね
Avatar
そうしたく無い人もいそうだね。
Avatar
素直にIndex作るのが良いだと思いました
12:18 AM
急がば回れ
Avatar
condconfが進化したら
12:19 AM
その時に削除できるね
Avatar
そういえばcondconf汚染した2つのframeworkをimportしたらどうなるんやろ
12:21 AM
コンパイルエラーかな
Avatar
たしかに
Avatar
NodeSequenceにすると、func <が少し簡単になる。
Avatar
あー、イテレーションしてるところですか?
Avatar
nextfollowingに変えてる。 public static func < (lhs: LinkedListObject.Node, rhs: LinkedListObject.Node) -> Bool { if lhs == rhs || lhs.previous == rhs { return false } for following in lhs where following == rhs { return true } return false }
Avatar
おお素晴らしい
12:26 AM
そこ境界がゴチャゴチャして何回かバグったのです
12:26 AM
ていうかforってwhereつけれたんだ。
Avatar
僕もpublic typealias Index = Node?案はやはり却下という結論に至った。
Avatar
冒頭のpreviousは、隣接してるときは常にo(1)にしたいから?
Avatar
そう。
Avatar
なるほど。
Avatar
func copyoldIndicesに書き戻してるところは、何に使うつもりで書かれてたのですか?
Avatar
removeとかで使ってますよ
12:29 AM
structの方で。
12:29 AM
copyonwriteによるLinkedListObjectのクローンがおきたとき (edited)
12:29 AM
Indexはクローン前のリストのノードになってるので
12:30 AM
クローン先のノードに向けてやらないと続きの処理ができないんです
Avatar
ふむ。
12:35 AM
なるほど、ようやく分かりました。
Avatar
最初その問題に気がついて萎えて値型はやめたんですが、やっぱり値型で使いたかったので、苦渋の設計でそうなってますw
Avatar
norio_nomura 1/14/2019 2:02 AM
NodeCollectionに。 extension LinkedListObject.Node: Collection { public enum Index: Comparable { case node(LinkedListObject.Node), none public static func < (lhs: Index, rhs: Index) -> Bool { switch (lhs, rhs) { case (.node(let lhs), .node(let rhs)): return lhs < rhs case (.node(_), .none): return true default: return false } } init(_ node: LinkedListObject.Node?) { self = node.map(Index.node) ?? .none } var node: LinkedListObject.Node? { guard case .node(let node) = self else { return nil } return node } } public var startIndex: Index { return .node(self) } public var endIndex: Index { return .none } public subscript(position: Index) -> LinkedListObject.Node { guard let node = position.node else { preconditionFailure("Index out of range") } return node } public func index(after i: Index) -> Index { guard let node = i.node, let nextIndex = node.next.map(Index.node) else { return .none } return nextIndex } }
2:03 AM
そしてLinkedListObject.Node.IndexLinkedListObject.Indexに。
Avatar
omochimetaru 1/14/2019 2:13 AM
なるほど・・・?自身からendまでのコレクションとしてNodeだけで振る舞える?
2:13 AM
Bidirectinalは自身で止まっちゃうからダメかな?
Avatar
norio_nomura 1/14/2019 2:15 AM
BidirectionalCollectionLinkedListObjectで対応ですね。 extension LinkedListObject : BidirectionalCollection { public func index(before i: Index) -> Index { checkValidIndex(i) if i == endIndex { return Index(last) } precondition(i != startIndex, "Can't advance before startIndex") return Index(i.node?.previous) } }
Avatar
omochimetaru 1/14/2019 2:17 AM
ふむふむ Node.Index.<はNode.<に転送されてるんですかね
Avatar
norio_nomura 1/14/2019 2:26 AM
ですね。
Avatar
omochimetaru 1/14/2019 2:30 AM
NodeがCollectionになれるアイデアは面白いけど、実装が分断して複雑になってる感じがして好みでは無いなあ
Avatar
norio_nomura 1/14/2019 2:40 AM
そうね。NodeCollectionになれるだけで、Collectionであるメリットは全く無い。Sequenceで十分。
Avatar
norio_nomura 1/14/2019 4:02 AM
copy周りはRangeReplaceableCollectionreplaceSubrange()みたいに、操作に必要なデータも渡してしまう方が良い気がする。
Avatar
omochimetaru 1/14/2019 4:05 AM
copyと同時にミューテートもするってことですか?
Avatar
norio_nomura 1/14/2019 4:12 AM
そう。
Avatar
omochimetaru 1/14/2019 4:13 AM
そこは値型ラッパーの実装パターンを、copy on writeの教科書的な形にしておきたかったのと、それで特に計算量が変わらないからこうしていますね
Avatar
norio_nomura 1/14/2019 4:35 AM
なるほど。
Avatar
omochimetaru 1/18/2019 7:09 AM
XCTestCaseでテストメソッドからSwiftの例外を投げると、
7:09 AM
XCTestのランタイム側でSwiftのエラーがNSErrorに変換されて?から、コンソールにprintされるらしくて
7:10 AM
たとえもとのエラーがCustomStringConvertibleだったとしても、それが表示されないんですけど
7:10 AM
みなさんどうしてます?
Avatar
norio_nomura 1/18/2019 7:37 AM
エラーの内容を見たいときはテストメソッド内でcatchしてる。
Avatar
omochimetaru 1/18/2019 7:38 AM
一時的にdoで包む形に書き換えるってことですか?
Avatar
norio_nomura 1/18/2019 7:40 AM
うん。XcodeのGUIで実行できるならSwift Errorブレークポイントも使う。
Avatar
omochimetaru 1/18/2019 7:49 AM
やはりそれしか無いかあ
Avatar
norio_nomura 1/18/2019 7:54 AM
lldbで特定のレジスタをSwiftのインスタンスとして扱う方法とかあるのかな?
Avatar
omochimetaru 1/21/2019 2:18 AM
Hi everyone, This is my first post here and my first pitch for Swift. Looking forward to the feedback 🙂 Introduction Swift 2 has introduced error handling mechanism, which has been widely adopted since. Shortly after that, XCTest added error catching support to its asse...
2:19 AM
めっちゃタイムリーなスレがたってた。
Avatar
benrimmingtonさんの方法だとダメだけど、 XCTAssertNoThrow の引数にtestBookModelに相当するクロージャー渡すのでもダメなのかな?(試してない)
2:51 AM
XCTAssertNoThrowはそもそもObjectiveCだけみたい
2:51 AM
このスレッドは、これをSwiftでも使えるようにしようって話かな
Avatar
ObjCだけ!そうなのか! 😖
Avatar
omochimetaru 1/21/2019 2:52 AM
#define で定義された式展開マクロみたいですね、これはどうしようもない。
Avatar
XCTAssertNoThrow(try { let book = try BookModel(from: sampleDictionary) XCTAssertEqual(book.name, "...") XCTAssertEqual(book.description, "...") }())
3:18 AM
これでいけるような気がする。
3:19 AM
あ、ObjCだけなの忘れてたw
3:24 AM
うん?いけるのでは?
Avatar
norio_nomura 1/21/2019 5:00 AM
普通にLinuxでも使えるよね。 @swift-4.0.3 -frontend -repl import XCTest :print_decl XCTAssertNoThrow
Avatar
func XCTAssertNoThrow<T>(_ expression: @autoclosure () throws -> T, _ message: @autoclosure () -> String = default, file: StaticString = #file, line: UInt = #line)
Avatar
Swift版があるみたい
Avatar
omochimetaru 1/21/2019 7:33 AM
あれ?ほんとうだ、右上のLanguageのところがグレーなので間違えました。。
Avatar
引数リストが違うから別物扱いってことですかね
Avatar
norio_nomura 1/21/2019 8:26 AM
XCTAssertNoThrowのオリジナルはマクロの集合体で、シンボルとしては存在しないから、同じものとして扱っていないのでは。 #define XCTAssertNoThrow(expression, ...) \ _XCTPrimitiveAssertNoThrow(self, expression, @#expression, __VA_ARGS__) #define _XCTPrimitiveAssertNoThrow(test, expression, expressionStr, ...) \ ({ \ @try { \ (void)(expression); \ } \ @catch (NSException *exception) { \ _XCTRegisterFailure(test, _XCTFailureDescription(_XCTAssertion_NoThrow, 0, expressionStr, [exception reason]), __VA_ARGS__); \ } \ @catch (...) { \ _XCTRegisterFailure(test, _XCTFailureDescription(_XCTAssertion_NoThrow, 1, expressionStr), __VA_ARGS__); \ } \ }) …
Avatar
omochimetaru 1/21/2019 8:27 AM
なるほど・・・ 他にもそういうのありそうですね
Avatar
ErrorをCustomStringConvertibleにするんじゃなくて、Foundation.LocalizedErrorにして、 var errorDescription: String? を実装してやれば、NSError変換されるときに勝手にlocalizedDescriptionになった。
10:29 AM
こうするとXCTestでテストメソッドが例外で失敗したときもちゃんとコンソールに出る。
Avatar
なるほど。
10:34 AM
Linuxでもそうなるかな。
🤔 1
Avatar
この辺で対応した記憶があります https://github.com/apple/swift-corelibs-foundation/pull/810
This should return an appropriate value instead of the fixed "The operation could not be completed".
10:40 AM
いや方向がちょっと違うかも? (edited)
10:46 AM
https://github.com/antitypical/Result/pull/210 この辺絡みで直したんでした。Swift側で直接LocalizedErrorとしてアクセスする時だからやっぱりちょっと違いそうだけど関連はしてそう
10:48 AM
ということで面白いのは _swift_Foundation_getErrorDefaultUserInfo これですかね
Avatar
localizedDescriptionがErrorに生えてるけど、これは型的にはNSErrorとは関係ない同名メソッドですか?
10:59 AM
NSErrorへのbridingの流れをその時結構調べた気がするけど忘れてしまった (edited)
Avatar
LinuxはCustomStringConvertibleで良さげ。 @swift-4.0.3 import XCTest struct MyError: Error, CustomStringConvertible { var description = "my error" } class Test: XCTestCase { func testA() throws { throw MyError() } static var allTests = [("testA", testA)] } XCTMain([testCase(Test.allTests)])
Avatar
exit status: 1 with stdout:Test Suite 'All tests' started at 2019-01-21 20:10:23.991 Test Suite 'bin.xctest' started at 2019-01-21 20:10:23.993 Test Suite 'Test' started at 2019-01-21 20:10:23.993 Test Case 'Test.testA' started at 2019-01-21 20:10:23.993 <EXPR>:0: error: Test.testA : threw error "my error" Test Case 'Test.testA' failed (0.004 seconds) Test Suite 'Test' failed at 2019-01-21 20:10:23.997 Executed 1 test, with 1 failure (1 unexpected) in 0.004 (0.004) seconds Test Suite 'bin.xctest' failed at 2019-01-21 20:10:23.997 Executed 1 test, with 1 failure (1 unexpected) in 0.004 (0.004) seconds Test Suite 'All tests' failed at 2019-01-21 20:10:23.997 Executed 1 test, with 1 failure (1 unexpected) in 0.004 (0.004) seconds
Avatar
ああ、mac環境でも、Foundationをインポートすると生えるメソッドなんですね
Avatar
The XCTest Project, A Swift core library for providing unit test support - apple/swift-corelibs-xctest
Avatar
Windows版のNightlyビルド、Azure Pipelinesでビルドされてるのがあるのね。 https://dev.azure.com/compnerd/windows-swift/_build?definitionId=1
Avatar
norio_nomura 1/22/2019 1:34 AM
まだSwiftPMとか含まれてなくて、試すには早かった。
Avatar
omochimetaru 1/22/2019 3:26 AM
年明けぐらいにcompnerdさんが無料枠で構築してました
Avatar
norio_nomura 1/22/2019 4:23 AM
ビルド所要時間に上限がないAzure PipelinesのOSSプランすごい。
Avatar
Kishikawa Katsumi 1/22/2019 4:26 AM
それはいいですね。Travis CIも実質無限だけど。
Avatar
norio_nomura 1/22/2019 4:29 AM
Travis CIは120分が上限ではないのかな?FAQに
Are there any restrictions on build time? A build has 120 minutes to run. Should your build take longer, you can split it up using a build matrix.
って書かれてる。 https://travis-ci.com/plans
Avatar
omochimetaru 1/22/2019 4:29 AM
過去に40分?ぐらいで終了されちゃって詰んだ事がありました
Avatar
Kishikawa Katsumi 1/22/2019 4:30 AM
Taskごとなので、テストケースを分割してタスクがそれにおさまるならJOB全体は何時間でもOKです。 っていうのが「実質」の部分です。
Avatar
omochimetaru 1/22/2019 4:31 AM
なるほど。
Avatar
norio_nomura 1/22/2019 4:31 AM
WindowsのNightlyは毎日3時間40分くらいかかってる。 https://dev.azure.com/compnerd/windows-swift/_build/results?buildId=109
Avatar
omochimetaru 1/22/2019 4:31 AM
https://github.com/omochi/webrtc-ios-build WebRTCのフルビルドをシェルスクリプトから起動するしか無かったので、そういう分割の手もなかったです
Contribute to omochi/webrtc-ios-build development by creating an account on GitHub.
4:32 AM
Azureの凄さを一つ知った
Avatar
norio_nomura 1/22/2019 4:33 AM
しかもubuntu, macOS, Windows全部使える。
Avatar
omochimetaru 1/22/2019 4:33 AM
え!?macOS?
Avatar
Kishikawa Katsumi 1/22/2019 4:33 AM
Windowsが使えるのが大きいですねえ。
Avatar
norio_nomura 1/22/2019 4:37 AM
Learn about using the Microsoft-hosted agents provided in Azure Pipelines
4:38 AM
Azure Pipelines VM image generation for Microsoft-hosted CI/CD - Microsoft/azure-pipelines-image-generation
Avatar
Kishikawa Katsumi 1/22/2019 4:39 AM
サイドプロジェクトで使ってみよう
Avatar
omochimetaru 1/22/2019 4:39 AM
Learn how to configure CI⿍ for the app and platform of your choice using Azure Pipelines and Team Foundation Server (TFS). Includes tutorials, references, and other documentation.
4:39 AM
ふむふむ
Avatar
norio_nomura 1/22/2019 4:39 AM
SourceKitten, SwiftLint, YamsはCircleCIからAzure Pipelinesへ移行してしまいました。
Avatar
omochimetaru 1/22/2019 4:40 AM
Travisの順番待ちより回せるならこっちのほうが良かったりするかも
4:41 AM
An adorable little framework and command line tool for interacting with SourceKit. - jpsim/SourceKitten
4:41 AM
本当だw 見慣れないバッジになってるw [Azure pipelines] (edited)
Avatar
norio_nomura 1/22/2019 4:42 AM
決め手は、Azure PipelinesのOSSプランはどのOSのジョブも10個まで並列で起動できた事。CircleCIのOSSプランはmacOSが1~2個づつしか並列で起動できなかった。 (edited)
Avatar
omochimetaru 1/22/2019 4:42 AM
おお、なるほど。
Avatar
norio_nomura 1/22/2019 4:43 AM
docker使うジョブだけなら、dockerイメージのキャッシュが効くCircleCI が最速 の方が速い。 (edited)
Avatar
existentialだけに生えるextensionがほしい
Avatar
omochimetaru 2/1/2019 2:50 AM
@tarunon 普通に書けばそうならないっけ?
2:50 AM
Genericsパラメータに対する == で書いた場合だけか?
2:51 AM
それ自体だとプロトコルに対するextensionになっちゃうのか。
Avatar
implにも生えちゃうし、デフォルト実装になっちゃう
2:51 AM
そう
Avatar
omochimetaru 2/1/2019 2:51 AM
その場合existentialにも生えるけど
2:51 AM
protocolにも生えるのが嫌だって話?
Avatar
デフォルト実装はいらない
Avatar
omochimetaru 2/1/2019 2:52 AM
要求の是非は置いといて、たしかに書けないね・・・
Avatar
existentialの時にもpropを取り扱いたいが、デフォルト実装が生えられるのはコンパイルエラーが破壊されて困る
Avatar
omochimetaru 2/1/2019 2:56 AM
「コンパイルエラーが破壊されて」これ書き間違いじゃなくて本当にそういう意図か?
2:56 AM
コンパイルエラーが本来は起きてほしいけれど、生えてしまうことでそれが解消されることで実装強制ができなくなる?
Avatar
語彙がおかしかった
2:57 AM
強制が出来なくなるのが困る、そうです
Avatar
omochimetaru 2/1/2019 2:57 AM
なるほどわかってきた
Avatar
あーー
2:58 AM
いや、やろうとしてることも多少おかしいな
Avatar
omochimetaru 2/1/2019 2:58 AM
// : Same-type constraint type 'P' does not conform to required protocol 'P' extension P where Self == P { func b() {} }
2:58 AM
だめか〜〜〜wもしかしてこれで書けると思ったが。 (edited)
Avatar
protocol Aとprotocol Bがあって
2:59 AM
Aのフィールドについて、Bのextensionに実装があるときに
2:59 AM
struct C: A,Bとやると
2:59 AM
デフォルト実装を見てしまう
Avatar
omochimetaru 2/1/2019 3:02 AM
Bのデフォルト実装でAの要求が満たされちゃう?
3:02 AM
それ自体は普段は望ましいけども。
Avatar
んと、Bの実装は実は、existentialだけあれば十分なのだ
Avatar
omochimetaru 2/1/2019 3:03 AM
とりあえず現状の言語仕様だと、existentialを引数に取るトップレベル関数として実装するしか無さそう。
Avatar
多分、「existentialにequatableを生やしたい」と同じタイプの業
Avatar
omochimetaru 2/1/2019 3:04 AM
あ、でも呼び出しは普通にメソッドじゃないと困るんかな
Avatar
概ねやろうとしていることが筋が悪いというのは理解していて
3:04 AM
でもまぁやっちゃうよなぁという感じです
Avatar
omochimetaru 2/1/2019 3:06 AM
言語が提供する(ex)Pに対して、手動で ExistentialP : P を作って、そいつのinitで ==Pしか受け取れないようにして・・・ (edited)
3:06 AM
内部的にPじゃなくてExistentialPで保持するとか。
3:10 AM
protocol P { func a() } struct ExP : P { let p: P func a() { print("existential") } } class Actor<T: P> { let p: T init(_ p: P) { self.p = ExP(p: p) } init(_ p: T) { self.p = p } }
3:10 AM
こんな感じで解決できない?
Avatar
同じ事考えてたw
Avatar
omochimetaru 2/1/2019 3:11 AM
一応、実行時オーバーヘッドは無いんじゃないかな。
3:11 AM
ExPのレイアウトはPと同一化されて、メソッド呼び出しもstaticに解決するので。 (edited)
Avatar
多分無い、後は幾つか問題ありそうなところを解決すればokかな
Avatar
sourcekitd Stress Testerを試したけど、SWIFT_EXECを置き換えて起動するのは面白い。 https://swift.org/blog/sourcekitd-stress-tester/
Sourcekitd provides the data backing key editor features like code completion, semantic highlighting, and refactoring for Swift files in both Xcode and the recently announced SourceKit-LSP. To help improve its robustness, we’re introducing a new tool, the sourcekitd stress ...
Avatar
https://swift-ast-explorer.kishikawakatsumi.com ずっとプログレス表示されているの自分だけですか…? 壊してしまったかもしれない…
Avatar
omochimetaru 3/1/2019 4:59 AM
壊したの俺かもしれない
4:59 AM
一瞬動いたけどさっき死んだ
5:00 AM
kitaさんも
朝試したときは動いててここで確認したんですが、こっちでも固まって動かなくなってしまった...
Avatar
僕が先に壊したかも... いろいろ試してたので
Avatar
Kishikawa Katsumi 3/1/2019 5:30 AM
ずっとProgressですね。
5:31 AM
ちょっとなんとかしてみます。 もし、便利に使ってらっしゃるなら、メンテできるようにアクセス権とかお渡しします。
5:32 AM
希望があれば、、、ですけど。
5:37 AM
@noppe @omochimetaru @kitasuke 戻りました。単にアプリを再起動しただけですが。
😊 2
Avatar
omochimetaru 3/1/2019 5:37 AM
ありがとうこざいます
Avatar
Kishikawa Katsumi 3/1/2019 5:38 AM
どうせできることは再起動くらいだから、ここからChatOpsでトリガーできるようにしといたらいいかもと思いました。そしたらなんかあったらとりあえず誰でも再起動できる。
Avatar
SwiftSyntaxのmasterをspm経由で使っている方いますか? うまくビルドできず… swift-DEVELOPMENT-SNAPSHOT-2019-02-26-a.xctoolchain .package(url: "https://github.com/apple/swift-syntax.git", .branch("master")), の環境でやっているんですけど、SwiftSyntaxのビルドでSyntaxKindなどがないと怒られてしまいます。
Avatar
omochimetaru 3/1/2019 7:45 AM
前うまくいったな
7:45 AM
masterはだめなはずで
7:45 AM
SwiftPM package for SwiftSyntax library. Contribute to apple/swift-syntax development by creating an account on GitHub.
7:46 AM
Replace <#Specify Release tag#> by the version of SwiftSyntax that you want to use (see the following table for mapping details). Swift Release Tag SwiftSyntax Release Tag swift-4.2-RELEASE 0.40200.0
7:46 AM
Swift側がSwift4.2 Release toolchainのときは
7:46 AM
SwiftPMは 0.40200.0 (git tag)を
7:46 AM
チェックアウトさせないといけない
Avatar
masterはToolchainが最新だとビルドできる? (edited)
Avatar
omochimetaru 3/1/2019 8:19 AM
新しい側は > Declare SwiftPM dependency with nightly build の説明でやるといけるんだと思う
8:19 AM
master同士がちゃんと同期してるかはわからない
8:19 AM
てか、SwiftPM側のsnapshot
8:19 AM
全然ないし。
8:20 AM
2日前に出てる02-26でtoolchainとSwiftPMを揃えたらいける気がする
Avatar
master同士が同期してるかわからないの本当に運ゲーだわ。その組み合わせでやってみる
Avatar
norio_nomura 3/8/2019 12:59 AM
Swift 5 Release Notes for Xcode 10.2 Beta 4の47326318ってSwift 4.2の変更だよね。 https://developer.apple.com/documentation/xcode_release_notes/xcode_10_2_beta_4_release_notes/swift_5_release_notes_for_xcode_10_2_beta_4 @swift-4.1.3 @swift-4.2.4 @swift-5.0.3 func forceCast<U>(_ value: Any?, to type: U.Type) -> U { return value as! U } let value: Any? = 42 print(forceCast(value, to: Any.self)) // Prints "Optional(42)" // (Prior to Swift 5, this would print "42".) print(value as! Any) // Prints "Optional(42)"
Avatar
Optional(42) Optional(42)stderr:<stdin>:10:13: warning: forced cast from 'Any?' to 'Any' always succeeds; did you mean to use 'as'? print(value as! Any) ^~~ as
Avatar
42 Optional(42)stderr:<stdin>:10:13: warning: forced cast from 'Any?' to 'Any' always succeeds; did you mean to use 'as'? print(value as! Any) ^~~ as
Avatar
Optional(42) Optional(42)stderr:<stdin>:10:13: warning: forced cast from 'Any?' to 'Any' always succeeds; did you mean to use 'as'? print(value as! Any) ^~~ as
Avatar
omochimetaru 3/8/2019 7:49 AM
I'd like to add more tests. Some guidance would be appreciated. Does this require swift-evo? I feel that it's an "obvious" feature.
7:53 AM
struct Outer { typealias E = NestedValidation.T protocol NestedValidation { typealias T = A.B } }
7:55 AM
Does this require swift-evo? I feel that it's an "obvious" feature.
さすがに必要やろ思った
Avatar
norio_nomura 3/8/2019 12:36 PM
@swift-4.1.3 @swift-4.2.4 @swift-5.0.3 -swift-version 4.2 func foo<Value>(_ x: Any?, as type: Value.Type) -> Value? { return x as? Value } dump(foo(nil, as: Any.self)) -swift-version 5以外だと、Swift 4.1の挙動に戻るらしい… (edited)
Avatar
▿ Optional(nil) - some: nil (edited)
Avatar
- nil (edited)
Avatar
- nil
Avatar
norio_nomura 3/8/2019 12:45 PM
-swift-version 4.2を付けることでSwift 4.2と非互換になるって、意味がわからん。
Avatar
swiftのバージョニング未だに解らない、、
Avatar
Xcode10.1のswift4.2と、Xcode10.2betaのswift4.2、見分けられないですよね?
2:42 PM
ランタイムの動き違うから見分けられないと困るんですが…
Avatar
#if compilerでは区別できそう? (edited)
Avatar
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
2:45 PM
これですね!
2:45 PM
compiler(5.0)を入れれば良いのかな
Avatar
norio_nomura 3/13/2019 4:45 AM
Xcode 10.2にはSwiftのスタティックリンクライブラリが添付されていないんだね。 SwiftLintやSourceKittenのmakefile内で、xcodebuildのバージョンによりswift buildへ渡す-Xswiftc -static-stdlibの有無を使い分ける必要があるぽい。
Avatar
@swift-4.2.4 class A {} struct Box<T: A> {} let box = Box() print(box)
Avatar
Box<A>()
Avatar
omochimetaru 3/15/2019 9:14 AM
ええw
Avatar
初めて知りました
9:15 AM
少なくとも3.0.1からできるっぽい
Avatar
omochimetaru 3/15/2019 9:15 AM
Genericsの上界がclassだとデフォルト推論なのか
Avatar
asは通るけど変数の型にはできない
Avatar
omochimetaru 3/19/2019 3:15 PM
Hi Swift Community, The review of SE-0249: Key Path Expressions as Functions begins now and runs through March 27, 2019. Reviews are an important part of the Swift evolution process. All review feedback should be either on this forum thread or, if you would like to keep you...
3:16 PM
users.map(\.email)
3:16 PM
// `self` key paths [1, nil, 3, nil, 5].compactMap(\.self) ↑これオシャレでいいな。 { $0 } の意味。
Avatar
RxでありがちなboolObservable.filter { $0 }も同様に書ける?
Avatar
できそう
Avatar
RACのmapはこの記法ができてオシャンに書ける
Avatar
omochimetaru 3/20/2019 1:08 AM
オペレータ側でKeyPath受けるオーバーロードがあるのか。
Avatar
<T>にAnyが入れれるのはある種のself conformanceなのかな
Avatar
@swift-4.2.4 func foo<T>(_ t: T) { print(t) } let a: Any = 42 foo(a)
Avatar
42
Avatar
@swift-4.2.4 func foo<T: Any>(_ t: T) { print(t) } let a: Any = 42 foo(a)
Avatar
42
Avatar
@swift-4.2.4 func foo<T: AnyObject>(_ t: T) { print(t) } class C {} let a: AnyObject = C() foo(a)
Avatar
main.C
Avatar
@swift-4.2.4 func foo<T: Error>(_ t: T) { print(t) } struct E: Error {} let a: Error = E() foo(a)
Avatar
exit status: 1 with stderr:<stdin>:8:1: error: cannot invoke 'foo' with an argument list of type '(Error)' foo(a) ^ <stdin>:8:1: note: expected an argument list of type '(T)' foo(a) ^
Avatar
@swift-5.0.3 func foo<T: Error>(_ t: T) { print(t) } struct E: Error {} let a: Error = E() foo(a)
Avatar
E()
Avatar
他にあるかな?
Avatar
Kishikawa Katsumi 4/1/2019 3:16 PM
Hi swift-evolution, I've been working on a pitch I think you're all going to love, as well as the corresponding implementation Control Flow Negation Statements Proposal: SE-NNNN Author: Harlan Haskins Review Manager: TBD Status: Awaiting review Implementation: apple/sw...
Avatar
omochimetaru 4/1/2019 5:17 PM
Introducing a new code visualizer for Swift: Source Is View. https://t.co/HWnAaflYrC
5:17 PM
こっちもエイプリル、JRose氏もBaba is youやってるのかw
5:17 PM
Baba Is You is an award-winning puzzle game where you can change the rules by which you play. In every level, the rules themselves are present as blocks you can interact with; by manipulating them, you can change how the level works and cause surprising, unexpected interactio...
Price
$14.99
Recommendations
831
Metacritic
83
Avatar
Kishikawa Katsumi 4/2/2019 1:12 AM
Control Flow Negation Statementsはちゃんとした名前であったら便利だと思う。 unlessでいいんじゃないか。
Avatar
guardn't 欲しい
Avatar
omochimetaru 4/2/2019 2:47 AM
if + 脱出保証はちょっと欲しい
Avatar
Kishikawa Katsumi 4/2/2019 2:49 AM
if #available の否定ほしい
Avatar
Date のreference dateが2001/1/1なのってどういう理由があるかって誰かご存知ないですか?ただ気になっただけなのですが笑
🤔 1
Avatar
https://nshipster.com/timeinterval-date-dateinterval/ Matttさんも疑問とのことで >>>While we’re on the subject of conjectural sidebars, does anyone know why Apple created a new standard instead of using, say, the Unix Epoch (January 1, 1970)? 2001 was the year that Mac OS X was first released, but NSDate pre-NSDates that from its NeXT days. Was it perhaps a hedge against Y2K? (edited)
Our limited understanding of time is reflected in — or perhaps exacerbated by — the naming of the Foundation date and time APIs. It’s about time we got them straight.
Avatar
Kishikawa Katsumi 4/10/2019 7:29 AM
GoogleのCloud Run、触ってみたい感じなんですけどSwiftのPlaygroundを移したら今より楽になったりするかな?
Avatar
omochimetaru 4/10/2019 7:30 AM
@1amageek The next step is to build an open source function framework for Swift, based on our Node one: https://t.co/PzBlKu50bk
Avatar
Kishikawa Katsumi 4/10/2019 7:31 AM
そう。任意のコンテナをServerlessの実行環境で使った分だけ課金、置いとくぶんには料金かからない、という感じで理解しています。
7:32 AM
今はDigitalOceanを使っていて、Swiftのバージョンを増やすのがそろそろ容量いっぱいいっぱいだし、スケールもしないし(しても困るという話もあるけど)。
Avatar
omochimetaru 4/10/2019 7:32 AM
サンドボックスで実行するところがちょうどそのままCloud Runにできるのかな コードは事前に静的に置くだったりするとだめそう? (edited)
Avatar
Kishikawa Katsumi 4/10/2019 7:33 AM
パラメータを渡したりはできるんじゃないかな(わかってない)。
Avatar
omochimetaru 4/10/2019 7:34 AM
Swiftのバージョンを増やすのがそろそろ容量いっぱいいっぱいだし
なるほどw
Avatar
Kishikawa Katsumi 4/10/2019 7:34 AM
今複数バージョンの環境をデプロイしてあって、それはとても便利だけど、頻繁に使われるのは現行バージョンと1つ前くらいだし。
7:35 AM
Swiftの環境はそもそもでかいし、Dockerイメージも基本的に小さくならないんですよ。
Avatar
omochimetaru 4/10/2019 7:40 AM
const result = require('child_process').execSync('docker images kishikawakatsumi/swift --format "{{.Tag}}"').toString();
7:40 AM
なるほど
Avatar
norio_nomura 4/10/2019 8:28 AM
僕がHerokuで動かしてるのと同じ感じになりそう。
Avatar
Kishikawa Katsumi 4/10/2019 8:28 AM
そんな感じかと思うんですよね。スピンアップの時間に違いがあったりするかな?
Avatar
norio_nomura 4/10/2019 8:29 AM
Webアプリにしたいのですよね?
Avatar
Kishikawa Katsumi 4/10/2019 8:31 AM
^ ごめんなさい、質問の意味がわかりませんでした。
Avatar
norio_nomura 4/10/2019 8:34 AM
入力はRESTで受け取る?
8:34 AM
Docker in Dockerをサポートしてるとは思えないから、複数ツールチェインを切り替えて使いたいなら、実行を受け持つサーバーをツールチェインの数だけ建てるのかな。
Avatar
Kishikawa Katsumi 4/10/2019 8:36 AM
実行を受け持つサーバーをツールチェインの数だけ建てるのかな。
おそらくそうです。 今Webインターフェースを提供するa) Nodeアプリとb) Swiftの実行を担当するDockerイメージ複数が1つのサーバにあるので、 bをCloud Runに置く、ということになるのかなと。
8:36 AM
置いとくだけならお金かからないということですし。
Avatar
norio_nomura 4/10/2019 8:41 AM
HerokuのWebアプリケーションと同じに見える。>Cloud Run
8:43 AM
Cloud Runは無料枠が無さげ?
8:45 AM
いや無料枠あるのか。
8:50 AM
Swiftの環境はそもそもでかいし、Dockerイメージも基本的に小さくならないんですよ。
僕が公開してるSwiftのDockerイメージは、基本部分が共通イメージになるようにしてるので、複数バージョンのSwiftをpullした時に全体の容量を極力減らすようにしてある。
(edited)
Avatar
Kishikawa Katsumi 4/10/2019 8:54 AM
なるほど。
Avatar
norio_nomura 4/10/2019 9:15 AM
Container RegistryはGoogle以外も使えるのかな。
Avatar
norio_nomura 4/10/2019 9:25 AM
ほとんどの Container Registry ストレージ バケットに使用されるデフォルトの Cloud Storage クラスは、Multi-Regional です。 Multi-Regional バケットの月額料金は、約 $0.026/GB です。 https://cloud.google.com/container-registry/pricing
Avatar
Kishikawa Katsumi 4/10/2019 9:26 AM
あれ、置いとくだけでお金かかります?
9:26 AM
ということ?
Avatar
norio_nomura 4/10/2019 9:28 AM
イメージをGoogle Cloud以外に置なければ、そうなりますね。
9:29 AM
この辺りはHerokuの方が緩い。
Avatar
norio_nomura 4/10/2019 9:37 AM
イメージをプライベートにしたいとか無ければGoogle Cloud以外に置いても使えるとは思いますが、チュートリアル通りに作るとGoogle Cloud Registoryへ置くのでCloud Storageの料金がかかると思います。 (edited)
Avatar
Kishikawa Katsumi 4/10/2019 9:38 AM
じゃあ金銭の節約にはならないかなあ。
Avatar
norio_nomura 4/10/2019 9:46 AM
とりあえず、Swiftの実行を担当するDockerイメージにRESTで入出力出来る様にしておくのは、無駄にはならない気がします。
Avatar
omochimetaru 4/11/2019 2:22 AM
struct Stone { var a: Int var b: Int init(a: Int = 10 * 2 + 3 /*草*/ - (5 + 2), b: Int = 20) { self.a = a self.b = b } }
2:23 AM
// SIL struct Stone { @_hasStorage var a: Int { get set } @_hasStorage var b: Int { get set } init(a: Int = 10 * 2 + 3 /*草*/ - (5 + 2), b: Int = 20) }
2:24 AM
ここはテキスト的に埋め込まれてるだけで意味は無いっぽいけど。
Avatar
↓ path-dependent type なるものが必要らしい。 func nthOfEach( _ n: Int, from heterogeneousCollections: [any Collection] ) -> Any { return heterogeneousCollections.map { collection in // collection is `any Collection` let nthIndex = collection.startIndex.advanced(by: n) // error: inferred static type of nthIndex is something like `any Collection.Index`, // so compiler can’t guarantee it indexes `collection` … correct? return collection[nthIndex] } } https://forums.swift.org/t/se-0244-opaque-result-types-reopened/22942/49
These examples require “path-dependent types” to work. There are some examples in the old enhanced existentials draft (although it does not use the term path-dependent types). Also, fwiw Scala’s type system supports this feature. I don’t know Scala in depth so I’...
Avatar
omochimetaru 4/17/2019 5:38 PM
現状のAnyCollectionはIndexが実行時エラーの可能性をはらんでるみたいですね。 func main() { let ac = AnyCollection<Int>([1]) let s = AnyCollection<Character>("str") let x = ac[s.startIndex] // Fatal error: Index type mismatch! } main()
Avatar
path-dependent type があれば、↑をコンパイルエラーとして検出し、↓のコンパイルを通せるのか。 let ac = AnyCollection<Int>([1]) let x = ac[ac.startIndex]
Avatar
↑これだけならsome Collectionでできますね もう一回Arrayに包んだ時のことかと
Avatar
これと同等のことをやりたいということではなく、 AnyCollection を使った場合に↑の二つのコードを区別してコンパイル時の挙動を変える話。
12:10 AM
現在は実行時エラー側に倒されてるけど、 path-dependent type で実行時エラーになるケースだけをコンパイルエラーにできるんじゃないのかな?
Avatar
AnyCollectionを安全にする話なのか。
Avatar
AnyCollection というか generalized existential の問題の話で、同じことが type erasure でも言えるということじゃないかな。 (edited)
12:21 AM
AnyCollection って AnyCollection<Element, Indices> とかの方がよかったのでは・・・。 (edited)
Avatar
any Collectionの場合
12:21 AM
インデックスは取れるけど渡せない になるのか?
Avatar
IteratorSubSequence はいいけど、 Indices が定まらないのはいいのかな・・・。 (edited)
Avatar
自動定義されるany Protoにおいて
12:22 AM
assoctypeが絡むメンバーのシグネチャというか
12:23 AM
ジェネリクスの変性的なやつがどうなるのか
12:23 AM
ちゃんとわかってない
12:23 AM
既存の手動定義系はAnyIndexとかになってて、型の不一致でクラッシュ。
Avatar
この前の Self 戻り値はいいけど引数はダメみたいな話?
Avatar
そうですね any Protoは全てのProtoのスーパータイプのはずなので。
Avatar
手動定義の場合は AnyCollection<Element, Indices> にすれば型安全にできる気がするけど、 generalized existential って必ずしもすべての associated type を指定しなければならないわけじゃないから、その辺りの型安全性を解決するのに path-dependent type が必要という話なんじゃないかな? (edited)
Avatar

概要

Swiftのprotocolには型の性質を記述する機能と、存在型として使用する機能があります。その存在型はそれ自身のprotocolに準拠しません。その理由は、スタティックメンバに関して問題が生じるからで...
12:27 AM
↑最近考えたんだった
Avatar
AnyCollection の場合は Indices を型パラメータにしなかったのでそれを指定する手段がないから実行時エラーにするしかない。
12:29 AM
↓を型安全にできるようにする話な気がする。 func g(_ x: P) { let a = x.value x.value = a }
Avatar
まあ、Indicesもパラメータ化すればそうだけど、他のassoctypeについても同じ問題が起きるし
Avatar
path-dependent type についてはよくわからないけど、 Scala にあるっていうから Scala を勉強すればわかるかも。
Avatar
型パラメータにしないことでIndex違いを全部まぜて代入できたりするから
12:30 AM
そこは正解はなくて性質をコントロールできたら良い気がする
Avatar
それを代入できないようにするんじゃないかな?
Avatar
えっと、代入できるスーパータイプとしての利便性は別途存在するという意味です
12:31 AM
どっちが良いとかじゃなくて
12:31 AM
別の道具
Avatar
Joe_Groff >> anandabits Matthew Johnson
>> These examples require “path-dependent types” to work. There are some examples in the old enhanced existentials draft (although it does not use the term path-dependent types). >> >> Also, fwiw Scala’s type system supports this feature . I don’t know Scala in depth so I’m not sure how closely it relates to what we might have in Swift but you might find it interesting to look at how Scala handles this.
This would be my in-an-ideal-world choice for how existentials eventually work in Swift.
https://forums.swift.org/t/se-0244-opaque-result-types-reopened/22942/53
This would be my in-an-ideal-world choice for how existentials eventually work in Swift.
12:36 AM
代入できるスーパータイプとしての利便性は別途存在するという意味です
この場合でも、↑の value プロパティについて、コードのフローを考慮して同じ型であることが保証できる場合のみ代入できるようにするとか?
Avatar
なるほど。でも解析できないけど実は正しい場合とかが生じそう
12:40 AM
実行時に構築される値を使って辞書に出し入れしたりしたら
12:40 AM
値の同一性が追跡できない場合が出てくる
12:41 AM
逆か 静的解析で間違ってることがわかる場合にだけコンパイルエラーにする ならいけそう
Avatar
わからなくて間違ってる場合は実行時エラー?
Avatar
はい
Avatar
もしくは、コンパイルエラーだけど、明示的に指定してまちがってて実行時エラー化する手段を提供するか? as! 的な。
12:45 AM
そっちの方が安全よりそう。
Avatar
あー、なるほど。その方がSwiftらしいですね
Avatar
Genericsのデフォルトパラメーターがあれば解決するとかそういう話ですかね
3:56 AM
型パラ増やしすぎたくないけどこの場合に破壊が起きるみたいな
3:56 AM
そういう雰囲気を感じた
Avatar
omochimetaru 4/18/2019 3:57 AM
デフォルトパラメータは見かけ上埋めないだけでパラメータは存在してるので、それはまた違う (edited)
3:58 AM
もしAnyCollectionにElementパラメータがなかったとしたら
3:58 AM
Array<Int> is AnyCollection かつ Array<String> かつ AnyCollection がなりたつ
3:58 AM
もしAnyCollectionのElementパラメータにデフォルトパラメータがあったとしても、 AnyCollectionって書いた時、見えないだけで Element = Int だったり = String だったりするので↑の両方は成り立たない
Avatar
Indicesの差を実行時に死ぬかコンパイル時に検知するかという話で
4:00 AM
やればいいじゃん?としか思わないんだけど、やりたくない理由が型パラの見かけの問題なのか、と思ったのである
Avatar
omochimetaru 4/18/2019 4:04 AM
@swift-5.0.3 let cs: [Character] = ["a", "b"] let str: String = "cde" func concat<T>(_ a: AnyCollection<T>, _ b: AnyCollection<T>) -> [T] { return a.map { $0 } + b.map { $0 } } let r = concat(AnyCollection(cs), AnyCollection(str)) print(r)
Avatar
["a", "b", "c", "d", "e"]
Avatar
omochimetaru 4/18/2019 4:05 AM
@swift-5.0.3 let cs: [Character] = ["a", "b"] let str: String = "cde" func concat<T>(collections: [AnyCollection<T>]) -> [T] { return collections.reduce([]) { $0 + $1.map { $0 } } } let r = concat(collections: [AnyCollection(cs), AnyCollection(str)]) print(r)
Avatar
["a", "b", "c", "d", "e"]
Avatar
omochimetaru 4/18/2019 4:06 AM
↑これはIndexがパラメータになってると書けない
Avatar
書けなくて良いのでは
4:06 AM
str.mapなりしてIndexをIntに書き下してからやるのが正しいと思う
4:07 AM
「書けなくて良い」というか、むしろ「書けるのはやばい」とすら言えると思うのだけど。
Avatar
omochimetaru 4/18/2019 4:08 AM
それでいうとそもそもAnyCollectionを使いたい状況に遭遇したことがなくてあんまり想像つかないけど
4:08 AM
俺の意見としては、
4:08 AM
AnyCollectionを手書きしてる世代はどうでもよくって
4:08 AM
any Collection って書けるようになれば
4:09 AM
どのパラメータを固定するか自由に選べるようになるから
4:09 AM
状況に応じて決められるようになって全部解決する
4:09 AM
現時点だと、 some Collection は全部を固定する
Avatar
そうだね
Avatar
omochimetaru 4/18/2019 4:10 AM
けど、Future Directionとしては、 func hoge<T>() -> some Collection<.Element == T> とかを許すので (edited)
4:10 AM
そっからいくと any Colleciton とか any Collection<.Element == Int> とか any Collection<.Element == Int, .Index == Int> (edited)
4:11 AM
が使い分けられるようになるので。
4:12 AM
あと、Element, Index を固定してもまだ Iterator とか SubSequence とかがあるから、
4:12 AM
常に全部を固定すべき、とは言い切れないんじゃないかなあ
4:13 AM
固定しなかったパラメータに関してからなずしもクラッシュケースが発生するわけでもないし。 AnyEquatable同士を == するときとかはそういうパターン。
4:13 AM
本来の <T: Equatable> は T 同士にしか対応してないけど、Any で その固定を外しちゃってるけど動く。
Avatar
問題は
Avatar
シャットダウンしてもうた
4:46 AM
問題はIndexを直接見るような状況でIndexが不定、みたいなのは壊れちゃうね。
Avatar
omochimetaru 4/18/2019 4:48 AM
そうだね、AnyCollectionに対してIndex操作をする用途だと固定されてたほうが嬉しい
4:48 AM
多分、 any Collection<.Element == Int> の場合
4:49 AM
Indexが絡むメソッドは使えないんじゃないか・・・?
4:49 AM
それとも Index: any Comparable として生成されるのかな、それだと例のクラッシュがありえるけど
Avatar
それが↓のコンパイルエラーの話なんじゃないかな? func nthOfEach( _ n: Int, from heterogeneousCollections: [any Collection] ) -> Any { return heterogeneousCollections.map { collection in // collection is `any Collection` let nthIndex = collection.startIndex.advanced(by: n) // error: inferred static type of nthIndex is something like `any Collection.Index`, // so compiler can’t guarantee it indexes `collection` … correct? return collection[nthIndex] } }
Avatar
omochimetaru 4/18/2019 6:12 AM
so compiler can’t guarantee it indexes collection … correct?
ああ、たしかに、そうっぽい
Avatar
mutating func Array.clip(low, high)みたいなextensionをはやしてて、数が多くなってきたのでArray.ex.clip(low, high)に移したいなと思ったんですが値型だとこれできないですよね……
Avatar
omochimetaru 4/19/2019 8:04 AM
subscriptならできる
Avatar
subscriptというかsetter?
8:05 AM
extension Array { var ex: Ex<Element> { get { return Ex(self) } set { self = newValue.array } } }
8:05 AM
そういえば昔やった記憶がある
Avatar
omochimetaru 4/19/2019 8:06 AM
あれ?そっか、できるじゃん。
Avatar
これの問題点はexをどっかに代入されたときなんですよね。
Avatar
omochimetaru 4/19/2019 8:07 AM
まあそのときは書き戻しは無し、で良いのでは
8:07 AM
.ex 方式、そもそもあんまりよくない気もする
8:08 AM
使いたくなければimportしなければ名前空間は汚染されないよね?
Avatar
それが一番よさそうですね。
8:08 AM
単純にネームスペース切れる方法を用意してもらえるほうが嬉しいんですが。
8:09 AM
使いたくなければimportしなければ名前空間は汚染されないよね?
そうですね。
Avatar
Kishikawa Katsumi 4/19/2019 8:09 AM
そのまま使える方が私も良いと思っています。分けたければモジュールを分ける、は賛成です。
Avatar
omochimetaru 4/19/2019 8:09 AM
数が多くなってきたので
なんか動機が違いそうだな
Avatar
例示なんでArrayで書きましたけど本当は自作の型で、いろいろ生えてる感じなんです。
8:09 AM
でそれを今整理中で
Avatar
omochimetaru 4/19/2019 8:11 AM
自作の型ならなおさら、同居させて良い気がするけどなあ
Avatar
数が多いのだけでなく粒度が結構違うんですよね
Avatar
omochimetaru 4/19/2019 8:11 AM
実例が気になる
Avatar
Kishikawa Katsumi 4/19/2019 8:12 AM
そっすね。具体例が気になります。
Avatar
Image library for Swift. Contribute to t-ae/swim development by creating an account on GitHub.
Image library for Swift. Contribute to t-ae/swim development by creating an account on GitHub.
8:12 AM
上がextension化したもので下がまだのやつです。下はmutatingが出てくる。
8:13 AM
粒度というか機能的にいくつかまとまりがあってそれらが全部フラットに入ってるとごちゃごちゃするのが嫌って感じでしょうか。 (edited)
8:15 AM
説明が雑だったので付け加えると、画像のImage型にいろいろメソッドを生やしてたけど雑然としてきたので整理したいというところです。
Avatar
omochimetaru 4/19/2019 8:15 AM
Image.resizeとImage.convertが両方あっても良いというか
8:15 AM
そんなに粒度が違う感じもしない
8:16 AM
強いて言えば、 convertじゃなくて convertPixelwise とかのほうが良いかもしれんが
8:16 AM
mapPixel とか。
Avatar
粒度は言葉が悪かったです。 >粒度というか機能的にいくつかまとまりがあってそれらが全部フラットに入ってるとごちゃごちゃするのが嫌って感じでしょうか。
8:17 AM
scikit-imageの分割を参考にしています。 https://scikit-image.org/docs/dev/api/skimage.transform.html
Avatar
omochimetaru 4/19/2019 8:19 AM
ごちゃごちゃするっていうのは、Xcodeで補完候補を出す時とかの事?
Avatar
はい。
Avatar
omochimetaru 4/19/2019 8:20 AM
例えばUIViewだと
8:20 AM
↑のメソッドが、ジャンルごとにグルーピングされていて
8:20 AM
Configuring a View’s Visual Appearance, Configuring the Event-Related Behavior, Configuring the Bounds and Frame Rectangles
8:20 AM
みたいにグループで書いてあるので
8:21 AM
このグループ名みたいなのをコードかコメントで記述できて、
8:21 AM
Xcodeが補完するときにそのまとまりで出してくれたら
8:21 AM
問題は解決する気がする。
8:21 AM
そういうのがあったら、実際に型システム上はフラットになっていたとしても問題はない。
Avatar
そういうのがあったら嬉しいですね。
Avatar
omochimetaru 4/19/2019 8:22 AM
今はないしそういうディスカッションを見た記憶もないけど・・・
8:23 AM
こういうHTMLみたいにコードの外でドキュメントを提供することでも
8:23 AM
解決するのかな
Avatar
namespaceのほうはフォーラムでちょくちょく見てた気がしますけどそっちのアプローチは見覚えないですね。
Avatar
omochimetaru 4/19/2019 8:26 AM
確かにメソッドのネームスペースの話題はあった気がする
8:26 AM
.ex方式だと、コードが長くなるから、読みやすさが少し低下するのと、
8:27 AM
オーバーヘッドがあるからパフォーマンスも少し低下しちゃう
Avatar
オーバーヘッドは確かに。
Avatar
omochimetaru 4/19/2019 8:27 AM
補完ごちゃごちゃは書く時の話で、書く時と読む時のトレードオフなら読む時を重視したほうが良いと思ってる
Avatar
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
👀 1
4:16 AM
Optional.mapには付いてるからResult.mapにも付いてておかしくないと思ったんですが。
Avatar
omochimetaru 4/20/2019 4:18 AM
インライン化するところってどうやって決めてるんだろう
4:19 AM
導入時のPRのコミットを追ってけばなんかわかるかも?
Avatar
This PR adds the updated Result implementation for SE-0235, as I broke the last PR when trying to rebase off of @rjmccall&#39;s Error self conformance PR. Previous PR discussion and review was ...
4:22 AM
うーん、触れられて無さそう
4:23 AM
フォーラムで聞いてみます
Avatar
omochimetaru 4/20/2019 4:23 AM
他のところも1つも付いてないのか
Avatar
ですね
4:25 AM
こういう話題ってカテゴリは何に当たるんだろう
4:25 AM
Developmentでいいのか
Avatar
omochimetaru 4/20/2019 4:26 AM
コンパイラタグと開発タグがある
4:26 AM
開発が大カテゴリか
Avatar
I noticed methods of Result like Result.map, Result.flatMap and so on are not inlinable even though Optional things are inlinable. This topic wasn't discussed in PR of SE-0235 but I think it would make sense to change them as inlinable. Is there some reasons to be non-inlin...
4:35 AM
立てた
Avatar
ResultのPR作者から返信きたけどこれはABI Stabilityに関係あるのか? https://forums.swift.org/t/why-is-result-map-implemented-as-non-inlinable-method/23410/2 (edited)
No reason, other than I didn’t think about it and wasn’t told to do so. At this point I’m not sure it would be possible due to ABI stability.
Avatar
Result は標準ライブラリの型だから、 @inlinable がなくても specialize は行われるっていう認識でいいのかな?それだと "benchmarked to check if it's beneficial and not harmful" を作るのは更に難しそう。 (edited)
Avatar
omochimetaru 4/22/2019 1:04 AM
標準ライブラリの中でもinlinableが付いてる箇所と付いてない箇所があるから、標準ライブラリだからって特別扱いは無さそう Array専用の最適化とかはあるみたいだけどResultに対してはなさそう
1:10 AM
ABIStabilityは実行ファイルはそのままで標準ライブラリが新しいものになる時の話だから、 インライン化されるとアプリ側にコードが埋め込まれてロックされるので、 将来のバージョンで処理を変えられなくなる、 関わる型のレイアウトが変わると死ぬ(fixedの場合) そこから呼ばれてる関数が無くなってると死ぬ
1:10 AM
などの制約があると思うけどわからん
1:17 AM
I'll measure performance and propose this again
これだけど、ベンコーヘンのレスからすると
1:17 AM
インライン化が良いか悪いかは、それを使ってるコードにも寄るってことは
1:18 AM
多くのプロジェクトがResultを導入してコード例が多くならないと実質評価できない気がする
1:18 AM
Optionalは最初から標準ライブラリの中などで多用されるからそれが調べられるけど
1:19 AM
Resultは標準ライブラリの中からはほぼ使われないだろうし・・・
Avatar
そうなんですよね、まだ大して使われてない…
1:21 AM
標準ライブラリ内のユースケースならチェインすることも多くなさそうだし。
Avatar
標準ライブラリの API が @inlineable 以前から specialize された件って、 @_inlinable とかのおかげだったってこと?
Avatar
omochimetaru 4/22/2019 1:23 AM
はい、そう思ってます>アンスコ付き
1:24 AM
ArrayとかStringも@semanticって特別なアトリビュートで
1:24 AM
マークされてる部分とかがあって
1:24 AM
「標準ライブラリである」って知識はコンパイラの中で最低限にされてるようにみえる
1:25 AM
秘密のマーク方法があって、コンパイラはそれを見てて、ライブラリはそのマークを使うから特別
Avatar
なるほど。標準ライブラリだと特殊な処理がされてて無条件に specialize 可なのかと思ってた。
Avatar
omochimetaru 4/22/2019 1:26 AM
型推論のところでoptional用の変換とかハードコードされてたりもするので完全にそうとも言い切れないけど・・
1:29 AM
標準ライブラリ内のユースケースならチェインすることも多くなさそうだし。
確かにmap自体が使われない・・・
Avatar
@swift-5.0.3 public struct MyStruct1 { public internal(set) var x: Int @inlinable public init(x: Int) { self.x = x } } public struct MyStruct2 { @usableFromInline public internal(set) var x: Int @inlinable public init(x: Int) { self.x = x } }
Avatar
exit status: 1 with stderr:<stdin>:11:5: error: '@usableFromInline' attribute can only be applied to internal declarations, but 'x' is public @usableFromInline ^~~~~~~~~~~~~~~~~ <stdin>:6:9: error: setter for 'x' is internal and cannot be referenced from an '@inlinable' function self.x = x ^ <stdin>:2:30: note: setter for 'x' is not '@usableFromInline' or public public internal(set) var x: Int ^ <stdin>:16:9: error: setter for 'x' is internal and cannot be referenced from an '@inlinable' function self.x = x ^ <stdin>:12:30: note: setter for 'x' is not '@usableFromInline' or public public internal(set) var x: Int ^
Avatar
どっちもできなくて詰んでる。
Avatar
omochimetaru 4/23/2019 3:46 AM
computed propertyにしよう (edited)
Avatar
そうですね。それが良さそう。
Avatar
norio_nomura 4/23/2019 4:03 AM
面白いバグだw
Avatar
https://bugs.swift.org/browse/SR-10340 すでに報告上がってましたけどコメントで対処はsetメソッドを作る方法で書かれてますね。 computed propertyのほうが外見は良いですがバッキングフィールドの定義が要るので一長一短か。 (edited)
Avatar
バイパス用のsetterを手書きするのでもいいか、なるほど。
Avatar
func testMultiplyPixel() { var rgba = [Double](repeating: 1, count: 4) let scalar: Double = 0.99 measure { // 0.108sec for _ in 0..<1000000 { rgba.withUnsafeMutableBufferPointer { var p = $0.baseAddress! for _ in 0..<$0.count { p.pointee *= scalar p += 1 } } } } } func testMultiplyPixel3() { var rgb = [Double](repeating: 1, count: 3) let scalar: Double = 0.99 measure { // 0.141sec for _ in 0..<1000000 { rgb.withUnsafeMutableBufferPointer { var p = $0.baseAddress! for _ in 0..<$0.count { p.pointee *= scalar p += 1 } } } } } 要素4つのほうが3つより早いという直感に反する結果に……
Avatar
omochimetaru 4/24/2019 2:15 AM
ほ〜 結構異なったバイナリになってそう
2:17 AM
使ってるメモリ領域は小さいから、4つのケースでうまいこと専用命令になったとか?
2:17 AM
検証するのが難しいな
2:18 AM
コマンドラインまで落とせれば $swiftc --emit-assembly だけど
Avatar
[araki@Arakis-MBP No Backup]$ diff main3.txt main4.txt 22c22 < movl $3, %ecx --- > movl $4, %ecx
2:20 AM
定数以外同じですねぇ (edited)
Avatar
omochimetaru 4/24/2019 2:21 AM
main3.txtはどうやって作った?
Avatar
あ、-Oついてなかった
2:22 AM
[araki@Arakis-MBP No Backup]$ diff main3.txt main4.txt 35c35 < movl $3, %edi --- > movl $4, %edi 37c37 < movq $3, 16(%rax) --- > movq $4, 16(%rax) 40,41c40 < movabsq $4607182418800017408, %rcx < movq %rcx, 48(%rax) --- > movupd %xmm0, 48(%rax)
2:22 AM
-Oつけたらこうでした。
2:22 AM
[araki@Arakis-MBP No Backup]$ cat main.swift var rgb = [Double](repeating: 1, count: 3) let scalar: Double = 0.99 rgb.withUnsafeMutableBufferPointer { var p = $0.baseAddress! for _ in 0..<$0.count { p.pointee *= scalar p += 1 } } [araki@Arakis-MBP No Backup]$ swiftc -emit-assembly -O main.swift > main3.txt
Avatar
omochimetaru 4/24/2019 2:23 AM
外側のループ回数の影響は受けないんかな それでも速度差一緒?
2:23 AM
グローバル変数になってるのもアクセスに影響がある
Avatar
外にforつけてもdiffは同じですね
2:25 AM
func内に全部おいたらかなり違った感じになりました。
2:25 AM
[araki@Arakis-MBP No Backup]$ diff main3.txt main4.txt 20,23d19 < .section __TEXT,__literal8,8byte_literals < .p2align 3 < LCPI1_2: < .quad 4607092346807469998 43c39 < movl $3, %edi --- > movl $4, %edi 45c41 < movq $3, 16(%rax) --- > movq $4, 16(%rax) 48,49c44 < movabsq $4607182418800017408, %rcx < movq %rcx, 48(%rax) --- > movups %xmm0, 48(%rax) 85c80 < movl $3, %edi --- > movl $4, %edi 89,94c84,90 < movupd 32(%rdi), %xmm0 < mulpd LCPI1_1(%rip), %xmm0 < movupd %xmm0, 32(%rdi) < movsd 48(%rdi), %xmm0 < mulsd LCPI1_2(%rip), %xmm0 < movsd %xmm0, 48(%rdi) --- > movapd LCPI1_1(%rip), %xmm0 > movupd 32(%rdi), %xmm1 > movupd 48(%rdi), %xmm2 > mulpd %xmm0, %xmm1 > movupd %xmm1, 32(%rdi) > mulpd %xmm0, %xmm2 > movupd %xmm2, 48(%rdi)
Avatar
omochimetaru 4/24/2019 2:26 AM
3個の場合に
2:26 AM
ベクトル命令を発行するためにベクトルレジスタに出し入れするところが
2:27 AM
アライメントがズレてて?余分な処理が生じる?
Avatar
XXXpdのほうがXXXsdより速いって感じですかね(よく分かってない) (edited)
Avatar
omochimetaru 4/24/2019 2:35 AM
3.txtのほうだとxmm0しか使ってないけど4はxmm1とxmm2も使ってる?
Avatar
全体を見てみないとわからないけど、すごい最適化をしてる気がする
3:50 AM
countプロパティって使われてます? 即値を使ってる気がする
Avatar
countはUnsafeMutableBufferPointerのを使ってますね。
Avatar
あれ? 0..<4 とかでコンパイルされてると思ったんだけど。
3:58 AM
だとするとこの違いは何だろう
Avatar
上の方に貼ったのから殆ど変わってないですが func test() { var rgb = [Double](repeating: 1, count: 4) let scalar: Double = 0.99 rgb.withUnsafeMutableBufferPointer { var p = $0.baseAddress! for _ in 0..<$0.count { p.pointee *= scalar p += 1 } } }
Avatar
あ! ソース上ではなく、アセンブリで、です。 $0.count を 4 としてコンパイルされている可能性が
4:05 AM
3.07 KB
4:05 AM
環境が違うかもしれないので全文アップロードしました。
Avatar
norio_nomura 4/24/2019 5:24 AM
ループアンロールされてますね。
  • 初期化:
    • main3: rgb[0...1]は128bitリテラル読み書き1回 rgb[2]は64bit即値書き込み1回
    • main4: rgb[0...1] [2...3] 128bitリテラル読み込み1回書き込み2回
  • 乗算:
    • main3: rgb[0...1] 128bit対象レジスタへ読み込み1回、128bitリテラルとレジスタの乗算1回、128bit書き込み1回 rgb[2] 64bit対象読レジスタへみ込み1回、64bit64bitリテラルとレジスタの乗算1回、64bit書き込み1回
    • main4: rgb[0...1] [2...3] 128bitリテラルをレジスタへ読み込み1回、128bit対象をレジスタへ読み込み2回、128bitレジスタ同士の乗算2回、128bit書き込み2回
(edited)
Avatar
norio_nomura 4/24/2019 5:33 AM
main3はリテラルの読み込みが1回多いのかな。
Avatar
omochimetaru 4/24/2019 5:34 AM
すげえ。
Avatar
norio_nomura 4/24/2019 5:38 AM
あと、main3は乗算の結果が2回ともxmm0に書き込まれるから順次実行、main4は乗算の結果を書き込む先がxmm1とxmm2別になってるから並列実行してそう。 (edited)
Avatar
omochimetaru 4/24/2019 5:39 AM
main4の方は 128bit レジスタ同士の演算を2回にできるから scalar を1度読めば使い回せるけど、 main3の方は 128bit 同士と 64bit同士になる関係で、 scalar の読み込みが多くなっちゃう?
Avatar
norio_nomura 4/24/2019 5:39 AM
そうなってますね。
Avatar
omochimetaru 4/24/2019 5:40 AM
命令単位の並列性も関係するのか〜
Avatar
なるほど。そもそもループアンローリングされてることに気付かなくてどこがforだろうとか思ってました。
Avatar
norio_nomura 4/24/2019 5:43 AM
要素数3と4は、一番速度差が出そうです。
Avatar
omochimetaru 4/24/2019 5:43 AM
面白いなあ
Avatar
norio_nomura 4/24/2019 5:45 AM
5と6、7と8と増えていくと、それぞれの前者も並列実行される割合が増えるし、全体に占めるリテラル読み込み時間は無視できる様になっていくと想像。
5:52 AM
要素数がもっと増えると、より大きなレジスタを使う命令になって、そんな簡単にはいかなさそう。
Avatar
@norio_nomura やはりそうなってますよね
6:01 AM
var rgb の要数が変わらない、$0.countがrgb.countと同一であることがコンパイラに伝えられてる
Avatar
swift5からJSONキーのキャメルケース変換がDictionaryに適用されなくなったんですがcorelib-foundationの方にそれが反映されてなくて挙動が乖離してた https://github.com/apple/swift-corelibs-foundation/pull/2161 (edited)
Using keyEncodingStrategy or keyDecodingStrategy, there is a difference of key name case between platforms. Darwin Linux Encode &quot;camelCase&quot; -&gt; &quot;camelCase&a...
10:15 PM
それぞれの変更の同期漏れを防ぐような仕組み無さそうだし、こういう漏れは結構ありそう
Avatar
omochimetaru 4/25/2019 3:17 AM
ありそう
Avatar
Darwinでnestedな型になった文字列定数系がcorelibs-foundationではそのままとかよくあります
Avatar
async/await が導入されたら [weak self] やりたくなることが多そうだけどどうなるんだろう?↓とか? func asyncFoo() async { weak var welf: ViewController? = self let isFinished = await UIView.animate(withDuration: 0.5, animations: { ... }) guard let self = welf else { return } ... }
2:37 AM
guard let だと同一スコープで複数回同じ名前付けれないから、これまでネストしてた非同期処理で guard let self = を何度も書けなくて self のシャドーイングに落ち着いた名前問題が再燃する? (edited)
2:38 AM
await 後は(同一スコープなのに)いきなり明示的 self. が必要になったり、色々変な感じになることがありそう・・・。 (edited)
Avatar
omochimetaru 4/26/2019 5:04 AM
awaitより後ろは暗黙のselfキャプチャーで良いのではないかと思ってます
5:05 AM
コルーチンが終了すれば解放されるのでリークはしないし。
Avatar
そうか。普通の非同期処理だとリークしないからいいか。
Avatar
暗黙strong selfどうにかして破壊できないかな
5:20 AM
defer組み合わせて壊せないだろうか
Avatar
omochimetaru 4/26/2019 5:22 AM
通常のクロージャだと明示だよね、inner func だと暗黙
Avatar
async なクロージャと組み合わせられるとまずそう?
5:24 AM
class C { let foo: () async -> Void = { [weak self] in guard let self = self else { return } await bar() baz(self) } } (edited)
Avatar
inner func暗黙、マジで壊れるんで危ない
5:24 AM
inner computed varも壊れやすい
Avatar
まずくないか
5:27 AM
クロージャ保持する時点で [weak self] 挟むから大丈夫か (edited)
5:30 AM
↓とかクロージャ終了しないけど、単純な非同期処理じゃなくて、こういう使い方でリークしてしまうこととかないかな? let fibs = Generator { yield in var (a, b) = (0, 1) while true { await yield(a) (a, b) = (b, a + b) } }
Avatar
omochimetaru 4/26/2019 5:35 AM
それはありえますね。まあ、同期だったらと考えると、永遠に脱出しない関数なので、それで当然という感じもします
5:36 AM
func actInf() { while true { sendMessage() } } ↑もしこれを(別スレッドなどで)呼び出したらselfは永遠に解放されない
Avatar
omochimetaru 5/13/2019 4:03 AM
SwiftでDiscord Botつくるとして、 2つライブラリがあるっぽいんですが、どっちが良いとか知見ある人います? https://github.com/nuclearace/SwiftDiscord https://github.com/Azoy/Sword とくに @norio_nomura @Kishikawa Katsumi
Discord API Client for Swift. Contribute to nuclearace/SwiftDiscord development by creating an account on GitHub.
Discord library for Swift. Contribute to Azoy/Sword development by creating an account on GitHub.
Avatar
Kishikawa Katsumi 5/13/2019 4:07 AM
私はNodeで書いてるのでわからないです。一般的な観点だと、DiscordのAPIはそんなに機能がたくさんあるわけでもないから、機能の未サポートとかで苦労することはあまりなさそうなので、使いやすそうなものを選んだらいいのでは、という気がします。
Avatar
omochimetaru 5/13/2019 4:08 AM
ふむふむ。
Avatar
norio_nomura 5/13/2019 4:09 AM
僕はSwordの古いバージョンをカスタマイズして使ってる。
Avatar
omochimetaru 5/13/2019 4:09 AM
Swordを選んだ理由はなんかありますか?あと最新じゃないのも気になるw
Avatar
norio_nomura 5/13/2019 4:11 AM
以前は各バージョンのSwiftそれぞれでビルドしていたため、複数バージョンのSwiftでビルド出来る必要があり、Swift 4.0でもビルドできるモノを元に独自バグフィクスしたものになっています。>最新じゃない。 (edited)
4:12 AM
Swordを選んだのはクロージャでイベントを取れたから。SwiftDiscordはdelegateじゃなかったかな?
Avatar
omochimetaru 5/13/2019 4:18 AM
なるほどなるほど。クロージャとデリゲートの違いは個人的にはでかいですね、そのあたりのAPIを見比べて見ようと思います。 ふたりともありがとうございます。
Avatar
norio_nomura 5/13/2019 4:20 AM
あいや、クロージャでイベントを取れたことより、ビルド出来るSwiftのバージョンの方が決め手だったかも?定かではないですが。
4:21 AM
Swordは僕が使ってるものからメジャーバージョンが上がって、少し変わったのかも。
4:21 AM
ボットアプリをビルドするSwiftのバージョンを固定する様に変えたので、今だと違うものを選ぶかも。 (edited)
Avatar
omochimetaru 5/13/2019 4:22 AM
ふむふむ。
Avatar
norio_nomura 5/13/2019 4:26 AM
受け取るDiscordのイベント定義をもっと柔軟に出来るものを、Swift-NIOで自分用に書こうとして未完。
Avatar
norio_nomura 5/13/2019 4:39 AM
以前は、SwordもSwiftDiscordも外部依存するパッケージに加え更にSodiumとか外部ライブラリが必要だったけど、Swordはその辺り不要になったぽい。
4:41 AM
今選んでも「Swordをカスタマイズ」かな。
4:43 AM
テストがちゃんと書かれてたらPRも書くのだけど。>Sword
Avatar
omochimetaru 5/13/2019 4:54 AM
なるほど、ありがとうございます。
Avatar
omochimetaru 5/14/2019 5:14 PM
Swordがswift-nioベースで作り直している途中の状態だったので、未実装部分を書き足して動かしてみたところ、 Discord公式のドキュメントの記述と実際に送られてくるバイナリに不一致があって困った。 API開発者サーバにswift-swordチャンネルがあってAzoyさんも居たので、詳細はそこに書いてきた。 https://discordapp.com/developers/docs/intro#getting-help
Integrate your service with Discord — whether it's a bot or a game or your whatever you wildest imagination can come up with.
5:15 PM
具体的には、transport compression modeにおいてはバイナリを結合して Z_SYNC_FLUSH = 00 00 FF FF でスプリットしろと書いてあるがこの4バイトが見当たらない。
Avatar
途中なのか。
Avatar
めちゃくちゃ途中で、SwordはTLSの設定してないからwss動かないので全く動かないし nio-websocketはバイナリフレームの処理が書いてない
12:48 AM
普通に作業中にコミットしたそのまんまって感じ まあ自分もよくやる
Avatar
norio_nomura 5/15/2019 4:06 AM
そうか、書き換え終わってなかったのか。
4:07 AM
vaporのWebSocket実装は気に入らなかったから、その辺りも含めて途中まで自分で実装したやつを再開しようかな。
Avatar
norio_nomura 5/15/2019 4:25 AM
あとTransport Compressionは、ここで僕が動かしてるボットで使ってるSwordはサポートしていなかったはず。 (edited)
Avatar
omochimetaru 5/15/2019 4:33 AM
ああ、接続時にそれを有効にするコードが、最新の作りかけコミットで導入されていたので、タイミング的にそうですね
4:34 AM
その辺を外せば動かすことはできそうなんですが、
4:34 AM
そういうのは悔しいから動かそうとしてます
Avatar
omochimetaru 5/15/2019 2:07 PM
Swordのswift-nio実装が結構壊れている
2:07 PM
WebSocket接続のネゴシエーションって、HTTPRequest/Responseの形で行われるが、
2:08 PM
サーバがHTTPResponseを返して、それ以降のストリームはWebSocketストリームなんだけど、
2:09 PM
HTTPResponseを受け取ってから、 WebSocketClientUpgradeHandlerをチャンネルハンドラから取り除いて、 新しくWebSocketHandlerを取り付ける、って処理が、
2:09 PM
nio/EventLoopFutureの非同期処理チェーンで実装されていて、
2:09 PM
ハンドラのつけ外しが完了する前に、サーバからWebSocketストリームがもう届いてしまっていて、
2:10 PM
タイミングが間に合ってなくてWebSocketストリームを喪失してしまう。
Avatar
omochimetaru 5/15/2019 2:44 PM
非同期なのは関係なかったけど問題はあってた。
2:44 PM
Swordじゃなくてvapor/nio-websocket-clientのバグだ。
😩 1
Avatar
以前VaporのhttpクライアントがTLSのチェックを無効にしてるのを見かけてから、Vaporは避ける様にしてる。
Avatar
omochimetaru 5/16/2019 2:22 AM
それはひどいですね
Avatar
TLSチェック無効は厳しい…
Avatar
norio_nomura 5/16/2019 3:55 AM
  • enable cert validation by default
    • add new HTTPScheme.customHTTPS option
Avatar
norio_nomura 5/16/2019 2:03 PM
以前途中まで書いたDiscordクライアント用ライブラリをSwiftNIO 2.0へ移行してて思い出したけど、自分でHTTP, WebSocketクライアントまで書こうとした理由はPROXYサポートを追加したかったからだった。
Avatar
omochimetaru 5/16/2019 2:05 PM
なるほど。
2:06 PM
その後、下記2件はまとまりました。 vaporのWebSocketClientのバグ修正 https://github.com/vapor/nio-websocket-client/pull/4 Swordの未実装作業の完了 https://github.com/Azoy/Sword/pull/56
I retry #3 This PR resolves #1. Original implementation have this steps. add out WebSocketFrameEncoder add in WebSocketFrameDecoder remove inout WebSocketClientUpgradeHandler upgradePipelineHandler...
I implemented transport compression. I keep code difference small as much as I can. I split changes to some commits so that it is easy to review. I explain detail. 0206648: Change nio-websocket-cl...
Avatar
norio_nomura 5/16/2019 2:13 PM
VaporのWebSocketClientWebSocketClientUpgradeHandler receivedContentschannelReadで受け取ったデータを溜め込む実装は筋が悪いと思うんだよね。 (edited)
Avatar
norio_nomura 5/16/2019 2:20 PM
手元の実装では、WebSocketClientUpgradeHandlerchannelActiveは下流へchannelActiveを発火せず、channelRead.switchingProtocolsを受け取ったら自身をハンドラから削除してから下流へchannelActiveを発火することで、意図しないchannelReadが発生しない様にしてる。 (edited)
Avatar
omochimetaru 5/16/2019 2:29 PM
その作り気持ち悪いですよね。 設計としては swift-nio の HTTPServerUpgradeHandlerを参考にしてます。
2:29 PM
Event-driven network application framework for high performance protocol servers & clients, non-blocking. - apple/swift-nio
2:30 PM
これは NIOWebSocketServerUpgrader で使われてます。
2:30 PM
swift-nioの仕組みを詳しく知らないんですけど、後段がactiveではない場合、送り出したchannelReadがパイプライン中で詰まって?止まってくれるんですか?
Avatar
norio_nomura 5/16/2019 2:39 PM
channelActiveを受け取らない限りreadwriteも起きないと思います。
2:41 PM
あ、WebSocketClientUpgradeHandler channelReadfireChannelReadを呼ばない前提です。
2:44 PM
正確には「channelActive, channelReadを次のハンドラへ流さないことで、次のハンドラからのwriteを抑制して予期しないchannelReadを発生させない」ですね。 (edited)
Avatar
omochimetaru 5/16/2019 2:50 PM
ああそうか、アップグレードが終わるまではUpgradeHandlerで処理が終端してる状態で、終わった瞬間に自殺すれば、タイミング的に綺麗にいきますね
Avatar
norio_nomura 5/16/2019 2:51 PM
そう。
Avatar
omochimetaru 5/16/2019 2:51 PM
考えてみたらSSLネゴシエーションと同じか
2:52 PM
nioのサーバーがそうなってないのは、普段はHTTPサーバーとしてコンテンツを応答していて、リクエストを見てwebsocketにアップグレードするからかな?
Avatar
norio_nomura 5/16/2019 2:52 PM
SSLは暗号化復号化が常に入るから残る必要があるけど、WebSocketは残る必要がない。
Avatar
omochimetaru 5/16/2019 2:52 PM
なんか同じようにできそうな気もするけど・・・
2:53 PM
そか、残るかどうかは違いますね
Avatar
norio_nomura 5/16/2019 2:53 PM
サーバーもコネクション毎にインスタンスが起きるんじゃないのかな。
Avatar
omochimetaru 5/16/2019 2:56 PM
Event-driven network application framework for high performance protocol servers & clients, non-blocking. - apple/swift-nio
2:56 PM
この部分のことです
2:58 PM
上流(HTTPRequestDecoder)がアップグレードリクエストをUpgraderに渡した時点で、 すでに受信して上流がバッファしてしまっているWebSocketストリームを、 上流を外すとともにUpgraderが受け取り、 下流のWebSocketFrameDecoderがくっついてから、 受け取った分を下流に流してから、Upgrader自身が消える
Avatar
norio_nomura 5/16/2019 2:58 PM
ああ、そういうことか。
2:59 PM
サーバーの場合、応答する前にリクエストが来るからだね。 (edited)
2:59 PM
keep alive
Avatar
omochimetaru 5/16/2019 2:59 PM
今の話だと、 Upgraderがアップグレードリクエストを受け取ったタイミングで、 WebSocketFrameDecoderをUpgradeの下流に設置しつつ、 Upgraderを削除してから、上流(HTTPRequestdecoder)を削除したら、 上流がバッファしてたbytesがいきなりWebSocketFrameDecoderに流せないかしら
Avatar
ゲームアプリを公開しました! https://itunes.apple.com/jp/app/kururi/id1463318296?mt=8
‎ステージが回転する落ちものパズルゲームです。 3つ同じ色のブロックを揃えると消えるというシンプルなルールです。 ステージ回転を駆使してブロック削除の連鎖を目指しましょう! It is a puzzle game ...
Avatar
func median<T: Comparable>(bp: UnsafeMutableBufferPointer<T>) -> T { // error: cannot use mutating member on immutable value: 'bp' is a 'let' constant bp.sort() return bp[bp.count / 2] } これってMutableCollectionの定義に従うためだけにmutatingなんですかね🤔
10:22 AM
プロトコルの宣言がmutatingだけど実装はmutatingじゃなくていい場合はthrowsと違って考慮されていない気がします。 まぁそもそもそんなケースがたくさんありそうもないですが。
Avatar
そのケースの場合は一度varにコピーすれば良い?
12:25 PM
mutatingでなくて良いなら、noutatingなsortをその型に対して生やせそう
Avatar
生やせそうだけど、 struct である UnsafeMutableBufferPointernonmutating func で状態が変更されるってカオスな気も。
12:34 PM
と、思ったけど、 subscript はすでにそうだった。
Avatar
型名のMutableはメモリのミュータビリティで
12:34 PM
メソッドのmutatingはポインタと長さのそれ自体のミュータビリティだから
Avatar
いやもちろんそうなんだけど。
Avatar
良さそう
Avatar
nonmutatimg func でオーバーライドができればいいのかな?
12:37 PM
オーバーライドというか、実装。
Avatar
オーバーロードかな?
12:37 PM
protocolのconform?
Avatar
うん、conform (edited)
Avatar
MutableCollectionのprotocol extからやってくるmutating版を無効にして
12:38 PM
自前で定義したnonmutating版が生えるのが良いのかな
Avatar
@swift-5.0.3 protocol P { mutating func foo() } extension P { mutating func foo() { print("P") } } struct S: P { func foo() { print("S") } } let s: S = S() s.foo() // ↓エラー // let p: P = s // p.foo() var p: P = s p.foo()
Avatar
S S
Avatar
むむ?
12:43 PM
そうなってる?
Avatar
MutableCollectionのprotocol extからやってくるmutating版を無効にして 自前で定義したnonmutating版が生えるのが良いのかな
それでよさそう。 nonmutatingsort 実装できそうだね。
12:43 PM
↑ができるということは単に実装がサボられてる?
Avatar
これcontributeしたほうがいいな
Avatar
contribute というか
12:43 PM
API の変更だから (edited)
12:44 PM
他のも洗い出して Proposal ?
12:44 PM
どっちで対応するか確認するためにも、 evolution に投げた方が良さそう?
Avatar
muttatingは全部やらないとw
Avatar
ポインタ系以外で似たようなものってないかな?
12:46 PM
標準ライブラリじゃないけど、 NSMutableArray とかもなってるかも?
12:46 PM
Sequence だけど MutableCollection じゃないのか。 > NSMutableArray
Avatar
そうなのか。
Avatar
まあとりあえず対応範囲は標準ライブラリでいいとして、ポインタ以外はないかな?普通に考えたらなさそうだけど・・・。
12:48 PM
  • UnsafeMutableAudioBufferListPointer
  • UnsafeMutableBufferPointer
  • UnsafeMutableRawBufferPointer
Avatar
参照的に振る舞うコレクションは標準にはない気がする
Avatar
なるほどwおもしろい。
Avatar
↓の subscript setnonmutating であるべきかは判断が難しい・・・。 https://developer.apple.com/documentation/swift/emptycollection/1541374-subscript
12:51 PM
Avatar
空のsubscript setもnonmutだと思うなぁ
12:52 PM
1個だからw
Avatar
CollectionOfOne については、 sortnonmutating にできるけど、 subscript set はできないね。
Avatar
そうですね
12:52 PM
型の特性によって変わるの面白い
Avatar
ちょっと CollectionOfOne は微妙だし、 EmptyCollection も意見が分かれるかもだけど、ポインタ系はやるべきな気がするね。 subscript setnonmutating なわけだし。
12:54 PM
MutableCollection 以外で Mutable*nonmutating できそうなものとかあるかなぁ。
Avatar
ああーそうか、他にもあり得るか
12:59 PM
この辺のMutablrCollectionのさらにサブプロトコルで
12:59 PM
mutating funcがいますね
Avatar
RangeReplaceableCollection 見てたけど、 append とかはできないよね。
Avatar
count を書き換えないといけないから。
1:00 PM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 5/23/2019 1:01 PM
お。バッファポインタについてはそうですね。
Avatar
バッファポインタってそもそも append 生えてないのか。
1:02 PM
let count だけど、一応 self 書き換えはできるだろうけど。
1:02 PM
最初にでかい領域を確保しておいて、その一部をバッファポインタに割り当てて append とかもない? (edited)
Avatar
omochimetaru 5/23/2019 1:03 PM
なさそう、そういうのを作るためのプリミティブな道具だと思ってた
Avatar
UnsafeMutableAudioBufferListPointer って初めて見た。
1:04 PM
ああ
1:05 PM
標準ライブラリじゃないのか
1:05 PM
Core Audio に飛んでた・・・
1:06 PM
ってことは↓だけでいいのかな?
  • UnsafeMutableBufferPointer
  • UnsafeMutableRawBufferPointer
1:06 PM
PR 作った上で、 pitch として evolution に投げてみても良さそう。
Avatar
omochimetaru 5/23/2019 1:07 PM
ですね
Avatar
今やる時間ないので @omochimetaru に任せます。
Avatar
omochimetaru 5/23/2019 1:09 PM
暇な時に・・・😑
Avatar
特にやりたいわけでなければ、こちらで暇なときにでも投げてみます🙂
Avatar
一晩見てないうちに大量に……(最近iphoneの方に通知が来ない気がする)
12:36 AM
mutatingな宣言をnonmutatingで実装するの自体はできるんですね。調べてなかったです。 (edited)
Avatar
nonmutatingをmutatingで実装はぶっ壊れますが逆は問題無さそう
Avatar
protocol P { mutating func foo() } extension Array: P { func foo() { } } var a = [0, 1, 2] var p: P = a p.foo() こういう形のときCoWがどうなるんだろうとか思ったり。
Avatar
CoWは実際にバッファ操作されてからかな?と考えてましたがどうでしょうか
Avatar
今同じこと思いついてました。mutatingであるかどうかだけでCoWが働く必要はないですね。
Avatar
mutatingの宣言はlet宣言を禁止するためのものなので、その先で何が起こるか、は問題では無いと思いました。極端な話、mutatingで実装してnonmutatingをコールしても良いのでは
12:42 AM
(オーバーロードできるなら).
Avatar
別件ですけどこれもmutatingである必要が無いですよね。 func test1(bp: UnsafeMutableBufferPointer<Double>) { bp[0] = 0 } func test2(slice: Slice<UnsafeMutableBufferPointer<Double>>) { slice[0] = 0 // error: cannot assign through subscript: 'bp' is a 'let' constant } こっちは対処するのめんどくさそうですが……
Avatar
極端な話、mutatingで実装してnonmutatingをコールしても良いのでは
呼び出しの時のselfの型が違うのでそれはできない computed propertyへの書き戻しがされないなどのバグが起きるはず
Avatar
1:00 AM
多分逆な気が
1:00 AM
表現が良くなかったな
Avatar
そもそも分岐しないので書き戻しの必要がないってことですよね。
Avatar
func f() { ここに実装があるよ } mutating func f() { f() } // プロトコルへのconformだよ これが出来れば丸く解決する (edited)
Avatar
ああ、そういう。
Avatar
omochimetaru 5/24/2019 1:01 AM
そっちはオーケー
Avatar
宣言無しでもそういう動きなら良い
Avatar
omochimetaru 5/24/2019 1:02 AM
nonmutatingの方だけ実装すればprotocol conformになる
1:02 AM
mutatingなやつが内部的に作られてPWTにいれられてると思う
Avatar
つまり今回のはfuncの宣言に余計なmutatingが張り付いてるね、という話なのね
Avatar
omochimetaru 5/24/2019 1:04 AM
いや、宣言があるのはMutatingCollectionのprotocol extensionだから、それ自体は余計ではない
1:04 AM
nonmutatingな実装を一部の型は自前で定義をもたないといけないって話
Avatar
もう一回読み直そう
Avatar
omochimetaru 5/24/2019 1:05 AM
余計なものがあるんじゃなくて最適なものがまだないので不便、というむき
Avatar
A lot of the MutableCollection implementation is in protocol extensions (swapAt, for example.) Should an additional version be written just for the Unsafe*BufferPointer types? Makes sense to me, given the examples above. It doesn’t seem to be a high priority task though, ...
1:33 AM
As far as I can see, MutableCollection defines four mutating methods: swapAt(), sort(), reverse(), and partition(). Implementing those as non-mutating methods of UnsafeMutableBufferPointer seems natural to me.
Avatar
omochimetaru 5/24/2019 1:36 AM
glessardさんがコメントしてるけど今回のとはズレてるな
Avatar
なんかこの inout の話、前に話したことあるよね。 withUnsafeMutableBufferPointer inout は過剰だけど、現状表現できるものが inout しかないって。
Avatar
omochimetaru 5/24/2019 2:34 AM
記憶なし
Avatar
でももしかしてバッファポインタ側が nonmutating で実装されれば問題ない?
2:35 AM
https://discordapp.com/channels/291054398077927425/306995750418513920/422937036870385684 ↑これっぽい。前に話したの。 Discord の検索優秀。 (edited)
Avatar
BP自体を変更したいことがあるかどうかですね。というかそういう内容が↑に貼ったフォーラムの本題だと思われます。
Avatar
omochimetaru 5/24/2019 2:38 AM
うおーなつかしい
2:38 AM
なるほどおまけでescapeをブロックしているのか偉い
Avatar
@t.ae 「BP自体を」ってのは self 書き換えならぬ inout で渡されたもの自体を書き換えることを言ってる?↓みたいな感じで。 array.withUnsafeMutableBufferPointer { p in p = q }
Avatar
omochimetaru 5/24/2019 2:39 AM
このときの会話のログだと、inoutになってるのは単に歴史的経緯って感じじゃないですか?
Avatar
Array.withUnsafeMutableBufferPointerがbodyにinout UnsafeMutableBufferPointerを渡すんだけ inoutを用いて書き換わってるとエラーになる。
(edited)
Avatar
omochimetaru 5/24/2019 2:40 AM
書き換えを実行時に咎めるならletで渡して欲しいね
Avatar
@escaping にキャプチャされることを防ぐためには inout が必要だけど、ポインタ自体の書き換えは封じられてるから、 inout のそれ自体を書き換えられる機能は要らないという理解。
Avatar
omochimetaru 5/24/2019 2:44 AM
@escaping にキャプチャされることを防ぐためには inout が必要
これは「たまたまそういう恩恵が得られた」わけじゃなくて、そのためなんですか?
2:45 AM
キャプチャされることを防いだところで、 return bp しちゃえば取り出せるからあんまり意味ないと思う
Avatar
たまたまかもしれないけど、意図的に取り出す return bp と意図せずやってしまうキャプチャとでは、後者だけ防げるのは意味がある気がする。
2:47 AM
歴史的経緯だけなら、ポインタ書き換えを防ぐ処理を入れるくらいだったら、その時点で inout を外すことを検討しても良さそうな気も。
Avatar
omochimetaru 5/24/2019 2:48 AM
ふ〜む
Avatar
このスレッド、元の話はともかく、↓とかは同じことを話してるよね? The issue with changing .swapTo (et al.?) to nonmutating is that semantically it really is a mutation. But pointers as collections have different mutation semantics to other collections: Mutating an Array’s storage is the same as mutating its value, whereas a pointer’s value is its address, not its storage. Making the Unsafe*Pointer MutableCollection methods themselves nonmutating probably wouldn’t be a source-breaking change (it’d just lower the “bar of entry” to include let constant instances too). I imagine this is noncontroversial. https://forums.swift.org/t/why-does-the-withunsafemutablebufferpointer-closure-take-an-inout-parameter/6794/10 (edited)
A lot of the MutableCollection implementation is in protocol extensions (swapAt, for example.) Should an additional version be written just for the Unsafe*BufferPointer types? Makes sense to me, given the examples above. It doesn’t seem to be a high priority task thou...
Avatar
omochimetaru 5/24/2019 2:51 AM
But pointers as collections have
different mutation semantics to other collections まさにまさに
Avatar
ポインタ書き換えの話もしてるけど、 @escaping キャプチャ防止の話はされてなさそう?
Avatar
Currently this code is not compilable. func median(bp: UnsafeMutableBufferPointer) { bp.sort() // error: cannot use mutating member on immutable value: 'bp' is a 'let' constant return bp[bp.count/2] } It is because sort, defined in MutableColelction, is mutating. U...
👍 1
Avatar
@t.ae オーバーロードじゃないんじゃない? (edited)
Avatar
omochimetaru 5/24/2019 3:07 AM
たしかに。
Avatar
デフォルト実装があるんでオーバーロードかと思いますけど 言葉に自信がないですね・・・
Avatar
omochimetaru 5/24/2019 3:07 AM
デフォルト実装は消えるよ
3:07 AM
PWTにはデフォルトか固有のどっちかしか入らない
3:08 AM
もちろんstaticにMutableCollectionとしてみなしたときは呼び出せる。
Avatar
あー両方残るわけじゃないのか。
3:08 AM
じゃあなんていうんでしょう?overwritten?
Avatar
omochimetaru 5/24/2019 3:08 AM
conform to protocol requirement method by nonmutating one for it だと思う (edited)
Avatar
実はsortはprotocol requirementじゃないという
Avatar
omochimetaru 5/24/2019 3:09 AM
overrideでもoverloadでも無いと思う
3:10 AM
あ〜
Avatar
partitionとかはそうなんですがsortはただのprotocol extension
Avatar
omochimetaru 5/24/2019 3:10 AM
そうするとそれはoverloadになりそう。
3:10 AM
overloadされた上でnonmutating優先での探索になるんじゃないか
Avatar
文章的には……overload or ~って書くと長いしoverloadだけで伝わりそうなのでそのままにしときます。
3:12 AM
nonmutating優先というかBPに実装されるのでより狭い型のほうを取ることになるはずですね。 (edited)
Avatar
omochimetaru 5/24/2019 3:12 AM
ああ、生えてる場所が自分だからの優先か
Avatar
@swift-5.0.3 protocol P { // mutating func foo() } extension P { mutating func foo() { print("P") } } struct S: P { func foo() { print("S") } } let s: S = S() s.foo() // "S" var s2: S = S() s2.foo() // "S" var p: P = s p.foo() // "S"
Avatar
S S P
Avatar
@swift-5.0.3 protocol P { // mutating func foo() } extension P { mutating func foo() { print("P") } } struct S: P { func foo() { print("S") } mutating func foo() { print("S2") } } let s: S = S() s.foo() // "S" var s2: S = S() s2.foo() // "S" var p: P = s p.foo() // "S" (edited)
Avatar
exit status: 1 with stderr:<stdin>:15:19: error: invalid redeclaration of 'foo()' mutating func foo() { ^ <stdin>:12:10: note: 'foo()' previously declared here func foo() { ^ (edited)
Avatar
オーバーロードというのもミスリードしそうな気も?
3:16 AM
オーバーロードはオーバーロードだけどシャドーイングされてて S のままでは呼び出せないし。
3:17 AM
sortMutableCollection にないのは、 ElementComparable じゃないといけないからか。
Avatar
shadowがどちらの場合も表せて良さそうなので使います。
Avatar
Implement とかでいいんじゃないかな? conform のときはシャドーイングじゃないし。
3:21 AM
Implement buffer pointer’s MutableCollection methods as nonmutating
3:22 AM
とかだと、都合よく conform なのか overload/shadow なのか解釈してくれそうな気が
Avatar
メソッドをimplementするとプロトコルをimplementするのダブルミーニングですねw
🙂 1
Avatar
@swift-5.0.3 -O import Foundation func time(label: String, f: ()->Void) { let start = Date() f() print("\(label): elapsed time: ", Date().timeIntervalSince(start), "sec") } var x = [Int](0..<65536) x.withUnsafeMutableBufferPointer { bp in time(label: "Slice") { bp[0..<60000].sort() } time(label: "Rebase") { var rebase = UnsafeMutableBufferPointer(rebasing: bp[0..<60000]) rebase.sort() } } (edited)
Avatar
exit status: 11 with stderr:Stack dump: 0. Program arguments: /usr/bin/swift -frontend -interpret - -disable-objc-interop -I /Libraries/.build/x86_64-unknown-linux/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/include -module-cache-path /Libraries/.build/x86_64-unknown-linux/debug/ModuleCache -O -D DEBUG -Xcc -fmodule-map-file=/Libraries/.build/checkouts/SwiftBacktrace/Sources/CSwiftBacktrace/include/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/checkouts/SwiftBacktrace/Sources/Clibunwind/include/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux/debug/CNIOHTTPParser.build/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux/debug/CNIOSHA1.build/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux/debug/CNIOAtomics.build/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux/debug/CNIODarwin.build/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux/debug/CNIOLinux.build/module.modulemap -module-name main -lLibraries /usr/bin/swift[0x4626bd4] /usr/bin/swift[0x46249a0] /usr/bin/swift[0x4626d82] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7fbbc7af7390] [0x7fbbc7f25d22] [0x7fbbc7f25837] [0x7fbbc7f24e3b] [0x7fbbc7f24d08] [0x7fbbc7f24af7] [0x7fbbc7f24862] [0x7fbbc7f242d3] /usr/bin/swift[0xcf1a7e] /usr/bin/swift[0xcf5c92] /usr/bin/swift[0x5162df] /usr/bin/swift[0x4eb215] /usr/bin/swift[0x4e66b6] /usr/bin/swift[0x48da2e] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fbbc (edited)
Avatar
Sliceのソートが遅い
Avatar
omochimetaru 5/24/2019 6:12 AM
Releaseビルド? (edited)
Avatar
あーそれもあるな。オプションなんでしたっけ?
Avatar
omochimetaru 5/24/2019 6:12 AM
-O
Avatar
一応time profilerでも遅いことは確認してます。
Avatar
omochimetaru 5/24/2019 6:12 AM
Sliceはジェネリック型だから
6:12 AM
Specializeされないと遅いはず
Avatar
string1 += string2 はちゃんと string1 = string1 + string2 よりも効率的に実装されてるのか。 https://github.com/apple/swift/blob/master/stdlib/public/core/String.swift#L575-L577
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
7:17 AM
他の += もかな。
7:18 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
https://github.com/apple/swift/blob/master/stdlib/public/core/Array.swift#L1323-L1327 +がappendで実装されてるのか…… 最適化でどうなってるかわからないですがuninitialized initializer使ったほうが速そう。
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
CoW のアロケートは効率的に実装されてるんじゃないかな?
Avatar
CoWというかappendで拡大する場合のほうですね。
Avatar
ああ、最初から結合後の capacity を持っておいたいいってことか。
Avatar
会社の開発合宿でVC間の関連を図示するツールの開発をSwiftSyntaxを使って試みたんですが、どうしてもアプリごとの設計によってうまく図示できなかったりしまして (edited)
11:42 AM
汎用的なツールをめざすなら、完全なコールグラフが必要かと思うんですが、どういう手法がありますかね? (edited)
Avatar
CarthageのためにSwiftPMプロジェクトにxcodeprojコミットすること割とあったんですけどXcode11のSPM対応のおかげでxcodeproj不要になりましたね。 CarthageのSPM対応PRは二年前からオープンだけどいつマージされるんだろうか……
Avatar
omochimetaru 6/12/2019 8:07 AM
まだ、リソースがある場合とかは、必要な気がする
Avatar
その場合は確かに。
Avatar
swiftのUnsafe〜のネーミングってルール特に無いですよね? Unsafe*Pointerをラップした型があって、それにUnsafeプレフィックスが必要かどうか迷ってるんですが。 更にいうとwithUnsafePointerとかはunsafeが自然に付いてるのでいいんですが、同様の引数でsomeFuncというのを作りたい場合それはunsafeSomeFuncにすべきかとか……
Avatar
omochimetaru 6/13/2019 1:49 AM
Unsafeはコンパイラが未定義動作を起こしうるときについてる気がする
1:49 AM
型名についてればその型を使うほとんどが危険で
1:49 AM
メソッド名の場合はそれを使うときだけ危険
1:50 AM
クラッシュしうるけど未定義ではない(チェックによる確実な自殺がある)ケースは
1:50 AM
Swiftではunsafeとは呼ばれてない
Avatar
>クラッシュしうるけど未定義ではない(チェックによる確実な自殺がある)ケースはSwiftではunsafeとは呼ばれてない これは確かに……
Avatar
omochimetaru 6/13/2019 1:51 AM
ロジックによって死ぬ限りはsafe (edited)
1:51 AM
例えばunsafeBitCastとかも
1:51 AM
本当にキャストしてよかったのかどうか一切検査されない
1:51 AM
逆にas!によるキャストは真の型を実際に検証する。 (edited)
Avatar
新しいケースだと5.1のuninitialized initializerはラベルにunsafeついてるんですよね public init(unsafeUninitializedCapacity:,initializingWith initializer:) これinit+末尾クロージャのみのケースではだったらどうするんだろう……
Avatar
omochimetaru 6/13/2019 1:54 AM
クロージャ名のラベルにunsafeが含まれるんじゃない?
1:54 AM
trailing記法は死んじゃうけどまあ仕方ない
1:55 AM
static methodにするっていう意地を張る事はできるかもしれん
Avatar
これが進んだらinitializerもunsafeかけるようになって https://forums.swift.org/t/unsafe-functions/20137
Following the discussion about pointer type sugar (Int* which would be sugar for UnsafePointer etc. here: Swift Pointer Syntatic Sugar), Slava mentioned "unsafe" blocks + function annotation where such sugar could be utilized. This is a feature that is found in languages like...
1:56 AM
良いかもしれない。
Avatar
omochimetaru 6/13/2019 1:57 AM
またAzoy氏だ
1:57 AM
unsafe contextの静的検証か〜
1:59 AM
これやるなら
1:59 AM
do-catch try みたいに
1:59 AM
文単位markingの仕様じゃないと
1:59 AM
どこがunsafeXxxなのかわからなくて中途半端になりそうだね
1:59 AM
C#とRustはそうだったっけ?
Avatar
というのを僕が書いたら返信がないまま止まってます
Avatar
omochimetaru 6/13/2019 2:01 AM
Discussion止まっても進めたければproposal書いてpitch投稿するしかないんだろーなー
Avatar
特に需要ないかと思ってたんですがinitの場合のみは便利そうだと今思ったんですよね。
Avatar
omochimetaru 6/13/2019 2:02 AM
個人的にはunsafe contextを導入する必要無い気がする
2:02 AM
まあそうだけど、クロージャに
2:02 AM
UnsafePointer渡ってくるならわかるし
2:03 AM
ポインタが絡まないunsafeなinitのパターンを思いつかない。
Avatar
それはそうですね。 その場合クロージャ引数のUnsafe~でunsafeなことが表明されてるので関数名には要らないんじゃないかというのが僕の考えなんですが。 (edited)
Avatar
omochimetaru 6/13/2019 2:06 AM
trailing closureでラベルが消えた場合の予備的な話だから原則はつけるで良い
Avatar
@swiftbot let a = [0, 1, 2] a.withUnsafeBufferPointer { defer { print($0) } _ = $0 }
🛠 1
Avatar
swiftbot BOT 6/18/2019 7:03 AM
Author icon
t.ae
let a = [0, 1, 2] a.withUnsafeBufferPointer { defer { print($0) } _ = $0 }
Version:
swift-4.2.1-RELEASE
Output:
Error:
/usercode/main.swift:4:15: error: anonymous closure argument not contained in a closure print($0) ^
Avatar
deferはクロージャを取るのか🤔
Avatar
omochimetaru 6/18/2019 7:05 AM
うん そこ構文的にそうなっちゃうのか
Avatar
https://bugs.swift.org/browse/SR-2305 大昔から報告されていた
Avatar
https://github.com/apple/swift/blob/2df36527d3d73c69966c3118be8e13cae544d8c4/stdlib/public/core/Integers.swift#L136-L138 これ@inlinableでも@_transparentでもないのか…… .zeroじゃなくて0書くだけで少し高速化できる。 (edited)
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 6/20/2019 8:01 AM
bugs切っても良さそう
Avatar
そのままPR出してもよさそうな内容ですけどね。 bugsに報告しつつ自分にアサインしてPRがいいでしょうか。
Avatar
omochimetaru 6/20/2019 8:55 AM
駄目ならPRがrejectされるだけなのでそれでも良いと思う
Avatar
ではそれでやってみます。
Avatar
素朴な疑問なんですけど、String.init(cString:)が取る型はなぜUnsafePointer<Int8>で、UnsafePointer<UInt8>ではないんでしょうか? Character.asciiValueはUInt8なので気になりました。 let ptr = UnsafeMutablePointer<Int8>.allocate(capacity: len) ptr[0] = Int8(Character("n").asciiValue!) ptr[1] = Int8(Character("e").asciiValue!) ptr[2] = Int8(Character("k").asciiValue!) ptr[3] = Int8(Character("o").asciiValue!) ptr[4] = Int8(Character("\0").asciiValue!) let immutablePtr = UnsafePointer<Int8>(ptr)! let neko = String(cString: immutablePtr) (edited)
Avatar
omochimetaru 6/25/2019 7:27 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
7:28 AM
そこの型は本当はCCharなんですよ。
7:28 AM
CCharInt8のtypealiasなのでInt8に見えます。
7:28 AM
Character.asciiValueに関してはアスキーキャラクターコードが 0x00 - 0xFF だからだと思います。
Avatar
あ、そうでした、正確には UnsafePointer<CChar>で、そのaliasはなんでUint8ではないのかなーと
7:29 AM
> Character.asciiValueに関してはアスキーキャラクターコードが 0x00 - 0xFF だからだと思います。 naruhodo
7:30 AM
あー、
7:30 AM
cにおけるcharは、符号付き1バイトなので、それに合わせようとするとtypealias CChar = Int8になるのですね
7:35 AM
うーん、ASCIIは0x00 - 0x7Fだと思ってたのですが、この理解はもう古い感じですかね
Avatar
omochimetaru 6/25/2019 7:36 AM
Ailias先に関しては
7:36 AM
おそらくそのアーキテクチャでのC言語におけるcharがsignedかunsignedかによって決まっていて
7:37 AM
Cにおけるchar型って負数をもつか持たないかがコンパイル環境によって変わります、それと連動してると思ってます。
7:38 AM
ASCIIは0x00 - 0x7Fだと思ってた
たしかにそうですね。
7:39 AM
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
7:39 AM
asciiValue propertyのproposalですが、型についての言及が無さそう。
Avatar
Cにおけるchar型って負数をもつか持たないかがコンパイル環境によって変わります、それと連動してると思ってます。
なんと、恥ずかしながらsigned固定かと思ってました。ありがとうございます
Avatar
omochimetaru 6/25/2019 7:41 AM
Our nightly master branch build on s390x failed with the following error: 09:09:39 /home/swiftbuild/workspace/Swift/CONFIG/FIVE/GIT_BRANCH/master/label/csz25097/swift/lib/Parse/Lexer.cpp:2460:17: error: overflow converting case value to switch condition type (-2 to 254) [-We...
7:41 AM
s390xっていう謎のCPUがunsignedで、
7:41 AM
それの影響で自分のPRが壊れた事がw
7:42 AM
レビュースレッドでも言及が無い気がします
Avatar
↑にあげていただいたproposal、確かに特に説明なくUInt8で置かれてますね。
Avatar
omochimetaru 6/25/2019 7:43 AM
なんとなくunsignedのほうがいい気がしますが、0x00-0x7Fを表現するという意味ではInt8でもUInt8でも全く同じですねえ
Avatar
s390x,,,初耳です
Avatar
omochimetaru 6/25/2019 7:44 AM
IBMのメインフレームらしいです。
😩 1
7:45 AM
これ以上調べるなら、ここに書き込んで聞いてみるしかないかも? https://forums.swift.org/t/accepted-with-modification-se-0221-character-properties/14944
SE-0221: Character Properties has been accepted, with the exception of the .isEmoji property. The core team accepts the principle for the isEmoji property, but wants to continue the discussion of exactly how it should work. Therefore the thread will remain open for this spec...
Avatar
0x00-0x7Fを表現するという意味ではInt8でもUInt8でも全く同じですねえ
ですね。
Avatar
omochimetaru 6/25/2019 7:45 AM
規格上は、C言語のcharは1byte保証すら無いらしいですよ
7:46 AM
ビット幅8bit以上の整数型としか決まってないらしくて
Avatar
個人的に気になるので、案内頂いたforrumでも聞いてみます。 8bit以上 なんですね、知らなかったです。。
7:47 AM
それで、C++20で、符号なし8bitの文字用の型 char8_t が新たに導入されるらしい。
🤔 1
Avatar
norio_nomura 6/25/2019 9:24 AM
UTF8を受け取るCのAPIがUnsafePointer<UInt8>!とかになってたりするから、UTF8でもあるasciiValueUInt8の方が便利そう。
Avatar
たしかに。
Avatar
Swift uses unsigned types for these purposes throughout the language: ASCII.CodeUnit is a typealias for UInt8.
Avatar
AtCoderやったことないけど、↓書いておいたらSwiftアップデートしてもらえるのかな?よくSwiftのバージョンが古いと言ってる人を見かけるので。 https://twitter.com/chokudai/status/1145624486546309120?s=21
言語アップデートのSpreadSheet出しておきまーす。編集してねー。 (良く分かってる人がいくつか書いてくれないと多分訳が分からない状態なのでchokudai垢のみで先行告知してます) https://t.co/1AY9yVyKM3
11:46 PM
こういうときこそ -Ounchecked (edited)
Avatar
omochimetaru 7/2/2019 12:34 AM
たしかに使い所な気がする
Avatar
Swift もできてたので -Ounchecked を提案してみた。
Avatar
protocol Protocol { associatedtype T1 associatedtype T2 func myFunc<Bar, Baz>(_: Bar) -> Class<Bar.T1, Baz> where Bar: Class<T1, T2> } class Class<T1, T2> : Protocol { func myFunc<Bar, Baz>(_: Bar) -> Class<Bar.T1, Baz> where Bar: Class<T1, T2> { } } このコードをコンパイルしようとすると Abort Trap:6 になるのですが、これって既知のバグでしょうか 🤔
11:23 AM
もうちょっとシンプルにできました protocol Protocol { associatedtype T1 func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T1> } class Class<T1> : Protocol { func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T1> { } }
Avatar
あー、型パラと同名のassoctypeは壊れてます
11:25 AM
確かチケット切ったはず
Avatar
お、ありがとうございます 🙇
Avatar
無かった…夢かな?
Avatar
もうちょい調べてみます!
Avatar
似たような奴はレポートしてたので参考になれば。 https://bugs.swift.org/browse/SR-9533
🙇 1
Avatar
@swiftbot protocol Protocol { associatedtype T1 func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T1> } class Class<T2> : Protocol { func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T2> { } }
🛠 1
Avatar
swiftbot BOT 7/3/2019 11:56 AM
Author icon
freddi
protocol Protocol { associatedtype T1 func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T1> } class Class<T2> : Protocol { func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T2> { } }
Version:
swift-4.2.1-RELEASE
Output:
Error:
/usercode/main.swift:4:43: error: reference to invalid associated type 'T1' of type 'Bar' func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T1> ^ /usercode/main.swift:7:7: error: type 'Class<T2>' does not conform to protocol 'Protocol' class Class<T2> : Protocol { ^ /usercode/main.swift:2:20: note: protocol requires nested type 'T1'; do you want to add it? associatedtype T1 ^
Avatar
あ、ミスった
Avatar
@Yuta Saito san 型パラと別名のassociatedtypeにしたら通ったのと、https://bugs.swift.org/browse/SR-9533 のRogerさんのコードのスタックトレースのWhile emitting witness table for protocol conformance to ...が僕のと同じなので既知のBugでした、ありがとうございました 🙇
Avatar
そういえばRogerさんはLINEの方でしたね
Avatar
あ、気づかなかったけどそのRogerさんだ
Avatar
@swift-4.2.4 @swift-5.0.3 swift struct ZeroRNG: RandomNumberGenerator { // Implements `mutating func next() -> UInt64` func next() -> UInt64 { return 0 } } let rng = ZeroRNG() print(rng.next()) var rng2 = rng print(Float.random(in: 0..<1, using: &rng2)) (edited)
Avatar
swift50 BOT 7/4/2019 6:01 AM
0 0.0 (edited)
Avatar
swift42 BOT 7/4/2019 6:01 AM
0 0.0 (edited)
Avatar
protocol側でmutatingとされてるのをnonmutatingで実装って前からできてましたっけ? SystemRandomNumberGeneratorあたりにできなかった名残がありますが。 https://github.com/apple/swift/blob/master/stdlib/public/core/Random.swift#L157
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 7/4/2019 6:04 AM
ちょっと前に @t.ae がUnsafePointer系の話したときに
6:04 AM
できることが確認できてた。
Avatar
完全に記憶に無いですねそれ
Avatar
omochimetaru 7/4/2019 6:04 AM
sortとかnonmutatingにできる話
Avatar
ああ、それか。
Avatar
一月ちょっと前でしたね。記憶力が弱い。
Avatar
norio_nomura 7/12/2019 6:43 AM
someassociatedTypeの型を制限する @swift-5.1.5 protocol P1 { associatedtype A var a: A { get } } protocol AisInt: P1 where A == Int {} struct S<A>: P1 { var a: A } extension S: AisInt where A == Int {} func f1() -> some P1 { S(a: 1) } func f2() -> some AisInt { S(a: 1) } print(f1().a is Int) print(f2().a is Int)
Avatar
true truestderr:<stdin>:15:14: warning: 'is' test is always true print(f2().a is Int) ^
Avatar
norio_nomura 7/13/2019 5:32 AM
Combineで このsomeを使ってみようとしたけど、someがネストすると型推測がうまくいかず断念した。
Avatar
norio_nomura 7/18/2019 3:28 AM
Xcode 11 beta 4でCombineの変更多いな。
Avatar
norio_nomura 7/22/2019 5:28 AM
✍ Combineの変更メモ Publishers.DeferredDeferredへ変更 Publishers.EmptyEmptyへ変更 Publishers.FailFailへ変更 Publishers.OnceResult.Publisherへ変更 Publishers.OptionalOptional.Publisherへ変更 Publisher型毎の特化実装メソッドが減る。 PublishedのpropertyWrapper仕様が更新(acceptされた最新ではない) keyPath map関連がFoundationからCombineへ移動。
👏 2
Avatar
norio_nomura 7/22/2019 5:37 AM
APIシグネチャに現れない変更としては、AnyCancellableをちゃんと保持しないと即座に解放される様になり、非同期なPublisherとかも解放されてしまい動かなくなった(たぶん正しい挙動になった)
Avatar
yutailang0119 7/24/2019 2:12 AM
これコンパイル通るし、bar はString?として扱えるのすごいな @propertyWrapper public struct UserDefault<Value> { private let key: String private let defaultValue: Value private let defaults: UserDefaults public init(key: String, defaultValue: Value, defaults: UserDefaults = .standard) { self.key = key self.defaultValue = defaultValue self.defaults = defaults } public var wrappedValue: Value { get { (defaults.object(forKey: key) as? Value) ?? defaultValue } set { defaults.set(newValue, forKey: key) } } } final class A { @UserDefault(key: "foo", defaultValue: nil, defaults: .standard) var foo: String? @UserDefault(key: "bar", defaultValue: nil, defaults: .standard) var bar: String } (edited)
Avatar
norio_nomura 7/25/2019 2:55 AM
CombineのCurrentValueSubjectは CoWとかしないんだね。 当たり前。 let subject1 = CurrentValueSubject<Int, NSError>(1) let subject2 = subject1 subject1.value = 5 subject2.value == 5 // true (edited)
2:59 AM
あ、これ参照型だった…
Avatar
アクションゲームを公開しました!遊んでいただけるとありがたいです。 https://apps.apple.com/jp/app/continue-jump/id1473919172
‎ジャンプし続けて、素晴らしいゴールを目指そう! 2種類のジャンプを横スクロールアクションゲームに追加しました。
Avatar
norio_nomura 7/29/2019 3:58 AM
Codable, Equatable, Hashableとか、その実装がコンパイラにより生成されたものを利用している、を保証する様な仕組みが欲しい気がする。
Avatar
omochimetaru 7/29/2019 3:59 AM
手動実装してたら検出したい?
Avatar
norio_nomura 7/29/2019 4:07 AM
ですね。自動生成されてる実装に対するテストを書きたくない。
Avatar
要素が自動実装かどうかを再帰的にチェックしなきゃいけない?
Avatar
omochimetaru 7/29/2019 4:09 AM
たしかに。自分の場合は手書きから自動に切り替えた時に古い手書き実装がちゃんと消えてるか保証したいことがあります。
Avatar
omochimetaru 7/30/2019 2:16 AM
プロトコルのexistentialがEquatableを与えるとexistentialとして使えなくなるのが不便・・・
2:18 AM
func ==(P, P) が実装してあっても、 P? == P? はできないのですぐ詰まる
Avatar
norio_nomura 7/30/2019 7:55 AM
Xcode 11 beta 5で、Combineの実装がOpenCombineの影響受けてる様に見える。
7:56 AM
具体的にはAnySubscriberの実装が変わった。
7:57 AM
今まではSubscriberが要求する3つのインスタンスメソッドを保持する事で型を消してたけど、Boxクラスを使う形式に変わってる。
8:01 AM
その変更に絡んで、AnySubscriber周りで@inlinableが使われる様になったため、Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Combine.framework/Modules/Combine.swiftmodule/x86_64.swiftinterfaceを見ると実装がほぼ丸見え。
Avatar
konichiwa
8:05 AM
im from philippines
8:05 AM
and i want to work in japan soon
Avatar
norio_nomura 7/30/2019 8:11 AM
@Cheng #recruitment is a suitable channel for job search. However, since it seems that the job search on this server is not active, I think it is better to search on other servers.
Avatar
okay thank you
Avatar
norio_nomura 8/3/2019 7:23 AM
[SE-0249] Key Path Expressions as Functions、まだ実装終わってなかったのか。残念。 https://github.com/apple/swift/pull/26054
This builds on @brentdax&#39;s work in #23435 to handle optional chaining key paths as both KeyPath BGTs and as function types, and also does away with explicit disjunctions to determine which ...
Avatar
norio_nomura 8/3/2019 10:24 AM
Dictionary.subscriptdefaultは、mutatingメンバを使うとDictionaryへ登録できる。 @swift-5.0.3 class ClassBox { var name = "" } var classDictionary = [String: ClassBox]() classDictionary["test", default: ClassBox()].name = "name" print("classDictionary:", classDictionary) struct ValueBox { var name = "" } var valueDictionary = [String: ValueBox]() valueDictionary["test", default: ValueBox()].name = "name" print("valueDictionary:", valueDictionary) (edited)
Avatar
classDictionary: [:] valueDictionary: ["test": main.ValueBox(name: "name")] (edited)
Avatar
norio_nomura 8/6/2019 12:24 AM
別の Combine 互換実装 https://github.com/luoxiu/CombineX
CombineX is an open source implementation for Apple's Combine specs. - luoxiu/CombineX
Avatar
この前話してた Class Existential Container の話、プロトコルの後付けを考えると existential 側に witness table を持つしかないように思うんですがどうでしょうか?
Avatar
omochimetaru 8/8/2019 4:20 AM
それは関係ないんじゃないですか? 現状でも実行時の検索ができている以上。
Avatar
norio_nomura 8/8/2019 4:28 AM
プロトコルの後付けを考えると existential 側に witness table を持つしかない
僕も同じ結論でした。
(edited)
Avatar
@omochimetaru 後付けされたプロトコルに対応したwitness tableをインスタンスに差し込んだらメモリレイアウトが変わっちゃうんじゃない?
Avatar
omochimetaru 8/8/2019 6:58 AM
その観点だけなら、現状でも実行時に検索ができているので関係なくないですか?
7:00 AM
この前の野村さんの実験で、ある型が満たしてるプロトコルすべてを実行時にイテレートできる事がわかった、という理解です (edited)
Avatar
norio_nomura 8/8/2019 7:27 AM
サブクラスが追加でプロトコルに準拠してて、スーパークラス & プロトコルなExistentialを表現する際にはwitness tableが必要になるかと。スーパークラスの時点で準拠してるプロトコルについては不要。
Avatar
omochimetaru 8/8/2019 7:35 AM
そのケースもインスタンスの型からサブクラスのconformsをチェックできるんじゃないですか?
Avatar
norio_nomura 8/8/2019 7:41 AM
実行時、Existentialが準拠すべきプロトコルを検索する際に、検索結果を格納するデータ構造が必要になる。それがwitness tableで代用されてて、Existentialのメンバを使う際にもそれを活用できて便利、な感じ?
Avatar
omochimetaru 8/8/2019 7:43 AM
witness tableはコンパイル時に検索した結果をデータと一緒に取り回す事で、実行性能を改善してる仕組み、という理解です ちょっとハッキリさせるために今コード書いて確認してます。
7:53 AM
@norio_nomura モジュールaて定義された親クラスCを、モジュールbのクラスDが継承しつつ、DがPへのconditional conformanceを持っているケースです
Avatar
norio_nomura 8/8/2019 7:54 AM
ふむ。
Avatar
omochimetaru 8/8/2019 7:55 AM
conformance checkする関数はAnyで受けているので、ややこしいexistentialとかでも、最終的には動的にチェックできる事が確認できると思います。Anyへのキャストはどんなオブジェクトでも可能なので。
Avatar
norio_nomura 8/8/2019 8:00 AM
ふむ。
Avatar
omochimetaru 8/8/2019 8:01 AM
プロトコルの後付けを考えると existential 側に witness table を持つしかない
これの「しかない」に対する反論証明にもなってると思います。
Avatar
norio_nomura 8/8/2019 8:06 AM
conform確認した(キャストした)後、それのメンバをwitness tableから実行するわけですよね。
Avatar
omochimetaru 8/8/2019 8:06 AM
そうですね
Avatar
norio_nomura 8/8/2019 8:07 AM
プロトコルメソッド実行時に毎回witness tableを検索する、ってのは毎回キャストする、に等しいのでは。
Avatar
omochimetaru 8/8/2019 8:07 AM
conform確認する=キャストする=witness tableを取得する=その中のwitness methodを使えるようにする
8:07 AM
はい、そう思ってます。> ってのは毎回キャストする、に等しい
Avatar
norio_nomura 8/8/2019 8:08 AM
キャスト結果を使い回す=existentialがwitness tableを保持する、なのでは。 (edited)
Avatar
omochimetaru 8/8/2019 8:08 AM
まあ、例えば、Pにキャストした後のメソッド呼び出しが連続しているなら、コンパイラ最適化でwitness tableは使い回すとかはできるかもしれないですが。
8:10 AM
そうですね、キャストした時に何を検索して何を取り出すか、が、existentialの型Pに対してコンパイル時に決定できるから、コンパイル時に1度キャストしておいて実行時はそれをずっと使い回すから速い、って事だと思います。 (edited)
Avatar
norio_nomura 8/8/2019 8:17 AM
プロトコルの後付けを考えると existential 側に witness table を持つしかない
これ
プロトコルの後付けを考えると existential 側にプロトコル準拠情報を持つしかない (現在の実装はwitness tableで表現)
って事かと。
(edited)
Avatar
omochimetaru 8/8/2019 8:20 AM
witness tableでもそこを抽象的に言っても、何も持たなくても毎回キャストする実装で動かすことはできるので、いずれにしても「しかない」は間違いでは。
Avatar
norio_nomura 8/8/2019 8:35 AM
as? の右側のプロトコル部分を実行時に変えられる様にならない限りはそうなるのかな? (edited)
8:38 AM
今のところ、キャスト先の型が実行時にしか判らない、ってコードは書けないよね。書ける。 (edited)
Avatar
omochimetaru 8/8/2019 8:38 AM
func cast<T>(_ x: X, type: T.Type) -> X? { return x as? T } ↑こういうのはかけますよ
8:38 AM
でもTをプロトコルで埋めることはできませんね。「プロトコルのメタタイプ」は存在しないから。
Avatar
norio_nomura 8/8/2019 8:43 AM
それって、コンパイル時にキャスト先の型が決まるのでは?
Avatar
omochimetaru 8/8/2019 8:44 AM
class A { func foo() { } } class B <T> : A { override func foo(x: Any) { if let t = cast(x, T.self) { ... } } } func f(a: A) { a.foo() } (edited)
8:45 AM
↑こんな感じだったら、関数fのコンパイル時には決定しないです
👌 1
Avatar
norio_nomura 8/8/2019 8:58 AM
@swift-5.1.5 class C {} func cast<P>(_ any: Any, _ type: P.Type) -> (C & P)? { any as? (C & P) }
Avatar
swift51 BOT 8/8/2019 8:58 AM
exit status: 1 with stderr:<stdin>:3:50: error: non-protocol, non-class type 'P' cannot be used within a protocol-constrained type func cast<P>(_ any: Any, _ type: P.Type) -> (C & P)? { ^ <stdin>:3:50: error: non-protocol, non-class type 'P' cannot be used within a protocol-constrained type func cast<P>(_ any: Any, _ type: P.Type) -> (C & P)? { ^ <stdin>:4:18: error: non-protocol, non-class type 'P' cannot be used within a protocol-constrained type any as? (C & P) ^
Avatar
norio_nomura 8/8/2019 9:06 AM
as? の右側のプロトコル部分を実行時に変えられない」は合ってる? (edited)
Avatar
そもそもこの場合、Pはprotocolではないから&は出来ないのでは (edited)
9:10 AM
protocolを埋めてもexistentialになるので
Avatar
omochimetaru 8/8/2019 9:11 AM
@swift-5.1.5 protocol P {} class A {} class B : A, P {} func f() -> A & P { return B() }
Avatar
swift51 BOT 8/8/2019 9:11 AM
no output
Avatar
omochimetaru 8/8/2019 9:11 AM
できるよ。
Avatar
genericsに与えた時点で
Avatar
norio_nomura 8/8/2019 9:12 AM
うん。ジェネリックパラメータがプロトコルである事を保証する仕組みがないよね。
Avatar
existentialとして扱われるからダメなのでは、という話
Avatar
omochimetaru 8/8/2019 9:12 AM
「as? の右側のプロトコル部分を実行時に変えられない」
そうですね。パラメータにプロトコルを入れられないので。
9:13 AM
as?によるキャストは普通の型の場合と protocol existentialの場合で全然別物が2種類あるのかな?
Avatar
norio_nomura 8/8/2019 9:14 AM
先日dynamicCastを調べた際には、別れてたはず。
Avatar
asキャストは沢山ある…
Avatar
omochimetaru 8/8/2019 9:14 AM
野村さんがぼっとになげたコードはそもそもコード中に P の宣言が無いから変なエラーが出てる。
Avatar
norio_nomura 8/8/2019 9:14 AM
Pの宣言はジェネリックパラメータとしてあるよ。 (edited)
Avatar
genericsの型パラですね、ただそれは
Avatar
omochimetaru 8/8/2019 9:15 AM
ああ!見えてなかった。
Avatar
SomeProtocol.selfはたぶん、existentialの型になっちゃうと思うんですよ
Avatar
omochimetaru 8/8/2019 9:15 AM
なっちゃうというかかけないよ。
Avatar
あ、出来ないか、そうか
Avatar
omochimetaru 8/8/2019 9:15 AM
コンパイルエラーだよ
Avatar
norio_nomura 8/8/2019 9:15 AM
ジェネリックパラメータがプロトコルである事を保証する仕組みがない
Avatar
omochimetaru 8/8/2019 9:15 AM
func f(_ x: Any) -> (A & P)? { return x as? A & P }
9:16 AM
静的なら&付きprotocolのas自体は書ける。
Avatar
norio_nomura 8/8/2019 9:16 AM
それはコンパイル時にプロトコルが決まってるよね。
Avatar
omochimetaru 8/8/2019 9:16 AM
ですね
Avatar
例えばGenericsでTのvalueを受ける関数に、Animalのexistentialを渡すと、TはAnimalのexistentialになるので、と混ざっていた
Avatar
omochimetaru 8/8/2019 9:17 AM
@swift-5.1.5 protocol P {} func f<T>(_ x: Any, _ t: T.Type) -> (P & T)? { return x as? P & T } (edited)
Avatar
swift51 BOT 8/8/2019 9:17 AM
exit status: 1 with stderr:<stdin>:2:42: error: non-protocol, non-class type 'T' cannot be used within a protocol-constrained type func f<T>(_ x: Any, _ t: T.Type) -> (P & T)? { ^ <stdin>:2:42: error: non-protocol, non-class type 'T' cannot be used within a protocol-constrained type func f<T>(_ x: Any, _ t: T.Type) -> (P & T)? { ^ <stdin>:3:22: error: non-protocol, non-class type 'T' cannot be used within a protocol-constrained type return x as? P & T ^ (edited)
Avatar
omochimetaru 8/8/2019 9:17 AM
P & A の A の部分も <T> にはできないな。
Avatar
non-classって書かれてるから、TをAnyObjectで縛ったら通らないかな? (edited)
Avatar
omochimetaru 8/8/2019 9:18 AM
同じエラーが出るよ
Avatar
norio_nomura 8/8/2019 9:18 AM
コンパイル時に必要となるプロトコルが決まっているなら、class existentialにwitness tableは無くても構わないはず。> 「existential 側にプロトコル準拠情報を持つしかない」の「しかない」を否定。 って事ですよね。
Avatar
omochimetaru 8/8/2019 9:20 AM
あ、そういう話か、そこまでは考えてませんでした。もしキャスト宛先のプロトコルそれ自体が動的に決定する場合、今のランタイムだと、どんな問題が生じるという考えですか? (edited)
9:21 AM
(そもそもキャストの宛先プロトコルが動的だとしたら、キャスト結果の値を使うコードを書きようが無い気もするけど)
Avatar
norio_nomura 8/8/2019 9:22 AM
@dynamicMemberLookupとかあるよ。 (edited)
Avatar
omochimetaru 8/8/2019 9:23 AM
それは文字列が渡るだけで関係ないような?
Avatar
norio_nomura 8/8/2019 9:25 AM
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
omochimetaru 8/8/2019 9:26 AM
特にプロトコルにキャストしていたとしても、このへんは挙動は変わらない気がします 元の型に実装されてるロジックが呼び出されるだけですよね
Avatar
norio_nomura 8/8/2019 9:28 AM
(そもそもキャストの宛先プロトコルが動的だとしたら、キャスト結果の値を使うコードを書きようが無い気もするけど)
キャスト結果の値を使うコードを書きようがない。って事はないのでは?と思ったので。
Avatar
omochimetaru 8/8/2019 9:28 AM
そういう意味ではまあ、変数にコピーしたり配列に入れたりはできますね。 キャスト結果ならではの何かという意味でした。
Avatar
norio_nomura 8/8/2019 9:29 AM
まあ、今はできないから空論ですね。
Avatar
omochimetaru 8/8/2019 9:29 AM
あーまあ、そこまでダイナミックな処理系を想定するなら、その動的なプロトコルメタタイプが入ってる値に対して、生えてるプロトコルメソッドを文字列で全部取得できて、そこから特定の名前のメソッドを実行するとか、か。
Avatar
norio_nomura 8/8/2019 9:31 AM
> プロトコルの後付けを考えると existential 側に witness table を持つしかない これ > プロトコルの後付けを考えると existential 側にプロトコル準拠情報を持つしかない > (現在の実装はwitness tableで表現) って事かと。
改め、
プロトコルの後付けを考えると existential 側にプロトコル準拠情報を持つのが自然 (現在の実装はwitness tableで表現)
って感じかな。
Avatar
omochimetaru 8/8/2019 9:31 AM
そこを修正したとしても、まだ、 「後付を考えると」の部分は疑問です。
9:32 AM
witness tableのペアでもつ高速化は、後付が無かったとしても有効なテクニックだと思うし、
9:32 AM
後付けがあったとしても動的に取れるという点は変わっていません。
Avatar
norio_nomura 8/8/2019 9:32 AM
今は不要ならclass existentialにwitness tableは付かないって、ドキュメントに書かれてるよ。 (edited)
Avatar
omochimetaru 8/8/2019 9:34 AM
ほお、それは全く知らなかった、どういう状況を言うんだろ
Avatar
norio_nomura 8/8/2019 9:36 AM
https://discordapp.com/channels/291054398077927425/306995750418513920/607062064372121620
> Class Existential Container が Witness Table を保持するのはなぜかって疑問。 これ、今更だけど、 https://github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst#class-existential-containers に > Note that if no witness tables are needed, such as for the "any class" type protocol<class> or an Objective-C protocol type, then the only element of the layout is the heap object pointer. って注意書きがあるね。プロトコル制約がある時だけwitness tablesを持つ。
(edited)
Avatar
omochimetaru 8/8/2019 9:36 AM
ん、ああ、そうですね。
9:37 AM
AnyObject型が、class existentialのプロトコル数0の場合なので、そのときは0個です。
9:37 AM
AnyObject & P のときは1個、AnyObject & P & Q のときは 2個、てな具合。
9:38 AM
かつ、AnyObject単体のときtable数が0なのでレイアウトがポインタ1つだけになって、普通にthisポインタを取り回してるのと同じになりますね
Avatar
norio_nomura 8/8/2019 9:45 AM
このコードでも律儀に_swift_dynamicCastが呼ばれるな。 @swift-5.1.5 protocol P {} class C: P {} func cast(_ any: Any) -> (C & P)? { any as? (C & P) } _ = cast(C()) (edited)
Avatar
swift51 BOT 8/8/2019 9:45 AM
no output (edited)
Avatar
omochimetaru 8/8/2019 9:46 AM
Anyにしちゃったら、それしか無いと思います
9:47 AM
swift_conformsToSwiftProtocolImplの中で__swift5_protoセクションの中のレコードを探すところですけど、
9:48 AM
そのバイナリにある全部のコンフォーマンスを線形探索して、プロトコルが一致してるやつを取ってるんですよね?
9:48 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
9:48 AM
for (const auto &record : section) { auto &descriptor = *record.get(); // We only care about conformances for this protocol. if (descriptor.getProtocol() != protocol) continue;
9:48 AM
ああ、でも、その結果をキャッシュしてるのか。
9:49 AM
めちゃくちゃ重いと思ったけど初回だけだな。
Avatar
norio_nomura 8/8/2019 9:52 AM
Anyにしちゃったら、それしか無いと思います
あ、そか。
Avatar
omochimetaru 8/8/2019 9:53 AM
https://github.com/apple/swift/blob/b70cd7031fe7a2c400976007abbfff1597189174/stdlib/public/runtime/ImageInspectionMachO.cpp#L141-L145 void swift::initializeProtocolConformanceLookup() { REGISTER_FUNC( addImageCallback<TextSegment, ProtocolConformancesSection, addImageProtocolConformanceBlockCallback>); }
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
9:54 AM
#define REGISTER_FUNC(...) _dyld_register_func_for_add_image(__VA_ARGS__)
9:54 AM
When you call _dyld_register_func_for_add_image, the dynamic linker runtime calls the specified callback (func) once for each of the images that is currently loaded into the program. When a new image is added to the program, your callback is called again with the mach_header for the new image, and the virtual memory slide amount of the new image.
Avatar
norio_nomura 8/8/2019 9:54 AM
確認すべきは、キャスト後のexistentialがwitness tableを保持してるかどうかか。
Avatar
omochimetaru 8/8/2019 9:54 AM
こんな便利な関数があるのだな。
9:56 AM
動的オブジェクトファイルがロードされるたび+初回はすでにロードされているものに関して、ローダー側がコールバックを呼んでくれるのか。
9:58 AM
後付けされたプロトコルに対応したwitness tableをインスタンスに差し込んだらメモリレイアウトが変わっちゃうんじゃない?
これで、この問の答えも得られた。
Avatar
norio_nomura 8/8/2019 9:58 AM
HTML versions of the iOS man pages.
Avatar
omochimetaru 8/8/2019 9:58 AM
あ、ググって出てきたの見てたけど、謎のURLでした。
Avatar
norio_nomura 8/8/2019 10:14 AM
protocol P {} class C: P {} func cast(_ any: Any) -> (C & P)? { any as? (C & P) } _ = cast(C()) これ、C & Pのメタデータを用意してキャストするコードが生成されるから、witness tableも持ってそう。Cが既にPだというのは考慮されていない感じ。
Avatar
omochimetaru 8/8/2019 10:15 AM
なるほど
Avatar
norio_nomura 8/8/2019 10:28 AM
いや、そもそもwitness tableが幾つ必要なのか?とか含めて全部_swift_dynamicCastに丸投げで、結果witness table不要となる可能性があるのかも。
Avatar
あー、アップキャストばっかり考えてたけど、確かにダウンキャストできるんだからインスタンスから引けないとおかしいですね。
2:39 AM
↑序盤は mapのほうが人気だったけど途中で逆転してcompactMapが勝った。
Avatar
mapのほうがArray作成が一度だけで良い感じがしますね。
Avatar
omochimetaru 8/22/2019 2:42 AM
compactMapの方は Array<Optional<T>> が一度作られるところの複雑度が高い気がするけど mapの方は ?? [] のところでArrayのカッコがまた出てくるのが気に食わん。
Avatar
mapの方は要素が1個の時しか使えないけどcompactMapの方は要素が複数でも使える
Avatar
norio_nomura 8/22/2019 3:57 AM
計算量を考えるとmapの方だ。
Avatar
僕は opt != nil ? [opt!] : [] に終着した
Avatar
あとスマートキャストさえあれば・・・って感じですね
Avatar
omochimetaru 8/22/2019 5:53 AM
僕は opt != nil ? [opt!] : [] に終着した
!があるのが嫌だけど直感的には一番わかりやすいですね
Avatar
僕は opt != nil ? [opt!] : [] に終着した
ぼくはmapの方に1票入れたけど、これが好き。Kotlinのスマートキャストがあれば…
3:19 AM
あ、もう言われてた。
😄 1
Avatar
omochimetaru 9/20/2019 4:09 AM
protocol P : AnyObject {} struct S<T: AnyObject> {} // 'S' requires that 'P' be a class type S<P>() (edited)
4:09 AM
クラスプロトコルのexistentialはクラスではないらしい。
4:12 AM
protocol P : AnyObject {} class C : P {} struct S<T: AnyObject> {} var a: P = C() var b: AnyObject = a as AnyObject
4:12 AM
でもAnyObjectへのアップキャストはできる。
Avatar
omochimetaru 9/20/2019 4:21 AM
P?weak varも作れるんだよなあ。
Avatar
norio_nomura 9/27/2019 1:52 AM
iOS 13.1の中でSwiftが使われているものをリストアップしてる記事。 https://blog.timac.org/2019/0926-state-of-swift-ios13/
👀 1
Avatar
classではないというエラーメッセージが不親切だと思う、コンパイルできないのはそれはそうなんじゃないかな @omochimetaru (edited)
Avatar
omochimetaru 9/27/2019 3:54 AM
ClassExistentialContainerでProtocol Conformanceが1件もない場合 = :AnyObjectの場合は
3:54 AM
struct ClassExistentialContainer { HeapObject *value; WitnessTable *witnessTables[NUM_WITNESS_TABLES]; };
3:55 AM
↑witnessTablesが0バイトになるから、ポインタ1つだけになるので、クラス型と全く同じrepresentatiojになるので
3:55 AM
なんとかなってほしい
Avatar
そもそもそこはGenerics渡しである必要があるの? (edited)
4:15 AM
Existential渡しで良さそう
Avatar
omochimetaru 9/27/2019 4:18 AM
struct Weak<T: AnyObject> { } ↑これに入れたかった
Avatar
型がほしいのか〜
4:59 AM
参照型持たせるならstructよりclassの方がよくない?
Avatar
omochimetaru 9/27/2019 5:00 AM
ん、それはなぜ?
Avatar
あ、そうだおもちさん
5:00 AM
protocol@objc protocolにすれば
Avatar
omochimetaru 9/27/2019 5:00 AM
structのほうがパフォーマンス良いと思うよ
Avatar
Exsitentialでも通るようになるよ
5:00 AM
多分
Avatar
omochimetaru 9/27/2019 5:00 AM
あー、たぶんそうだね
5:00 AM
@objc使いたくないンゴね
Avatar
あきらめろん
Avatar
omochimetaru 9/27/2019 5:01 AM
しょうがないのでWeak用のTypeErasureを別に作ったよ
5:02 AM
Weak<AnyP> こうすると駄目で、これ面白くって
5:03 AM
OwnerAはT: P をstrong参照 AnyP<X: P>T: Pを内部でstrong参照 Weak<Y>Y = AnyP<T>を内部でweak参照
5:03 AM
あら不思議AnyPがリリースされてしまいます
5:03 AM
なので WeakAnyPの実装が必要で、 これだとうまくいくんだな
🤔 1
Avatar
Xcode 11.2のswiftは5.1.2なのにswift-5.1.2-RELEASEは出ないのかな。
Avatar
extension Optional { public mutating func consume<R>(_ f: (Wrapped) throws -> R) rethrows -> R? { guard let x = self else { return nil } self = nil return try f(x) }
👀 1
4:02 AM
↑最近こんなの作って使ってみてるんだけど使い所がかなり多くてめちゃ便利
4:03 AM
self.cameraCapture.consume { $0.dispose() } // ↓と同じ if let c = self.cameraCapture { c.dispose() self.cameraCapture = nil } (edited)
4:04 AM
guard let capture = (self.cameraCapture.consume { $0 }) else { return } use(capture) // ↓と同じ guard let capture = self.cameraCapture else { return } self.cameraCapture = nil use(capture)
Avatar
protocol Enum { static func associatedValue(_ value: String) -> Self static var singleValue: Self { get } } enum Foo: Enum { case associatedValue(String) case singleValue }
7:08 AM
enumのcaseをこんな感じでprotocolで表したい😫
Avatar
RawReplesentableを見てみると良いかも
7:09 AM
あー、caseを定義か。理解しました
Avatar
static func名とcase名は重ねられない気がした
Avatar
一応定義はできるのですが自己参照になっちゃいますね… (edited)
Avatar
なるほど。
Avatar
あとはメソッド名を変えればですが結局それぞれのenumに手を入れなければならないのであまりいい感じにはできず…
7:19 AM
protocol Enum { static func associatedValue(_ value: String) -> Self static var singleValue: Self { get } } enum Foo: Enum { static func associatedValue(_ value: String) -> Foo { _associatedValue(value) } static var singleValue: Foo { _singleValue } case _associatedValue(String) case _singleValue }
Avatar
そうですよね〜
7:21 AM
「caseコンストラクタ(仮称)をstatic funcとしてprotocol conformanceできるようにする」
7:21 AM
言語改修案として良さそう
Avatar
良いですね🤩
Avatar
@swiftbot class X { init(){} deinit { print("deinit") } } do { let x = X() print(x) } let x = X() print(x) (edited)
🛠 2
Avatar
(edited)
Author icon
t.ae
class X { init(){} deinit { print("deinit") } } do { let x = X() print(x) } let x = X() print(x)
Version:
swift-5.1-RELEASE
Output:
main.X deinit main.X
Error:
Avatar
トップレベルに置かれてるのが
1:45 AM
deinit呼ばれない?
Avatar
Author icon
t.ae
class X { init(){} deinit { print("deinit") } } do { let x = X() print(x) } let x = X() print(x)
Version:
swift-DEVELOPMENT-SNAPSHOT-2019-11-08-a
Output:
main.X deinit main.X
Error:
Avatar
omochimetaru 1/7/2020 7:37 AM
// c3.swift public protocol P { func foo() -> Int }
7:37 AM
; c3.ll ... @"$s2c31PMp" = constant <{ i32, i32, i32, i32, i32, i32, %swift.protocol_requirement }> <{ i32 65603, ... (edited)
7:38 AM
// c4.cpp #include <stdio.h> #include <stdlib.h> #include <dlfcn.h> int main() { void *handle = dlopen(nullptr, RTLD_LAZY); if (!handle) { printf("dlopen failed: %s\n", dlerror()); return 0; } void *symbol = dlsym(handle, "$s2c31PMp"); if (!symbol) { printf("symbol not found: %s\n", dlerror()); return 0; } int32_t flags = ((int32_t *)symbol)[0]; printf("flags=%d\n", flags); if (dlclose(handle)) { printf("dlclose failed: %s\n", dlerror()); return 0; } return 0; }
7:39 AM
$ clang++ -std=c++14 c4.cpp -c -S -emit-llvm $ ./c4.out flags=65603
7:39 AM
protocol descriptor、直接取れた (edited)
Avatar
そういえば FunctionHook していた時に
7:40 AM
protocol descriptorとか partial applyとか のsymbol nameもあったのだけど
7:40 AM
呼べるか試してないな。
Avatar
omochimetaru 1/7/2020 8:22 AM
protocol EquatableOpener { init<T>(_ value: T) init<T: Equatable>(_ value: T) } func openEquatable<EO: EquatableOpener>(_ value: Any, openerType: EO.Type) -> EO { // 黒魔術 }
8:22 AM
こんなライブラリ関数が作れる目処が立った
Avatar
黒魔術で草
Avatar
omochimetaru 1/7/2020 8:24 AM
昨日から話してる AnyEquatable を openEquatableに渡せる
8:24 AM
こういうインターフェースにしておけば、取り扱いをユーザーが決められる。
Avatar
つまり、EquatableOpenerの挙動をユーザー側で決定できると
Avatar
omochimetaru 1/7/2020 8:25 AM
そう。ライブラリがやるのは、どっちのinitを呼ぶのかのディスパッチだけってこと。
Avatar
なるほどね
8:26 AM
Equatableでユーザー側で決定したいシチュがあまり思いつかないのだけど、他のprotocolだと有用な場面がありそう
Avatar
omochimetaru 1/7/2020 8:27 AM
たとえEquatableでも、
8:27 AM
Int(0) == Double(0) にしたい人が0.1人ぐらい居るかも
Avatar
不埒者だw
Avatar
omochimetaru 1/7/2020 8:28 AM
Foundation.AnyHashableは実際そう
Avatar
AnyHashableはそういう動きするよね
8:28 AM
被った
Avatar
omochimetaru 1/7/2020 8:28 AM
使いたくない型ナンバーワン
Avatar
わかる
Avatar
omochimetaru 1/7/2020 8:28 AM
Swiftの世界観からすると完全にただの罠だよね
Avatar
せめて型情報焼き込んで欲しいんだよな
8:29 AM
ObjectIdentifier使ってHasherに焼いて欲しい
Avatar
omochimetaru 1/7/2020 8:29 AM
どういう意味だ??
Avatar
@swift-5.1.5 struct MyAnyHashable: Hashable { var originalHashValue: Int var originalTypeIdentifier: ObjectIdentifier init<H: Hashable>(_ origin: H) { self.originalHashValue = origin.hashValue self.originalTypeIdentifier = ObjectIdentifier(H.self) } } print(MyAnyHashable(1) == MyAnyHashable(1.0))
Avatar
swift51 BOT 1/7/2020 8:32 AM
false
Avatar
こうだね
Avatar
omochimetaru 1/7/2020 8:33 AM
なるほど。
8:33 AM
それだとハッシュ値が同一のときに間違ってtrueになっちゃうけど。
Avatar
ああEquatableが壊れるということね
8:34 AM
いやあくまでわかりやすくObjectIdentifierを持たせようぜという話で
Avatar
omochimetaru 1/7/2020 8:34 AM
そゆことね
Avatar
EquatableそのままでObjectIdentifier持たせれば全部丸く解決するじゃろ
8:34 AM
きっとAnyHashableと生Hashableが同一の値を返すモチベがあるんやろうなぁ
Avatar
omochimetaru 1/7/2020 8:35 AM
単にNSDictionaryとかの挙動と合わせたいんじゃないか
8:35 AM
NSDictionaryをSwiftから見ると Dictionary<AnyHashable, Any> だし。 (edited)
Avatar
ああ、あれは1と1.0がおなじなのか
Avatar
omochimetaru 1/7/2020 8:36 AM
うん。intとか格納できないから NSNumber になる
8:36 AM
その時にもとの型が消える。
Avatar
名前をUnsafeAnyHashableに変えて欲しい
Avatar
omochimetaru 1/7/2020 8:38 AM
確かに。
8:38 AM
AnySequenceとかと違って
8:39 AM
謎挙動が組み込まれてる事を
8:39 AM
表明してほしかったな
Avatar
@swiftbot print("hello")
Avatar
swiftbot BOT 1/17/2020 7:07 PM
Author icon
yyu
print("hello")
Version:
swift-5.1.3-RELEASE
Output:
hello
Error:
Avatar
@swiftbot struct Cont<A, B> { var run: ((A) -> B) -> B var flatMap: (A) -> Cont<A, B> { get { fatalError() } _modify { let that = self var me: (A) -> Cont<A, B> = { (a: A) -> Cont<A, B> in that } yield &me let tmp = { (k: (A) -> B) -> B in that.run({ (a: A) -> B in me(a).run(k) }) } run = tmp } } } var a = Cont<Int, Int>( run: { (k: (Int) -> Int) -> Int in k(1) } ) a.flatMap = { (x: Int) -> Cont<Int, Int> in Cont<Int, Int>( run: { (k: (Int) -> Int) -> Int in k(x + 1000) } ) } a.flatMap = { (x: Int) -> Cont<Int, Int> in Cont<Int, Int>( run: { (k: (Int) -> Int) -> Int in k(x + 2000) } ) } a.run( { (a: Int) in print(a) return a } )
Avatar
swiftbot BOT 1/17/2020 7:07 PM
Author icon
yyu
struct Cont<A, B> { var run: ((A) -> B) -> B var flatMap: (A) -> Cont<A, B> { get { fatalError() } _modify { let that = self var me: (A) -> Cont<A, B> = { (a: A) -> Cont<A, B> in that } yield &me let tmp = { (k: (A) -> B) -> B in that.run({ (a: A) -> B in me(a).run(k) }) } run = tmp } } } var a = Cont<Int, Int>( run: { (k: (Int) -> Int) -> Int in k(1) } ) a.flatMap = { (x: Int) -> Cont<Int, Int> in Cont<Int, Int>( run: { (k: (Int) -> Int) -> Int in k(x + 1000) } ) } a.flatMap = { (x: Int) -> Cont<Int, Int> in Cont<Int, Int>( run: { (k: (Int) -> Int) -> Int in k(x + 2000) } ) } a.run( { (a: Int) in print(a) return a } )
Version:
swift-5.1.3-RELEASE
Output:
3001
Error:
/usercode/main.swift:31:3: warning: result of call to function returning 'Int' is unused a.run( { (a: Int) in ^ ~~~~~~~~~~~~~~~
Avatar
takasekさんがツイートしてたリンクで知ったんですけど、yieldが複数あるかのチェックってSILOptimizerのPassで診断してるんですね $ swiftc yield.swift -emit-sil Run module pass #0, stage Guaranteed Passes, pass 0: SILGenCleanup (silgen-cleanup) Start function passes at stage: Guaranteed Passes Run #1, stage Guaranteed Passes, pass 1: DiagnoseInvalidEscapingCaptures (diagnose-invalid-escaping-captures), Function: $s5yield4NekoC4_bow33_BFC072E4B657A1986E9E174ACA620350LLSSvpfi Run #2, stage Guaranteed Passes, pass 2: DiagnoseStaticExclusivity (diagnose-static-exclusivity), Function: $s5yield4NekoC4_bow33_BFC072E4B657A1986E9E174ACA620350LLSSvpfi Run #3, stage Guaran # 中略 Run #135, stage Guaranteed Passes, pass 20: YieldOnceCheck (yield-once-check), Function: $s5yield4NekoC3bowSSvM yield.swift:9:13: error: accessor must not yield more than once yield &_bow ^ yield.swift:8:13: note: previous yield was here yield &_bow ^ Run #136, stage Guaranteed (edited)
2:13 AM
This pass is based on the existing SIL verifier checks but diagnoses only those errors that can be introduced by programmers. rdar://43578476
Avatar
omochimetaru 1/20/2020 2:14 AM
initのフィールド初期化とか、
2:14 AM
ownershipとか
2:14 AM
遷移が絡む静的検証は
2:14 AM
型推論じゃなくてSILPassにある気がする
❤️ 1
Avatar
The Swift project has achieved a critical milestone of maturity of the core fundamentals, providing stability for users to invest in using Swift in earnest. On Apple's platforms such as macOS and iOS, the arrival of ABI and module stability has enabled the creation of stable...
💖 1
Avatar
omochimetaru 1/23/2020 1:36 AM
あ、こっちにも投稿されてたの今気づいた。
Avatar
omochimetaru 1/24/2020 3:04 AM
@omochimetaru アプリターゲットのソースでも generic argumentに任意のprotocolが対応しているクラスを、その任意のprotocolを自身に対応させてサブクラスにしたクラス を一定数以上定義するとiOS13の実機とシミュ...
Avatar
やばw
3:07 AM
一定数超えるとというところがやばい
Avatar
omochimetaru 1/24/2020 3:16 AM
723で死んだ
3:16 AM
なんかメタデータの構造上の上限数を超えてしまうのかな
Avatar
omochimetaru 1/24/2020 3:31 AM
なんかスタックトレースがおかしいんだよな。
3:32 AM
3:32 AM
type metadata accessor for ObjectN のなかで type metadata accessor for Object(N+1) を呼んでるのがずっと繋がってる
Avatar
こっちに書いてみる
7:16 AM
末尾再帰版だとインライン化されてる?
7:16 AM
func factorial(of n: Int) -> Int { func f(_ n: Int, _ r: Int) -> Int { n <= 1 ? r : f(n - 1, r * n) } return f(n, 1) }
Avatar
アセンブリレベルではインライン化されてる
Avatar
おお、ほんとですね。
12:45 PM
@swift-5.1.5 @inline(__always) func factorial(of n: Int) -> Int { func f(_ n: Int, _ r: Int) -> Int { n <= 1 ? r : f(n - 1, r * n) } return f(n, 1) } print(factorial(of: 5))
Avatar
120
Avatar
↓LLVM-IR define i32 @main(i32, i8** nocapture readnone) local_unnamed_addr #0 { entry: ... %._value = bitcast %swift.refcounted* %13 to i64* store i64 120, i64* %._value, align 8 ... ret i32 0 }
12:46 PM
120 まで計算されて埋め込まれてる。
Avatar
オプティマイザに消されてほしくない場合は
12:39 AM
print(factorial(of: [5].randomElement()!))
12:39 AM
とするといいです
Avatar
omochimetaru 1/30/2020 1:42 AM
アトリビュートで@inline(never)付けるとか。
1:43 AM
@optimize(none)みたいなやつもあった気がする なんだっけ
Avatar
randomElement()!は全部計算されて直値になるのは困る。この場合のようにインライン展開されているかを見たいという時に使ってます
Avatar
https://bugs.swift.org/plugins/servlet/mobile#issue/SR-11993 この間の2種類のconformはデザイン通りやでという回答がDoug Gregorから貼られてました
Avatar
omochimetaru 2/3/2020 1:59 AM
そうかあ〜〜〜
2:01 AM
同じ Generic<T> であっても構成する静的な経路によって T の conformance が変わるんだなあ
Avatar
#swift から。余談なのでこっちにリンクを。 COW Existential Buffers https://developer.apple.com/videos/play/wwdc2017/402/?time=1057
Swift 4 continues the evolution of the safe, fast, and expressive language, with better performance and new features. Learn about the new...
👀 1
Avatar
Kishikawa Katsumi 2/4/2020 9:59 AM
let topMargin = 190 NSLayoutConstraint.activate([ contentViewController.view.topAnchor.constraint(equalTo: view.topAnchor, constant: topMargin), ... ^ こういう場合の topMargin をIntじゃなくてCGFloatに推測してくれるようにならないかな。右辺を別の行まで拡大する、みたいな。
Avatar
それ、implicit function ですね。Scala ならできる。
Avatar
Kishikawa Katsumi 2/6/2020 1:13 AM
おおー、Scalaすごい。ということはSwiftでもいつかできるようになりそう。
Avatar
omochimetaru 2/6/2020 1:16 AM
どんなscalaコードですか?
Avatar
Scalaのimplicit functionの例です import scala.language.implicitConversions class A(val value: Int) {} implicit def toA(value: Int): A = new A(value) def f(x: A): Int = x.value * 2 val a = 100 val y = f(a) println(y) // 200 このとき、aの型はIntです。 暗黙的に関数が呼ばれるだけなので、型推論に影響を及ぼしているわけではないと思います。 (久しぶりにScala書きました。間違ってたらすみません) (edited)
Avatar
omochimetaru 2/8/2020 10:14 AM
そういう事か。 これはIntからAへの暗黙変換ができるだけで、aの利用箇所がaの型推論に影響してるわけではないから、 岸川さんの求めている事とは違うと思います。 見た目のコードは似ているけど。
Avatar
Kishikawa Katsumi 2/8/2020 10:20 AM
なるほど。implicit functionはそういうものでしたか。 厳密には違うけど (私が想定していたのは) let topMargin = 190 // ここの左辺の型を右辺からじゃなくて、 ...constraint(equalTo: view.topAnchor, constant: topMargin) // ここの代入から推論してくれてもいいんじゃない? だったんですけど、
10:21 AM
よく考えると絶対訳わからないことになるだろうから、Scalaの暗黙変換みたいなのはそれはそれでちょうどいい感じな気はします。
10:21 AM
Swiftっぽくはない。
10:24 AM
たぶん同じ仕組みだと let topMargin = 190 // ここは右辺からIntと推論 topMargin) // ここでCGFloat(190) を暗黙的によぶ ということだと思うので、厳密には違いそう。 (edited)
Avatar
omochimetaru 2/8/2020 10:25 AM
その暗黙変換は、Intで現せるけどFloatで現せない値の場合のランタイムエラーを含むのが嫌だなあ
Avatar
Kishikawa Katsumi 2/8/2020 10:27 AM
いちおう私は ...constraint(equalTo: view.topAnchor, constant: 190) これと同じ扱いにしてほしい、という考えで要するにリテラルからの場合のみ、ということになるはずなので行けると思ってるんですよね。
Avatar
omochimetaru 2/8/2020 10:27 AM
リテラルから一発なら安全です。
Avatar
変数の宣言時に推論が効くのは良さそうですが、暗黙変換はかなり渋いですね
Avatar
Kishikawa Katsumi 2/8/2020 10:28 AM
let x = リテラル はreadonlyだから最初に使うときまで型を保留してもたぶん問題ないのでは、、、という考えです。
Avatar
omochimetaru 2/8/2020 10:29 AM
仕組み的には実現はできると思いますよ 今は一文ずつ型推論を完了させてるから、実装するなら書き換える場所は多いと思うけど。
Avatar
Kishikawa Katsumi 2/8/2020 10:32 AM
まあでもうっかりCGFloat? になったりAnyになったりしそうだな。
10:33 AM
間にprint()を追加したら型が変わった、とか。
Avatar
omochimetaru 2/8/2020 10:34 AM
それはハマりそうw
Avatar
Kishikawa Katsumi 2/8/2020 10:36 AM
まあでもクロージャの$0, $1の推論ってそんな感じじゃないか?って気がしてきた。
10:37 AM
違うな。あれはパラメータの型で決まってる
10:37 AM
そこに当てはまってるだけだ。
Avatar
omochimetaru 2/8/2020 10:38 AM
ジェネリックな高階関数だったら、$0の型がユースサイトで決まる状況はありえます
Avatar
flatMapは結構そんな感じじゃないかな
Avatar
Kishikawa Katsumi 2/8/2020 10:38 AM
お、そうか。
Avatar
omochimetaru 2/8/2020 10:38 AM
ただ、あれの場合は1ぶん
Avatar
Rxのscanはかなり飛び道具なんで、推論だと激重になりますね
Avatar
omochimetaru 2/8/2020 10:38 AM
1文だけの制約がかかりますね
Avatar
そこからイメージするとそういう機能を追加するとコンパイラが激重くんになるのは想像に難くない
Avatar
Kishikawa Katsumi 2/8/2020 10:39 AM
確かにmapは使う方で型を決めるなあ。 なんかおもしろい。
Avatar
omochimetaru 2/8/2020 10:42 AM
StreamとかをflatMap繋げまくってると
10:42 AM
実質そういう状態ですね
10:43 AM
あれは文を切らずに、逐次実行を書いてるから。
Avatar
Rustだと複数statementを跨いだ推論が効きますね
10:45 AM
let mut v = Vec::new(); let a: u32 = 1; v.push(a);
10:46 AM
こんな感じでvがVec<u32>に推論される
Avatar
Rustは継承がない分、推論のコストがそこまで高くなさそうなイメージが有る (edited)
Avatar
Swiftだと型変数が増えることでオーバーロードの候補が増えて爆発しそう
Avatar
Kishikawa Katsumi 2/8/2020 10:51 AM
Rustのその例、使いやすそう。
Avatar
べんりです 😋
Avatar
Kishikawa Katsumi 2/8/2020 10:52 AM
Swiftだったら何かinitに渡させよう、ってデザインするやつだ。
Avatar
こういう型情報の逆伝播って動的型付けの言語だとできないですよね。
Avatar
Kishikawa Katsumi 2/8/2020 11:07 AM
それは言語によるんじゃない? 実際にあるかどうかと、意味があるかはわからないけど、実行するまで型の妥当性を検証しない言語でもそういう情報を持ってて最適化するとかはアリだと思う。
11:08 AM
例えばその例でVecが外に公開されてないなら静的ディスパッチに内部的にできるとか。
Avatar
omochimetaru 2/8/2020 11:09 AM
わかりやすい例だと
11:09 AM
Swiftのdecodeは左辺の型から
11:09 AM
デコード処理が変わって
Avatar
実行するまでに型を決定して静的ディスパッチにできる、ということは、もうそれはもう静的な型システムじゃないですか?
Avatar
omochimetaru 2/8/2020 11:09 AM
その中で整数をパースしたり文字列をパースしたりなどの処理が変わるけど
11:10 AM
そういうやつは動的型では無理ですね
11:11 AM
あ、decodeは左辺から決まらないか。引数にメタタイプを受け取るから。
11:16 AM
func f() -> Int { print(1); return 0 } func f() -> String { print(2); return "" } let a: Int = f() ↑こういうのは動的にやるのは無理だけど、動的言語でも事前検査してディスパッチを書き換える事はできると思う。
11:16 AM
家庭君の言う通りその時点で静的型になってるのではって話はあるけど。
11:16 AM
TypeScriptをコンパイルして実行されるJavaScriptは静的か?動的か?みたいな議論だと思う。
Avatar
Kishikawa Katsumi 2/8/2020 11:17 AM
例えばObjective-C(動的片付け)で 公開しないモジュール(例えばiOSアプリ) の場合でランタイムAPIを一切使ってないなら全部静的ディスパッチにして速くすることもできる、みたいな。
Avatar
言語のspecとして静的な型システムを持たない場合でも、そのspecを超えた、処理系に依存した最適化の手法として静的にコードを事前検査して静的ディスパッチに書き換えられる。ということであればそれはそうですねー。
Avatar
Kishikawa Katsumi 2/8/2020 11:25 AM
Objective-Cは言語仕様で決まってるから例としてはイマイチだった。
Avatar
norio_nomura 2/8/2020 1:40 PM
そういえば、Xcode 11.4はObjective-Cでobjc_directとかを使える様になってる。 https://nshipster.com/direct/ (edited)
It’s hard to get excited when new features come to Objective-C. These days, any such improvements are in service of Swift interoperability rather than an investment in the language itself. So it was surprising to learn about a recent patch to Clang.
😍 1
1:43 PM
同一モジュール内限定で動的ディスパッチを使わない様に出来るらしい。
Avatar
norio_nomura 2/8/2020 1:59 PM
リリースノートに載ってないけど、@property(direct)が通る事を確認した。
Avatar
omochimetaru 2/10/2020 8:05 AM
Neil Jonesさんが400個以上の放置PR全部に
Can one of the admins verify this patch?
ってコメントしてて通知欄が死んだ
8:06 AM
8:06 AM
ただでさえアイコンに顔が4つ映り込んでるのに全部これになってるから圧が凄い
Avatar
omochimetaru 2/10/2020 8:36 AM
@theblixguy Sorry about the comments. It was a mistake with a Jenkins plugin. I am in the process of deleting all these comments.
事故だったらしい
Avatar
これ事故だったのかw wasmのPRにもコメント来てて、Neilさんarmポートやってるからwasm移植にも興味あるのかと思った。
Avatar
omochimetaru 2/10/2020 8:43 AM
何もかもにコメントしてたよ
Avatar
Swift の公式ライブラリ( Numerics とか Crypto とか)って軒並み Apache License 2.0 ですけど、これらに依存する可能性を考えると自作ライブラリも Apache License 2.0 にしておいた方がいいと思いますか?サードパーティのライブラリって MIT License が多いと思うんですが・・・。 MIT にしてたけど、後から Numerics に依存したいなってときとか。 Apache < MIT で、 MIT に依存して Apache にするのはありでも、逆はダメだという認識です(これも自信がありません)。
Avatar
omochimetaru 2/28/2020 5:54 AM
依存は再配布じゃないから関係無いのでは?
Avatar
依存するだけなら気にしなくていいのか。
Avatar
omochimetaru 3/11/2020 7:16 AM
This is a rewrite of integer parsing for performance and code size. It address several major issues with the existing implementation (SR-7556), but also uses a new approach described below to achie...
7:16 AM
すごいなこれ。
Avatar
Kishikawa Katsumi 3/11/2020 7:34 AM
すごいですね。どういう変更なのかは大まかに読んだけど各実装(_parseUnsignedBase10の中身とか)はサッパリ分からないぞ。
Avatar
omochimetaru 3/11/2020 7:35 AM
Notes on Approach The key idea here is using the bytes of a UInt64 in a way similarly to SIMD. When doing ASCII operations the new UTF-8 backing of Strings makes them perfectly suited for this technique. Aside from integer parsing, for example also ASCII case manipulation sees many-X speed-ups when using this approach. Example (details below): let str = 0x3132_3030_3633_3739 // ASCII "12006379" let digits = str &- 0x3030_3030_3030_3030 // Subtract "0" from every lane // … (underflow check omitted for clarity) let c = (0x7f - 9) &* 0x0101_0101_0101_0101 // Constant to check value > 9 let isAnyAbove9 = (digits &+ c) & 0x8080_8080_8080_8080 != 0
7:36 AM
文字列バッファを1文字ずつ読むんじゃなくて、8バイト分のビットバッファとみなして、ビット演算使ってまとめて8文字ずつ処理していくと。
Avatar
5.2ではSwiftPMのリソースやバイナリ対応はまだ入っていないんですね
Avatar
objcから使えるようになっただけでも大進歩
Avatar
norio_nomura 3/27/2020 9:18 AM
swift-5.2-RELEASE OSS Toolchain macOS版のシンボルインストーラのダウンロードが、途中の2048MBで止まってしまう。 (edited)
9:20 AM
https://bugs.swift.org/browse/SR-12405 JIRAで報告したけど反応がない…
Avatar
swift-5.2.1-RELEASE OSS Toolchain macOS版のシンボルインストーラのダウンロードも、途中の2048MBで止まってしまう。 (edited)
Avatar
2GB sounds like 32bit lmitation
Avatar
うん。
Avatar
ここは日本語だった
11:38 PM
混ざる...
Avatar
Jordan RoseさんがAppleを去ってから、bugs.swift.orgのトリアージがされてない印象…
Avatar
omochimetaru 4/2/2020 8:50 AM
JRose氏えらかった
👉 1
Avatar
omochimetaru 4/3/2020 2:46 AM
The review of SE-0281: @main: Type-Based Program Entry Points begins now and runs through April 8, 2020. Reviews are an important part of the Swift evolution process. All review feedback should be either on this forum thread or, if you would like to keep your feedback private...
2:47 AM
@UIApplicationMain とかをユーザーが自作できるようにするやつ、急にピッチ来たと思ったら急に審査来てた。
Avatar
Kishikawa Katsumi 4/3/2020 3:12 AM
これはいいよね。
Avatar
omochimetaru 4/3/2020 3:18 AM
良いのかなあ。
3:20 AM
main.swiftにいきなり書けるやつで十分に思える。
Avatar
Kishikawa Katsumi 4/3/2020 3:22 AM
なるほど。@UIApplicationMainという仕組みはいかにも苦しいから、と思ってたけどそれもない方がシンプルかなあ。
Avatar
omochimetaru 4/3/2020 3:25 AM
@UIApplicationMain が出てきた時、いったいどうやって起動してるのかわからなくなったから、 昔の main.m が生成されて、その中に UIApplicationMain 関数の呼び出しが普通に書いてあるやつのほうが好きだった (edited)
3:26 AM
まあいまやMain StoryboardとかInfo.plistのScene Manifestoとか、設定ファイルで制御される物事がおおくてなんもわからんけど・・・ (edited)
Avatar
@swift-main func f(_ aa: Int = 0, _ bb: Int) {} f(1)
Avatar
swiftNightly BOT 4/11/2020 11:23 AM
exit status: 1 with stderr:<stdin>:2:4: error: missing argument for parameter #2 in call f(1) ^ , <#Int#> <stdin>:1:6: note: 'f' declared here func f(_ aa: Int = 0, _ bb: Int) {} ^
Avatar
↑コンパイラいじってたら見つけた。これはバグなのかなあ・・・。
11:25 AM
省略可能な仮引数と、そうでない仮引数の間で、実引数の奪い合いを常に理想的に解決するの難しい問題になる気がする。
Avatar
@swift-main func f(_ aa: Int = 0, _ bb: Double) {} f(1.0)
Avatar
swiftNightly BOT 4/11/2020 4:20 PM
exit status: 1 with stderr:<stdin>:2:3: error: missing argument for parameter #1 in call f(1.0) ^ <#Int#>, <stdin>:1:6: note: 'f' declared here func f(_ aa: Int = 0, _ bb: Double) {} ^
Avatar
これでもダメなのか。
4:21 PM
ん? #1 になってる。
Avatar
お、これはバクっぽい
Avatar
どっちですか?両方?
Avatar
おもちさんのは理解できます。
4:26 PM
現状の仕組み上、前方からラベル見て当てていくんだと思うんですけど、それだとおもちさんのは仕方ない感じ。
4:27 PM
koherさんのは、それで一旦失敗して、診断で無理しちゃってる感じなのかなー?
4:29 PM
タイプチェックと診断のロジック不一致的な。
Avatar
omochimetaru 4/11/2020 4:34 PM
koherさんのは、fix-itsは挿入だから、同じ話では? (edited)
4:34 PM
あ、違うのか
4:35 PM
aa が missing なのは許されるはずか。
Avatar
@swift-main @swift-5.2.5 @swift-5.1.5 func f(_ aa: Int = 0, _ bb: Double) {} let bb: Double = 1.0 f(bb)
Avatar
swiftNightly BOT 4/11/2020 4:40 PM
exit status: 1 with stderr:<stdin>:4:3: error: missing argument for parameter #1 in call f(bb) ^ <#Int#>, <stdin>:1:6: note: 'f' declared here func f(_ aa: Int = 0, _ bb: Double) {} ^
Avatar
exit status: 1 with stderr:<stdin>:4:3: error: missing argument for parameter #1 in call f(bb) ^ <#Int#>, <stdin>:1:6: note: 'f' declared here func f(_ aa: Int = 0, _ bb: Double) {} ^
Avatar
exit status: 1 with stderr:<stdin>:4:5: error: missing argument for parameter #2 in call f(bb) ^ , <#Double#> <stdin>:1:6: note: 'f' declared here func f(_ aa: Int = 0, _ bb: Double) {} ^
Avatar
omochimetaru 4/11/2020 4:40 PM
んんん?
Avatar
リテラルがややこしくしてるかと思ったけどリテラルじゃなくてもダメで、
4:41 PM
5.1 だと #2 になってるのがさらに謎。
Avatar
omochimetaru 4/11/2020 4:41 PM
5.1では良かったのが5.2で壊れた?
Avatar
ああ、 5.1 の挙動はこれでいいのか。
Avatar
omochimetaru 4/11/2020 4:43 PM
5.1はfix constraint( new diagnostic architecture)が入ってないから
4:43 PM
その先のタイプエラーは出ないけど
4:43 PM
argument matchingで デフォルト付きの 1 にバインドする結果 2が引数不足でエラーなので
4:43 PM
僕が書いたやつの5.1時代の挙動として一貫してる
Avatar
これって bbDouble だから省略されてるのは aa だとラベルなくても判断できるけど、エラーで正しいでいいのかな?
Avatar
omochimetaru 4/11/2020 4:45 PM
実装としてはラベルマッチング処理においては型情報は見ないんですよ。
Avatar
なるほど。
Avatar
omochimetaru 4/11/2020 4:45 PM
まあそこは言語仕様の決めの問題として悩ましい部分だとは思う。
4:46 PM
型推論によってラベルマッチングも影響を受けたら、便利なときもあるけどわかりにくい謎現象も起きそう。
Avatar
trailing closure のラベル省略とか絡むと更にややこしそう・・・
Avatar
omochimetaru 4/11/2020 4:47 PM
-debug-constraints 見ると、masterの挙動だと、 synthesize missing argument fixだけじゃなくて、allow argument to parameter type conversion mismatch fix も生成されていて
4:47 PM
それがバグの原因になってそうだなあ。
Avatar
trailing closure の場合は必ず最後の引数にマッチされるからいいのか?
Avatar
@swift-main func f(_ aa: Int..., _ bb: Double) {} なのでこの制限があるんですね。
Avatar
swiftNightly BOT 4/11/2020 4:47 PM
exit status: 1 with stderr:<stdin>:1:22: error: a parameter following a variadic parameter requires a label func f(_ aa: Int..., _ bb: Double) {} ^
Avatar
omochimetaru 4/11/2020 4:48 PM
その仕様、この前バグ探してたら見つけたwよく考えてある
4:49 PM
ラベルに型推論を絡めればそういうのも許せますね。
4:49 PM
それこそさっき言ったとおりリテラルの絡みで予想外の事が起こりそうw
Avatar
可変長引数もデフォルト引数も後ろの引数にしか付けれない言語多いから、 Swift は言語仕様的に何が許されてるのかよくわからなくなる。ラベルがあることもさらに挙動を複雑にしてる気がする。
Avatar
omochimetaru 4/11/2020 4:49 PM
trailing closureも、
4:50 PM
最後の引数がデフォルト付きの場合はその一個手前に関数にマッチできるという
4:50 PM
謎仕様が最近入っててややこしくて
Avatar
それややこしそうw
Avatar
omochimetaru 4/11/2020 4:50 PM
それを、N個に拡張するパッチを僕が作ってこの前通したんだけどそれがリグレッションを出しちゃってrevertされたとこ。 (edited)
Avatar
まあでもデフォルト引数をオーバーロードと考えたら trailing closure できるのもいいのか。
Avatar
omochimetaru 4/11/2020 4:51 PM
あのリグレッションは1個の場合にも問題が起きる気がするんだけどなあ〜
Avatar
あれをリグレッションというのは酷な感じでしたね。
Avatar
omochimetaru 4/11/2020 4:52 PM
今、沼ってるやつを通したら再チャレンジするつもり。
Avatar
オーバーロードとデフォルト引数があるのもややこしい・・・。
Avatar
omochimetaru 4/11/2020 4:52 PM
まあでもデフォルト引数をオーバーロードと考えたら
このあたりを今いろいろ考えてるんですけど
4:52 PM
オーバーロードと考える場合は、まさに、型推論システムに投げる事になるんすよね。
4:53 PM
考えると言うか、実際にオーバーロードで書いた場合は。
Avatar
パフォーマンス出すのが大変そう。
Avatar
omochimetaru 4/11/2020 4:53 PM
で、オーバーロードしないで、デフォルト値を使った場合は、 型推論絡めずに静的に解くので
4:53 PM
オーバーロードだとマッチできるけどデフォルト値だとできないようなケースがあるかも。 (edited)
4:54 PM
てか今話題になってるやつがまさにそうだ。
Avatar
それって実装都合でそうなってるって話?
Avatar
omochimetaru 4/11/2020 4:54 PM
そこまではわかんないです。
4:55 PM
特に文書とかは心当たりない。
4:55 PM
「オーバーロードは型推論だけど、似たような事をできるデフォルトパラメータと可変長パラメータについては、推論器使わないで静的にやる」のが設計思想なのかたまたま今そうなのかは気になりますね。
Avatar
@swift-main func f(_ aa: Int = 0, _ bb: Int) { print(1) } func f(_ bb: Int) { print(2) } f(1)
Avatar
omochimetaru 4/11/2020 4:56 PM
パフォーマンス気にしてそうなってそうな気はするけど。
Avatar
swiftNightly BOT 4/11/2020 4:56 PM
2
Avatar
omochimetaru 4/11/2020 4:56 PM
うわあ。
Avatar
こういうことですね。
Avatar
当然↓もいけた。 @swift-main func f(_ bb: Double) {} func f(_ aa: Int, _ bb: Double) {} f(1.0)
Avatar
swiftNightly BOT 4/11/2020 4:57 PM
no output
Avatar
omochimetaru 4/11/2020 4:57 PM
aaにデフォルトつけるのは意地悪だ・・・
4:57 PM
そうですね、そっちは自然。>koherの方
Avatar
さっきので func f(_ aa: Int = 0, _ bb: Int) { print(1) } にはマッチしないんだから、 func f(_ bb: Int) が選ばれるのは自然なんじゃないの?
Avatar
omochimetaru 4/11/2020 4:59 PM
そうですね。 func f(_ aa: Int = 0, _ bb: Int) にマッチしないのがバグだとみなすなら、意地悪だなと思いました。 (edited)
5:00 PM
または、koherの言うように「デフォルトパラメータはオーバロードと考える」のであれば、変な並びになる。
5:01 PM
func f(_ aa: Int = 0, _ bb: Int) {} // ↑が↓のオーバーロードを意味していると捉えるなら func f(_ bb: Int) {} func f(_ aa: Int, _ bb: Int) {} // 並べるなら下つじゃないと変。 (edited)
Avatar
@swift-main func f(_ aa: Int, _ bb: Int = 0) { print(1) } func f(_ bb: Int) { print(2) } f(1)
Avatar
swiftNightly BOT 4/11/2020 5:01 PM
2
Avatar
↑は ambiguous にはならないの?
Avatar
omochimetaru 4/11/2020 5:02 PM
デフォルトパラメータが発動すると?含まれてると?オーバーロード優先度が下がる (edited)
Avatar
そうなのか。
Avatar
omochimetaru 4/11/2020 5:03 PM
マニアックw
Avatar
何が仕様で何が実装の結果なのか・・・。これは仕様?
Avatar
omochimetaru 4/11/2020 5:03 PM
そのへんも文書は見たことない気がするなあ
Avatar
それは明に実装されているので、仕様と言っていいと思います。
Avatar
なるほど。ドキュメントにはなってなくても、意図的にそうしてるってことですね。
Avatar
typecheck の細かい仕様は文書化されてないと思います。
Avatar
omochimetaru 4/11/2020 5:05 PM
前フォーラムで、細かいところを文書化して固定しちゃうと、改善もしにくくなっちゃう、ってコアチームの誰かが書いてたと思う
5:05 PM
なんか、コントリビューションを盛り上げるためにももっと内部の説明があったほうがよいのでは、みたいな意見に対して。
5:06 PM
comparing solutions 1 and 0 Comparing declarations func f(_ bb: Int) { } and func f(_ aa: Int, _ bb: Int = 0) { } (isDynamicOverloadComparison: 0) (found solution 0 0 0 0 0 0 0 0 0 0 0 0 0) comparison result: better Comparing declarations func f(_ aa: Int, _ bb: Int = 0) { } and func f(_ bb: Int) { } (isDynamicOverloadComparison: 0) comparison result: not better comparing solutions 1 and 0
5:06 PM
↑さっきのやつ。スコアは同じで comparing declarationが出てくる。
5:09 PM
「意図的」ってのは良い概念ですね、そう言えばいいのか。
Avatar
これは許されてなかった。 @swift-main protocol P { func f(_: Int) func f(_: Int, _: Int) } struct S: P { func f(_ aa: Int, _ bb: Int = 0) { print(1) } } let s: S = S() s.f(42)
Avatar
swiftNightly BOT 4/11/2020 5:10 PM
exit status: 1 with stderr:<stdin>:6:8: error: type 'S' does not conform to protocol 'P' struct S: P { ^ <stdin>:2:10: note: protocol requires function 'f' with type '(Int) -> ()'; do you want to add a stub? func f(_: Int) ^
Avatar
まあ当たり前か。
Avatar
omochimetaru 4/11/2020 5:10 PM
ww
5:10 PM
いや、当たり前じゃないかも?
Avatar
P は witness table に二つのエントリーを必要とするけど、 S の実装では一つにしかならないんじゃない?
Avatar
omochimetaru 4/11/2020 5:11 PM
@swift-main protocol P { func f(a: Int) } struct S: P { func f(a: Int, b: Int = 0) {} }
Avatar
swiftNightly BOT 4/11/2020 5:11 PM
exit status: 1 with stderr:<stdin>:4:8: error: type 'S' does not conform to protocol 'P' struct S: P { ^ <stdin>:2:8: note: protocol requires function 'f(a:)' with type '(Int) -> ()'; do you want to add a stub? func f(a: Int) ^
Avatar
omochimetaru 4/11/2020 5:11 PM
そもそもこれが通らないんだ。
5:11 PM
@swift-main protocol P { func f(a: Int) func f(a: String) } struct S: P { func f<T>(a: T) {} }
Avatar
swiftNightly BOT 4/11/2020 5:11 PM
no output
Avatar
omochimetaru 4/11/2020 5:12 PM
一つのエントリで複数のrequirementsをconformするのは許されてるんですよ。
Avatar
えー、それいいの?
5:12 PM
まじか・・・
Avatar
omochimetaru 4/11/2020 5:12 PM
これはめっちゃいい技ですよ。
5:12 PM
visitor patternと組み合わせると任意の型階層で共通実装を提供できる
5:14 PM
デフォルト引数を使ってprotocol実装できてもいいじゃんって話題最近見たな。
Avatar
@swift-main protocol P { func f(_: Int, _: Int) } extension P { func f(_ aa: Int) { print(2) } } struct S: P { func f(_ aa: Int, _ bb: Int = 0) { print(1) } } let s: S = S() s.f(42)
Avatar
swiftNightly BOT 4/11/2020 5:14 PM
1
Avatar
順位がひっくり返った。
Avatar
omochimetaru 4/11/2020 5:14 PM
で、とりあえず仕様を整理しようぜってmanifesto書いてる人がいる https://forums.swift.org/t/protocol-witness-matching-mini-manifesto/32752
Hello Swift community, I have been working on a "mini-manifesto" whose aim is to set out basic design principles around protocol witness matching and get some agreement from the Swift community on it. One of the reasons why is because I am currently pitching a new form of wit...
5:15 PM
うわあ・・・w
Avatar
複数エントリで一つのrequirementはthunkで頑張ればなんとかなるかもしれないけど、前提としてこれが必要な気がする。 https://forums.swift.org/t/idea-question-default-arguments-vs-abi-vs-code-size/10823
The current ABI for default arguments generate explicit functions for each default argument in a function. As a simple example, when you call something like this: // In the defining module. func foo(a: Int, b: Int = 42, c: Float = 3.14) { ... } // On the caller side. foo...
Avatar
omochimetaru 4/11/2020 5:16 PM
静的なSのメソッドの方が優先してるのかな?
5:16 PM
Pの方はprotocol upcast?が居る?
Avatar
@swift-main protocol P { func f(_: Int, _: Int) } extension P { func f(_ aa: Int) { print(2) } } struct S: P { func f(_ aa: Int, _ bb: Int = 0) { print(1) } } let s: S = S() s.f(42) let p: P = s p.f(42)
Avatar
swiftNightly BOT 4/11/2020 5:17 PM
1 2
Avatar
omochimetaru 4/11/2020 5:17 PM
thunkで頑張るが自然だと思うけどその場合もこれ要ります?
5:18 PM
あいや、あれ?
5:19 PM
ああ、前半は現状挙動で、このスレにテーマは optional にコンパイルする別方式か。
Avatar
です。ABI破壊なのでもう無理ですね。
Avatar
@swift-main protocol P { func f(_: Int) func f(_: Int, _: Int) } extension P { func f(_ aa: Int) { print(2) } } struct S: P { func f(_ aa: Int, _ bb: Int = 0) { print(1) } } let s: S = S() s.f(42) let p: P = s p.f(42)
Avatar
swiftNightly BOT 4/11/2020 5:20 PM
1 2
Avatar
↑これでも 1 になるの?
Avatar
omochimetaru 4/11/2020 5:21 PM
上と下で変わってるからそれで良さそう
Avatar
↓は当然両方 3 になる。 @swift-main protocol P { func f(_: Int) func f(_: Int, _: Int) } extension P { func f(_ aa: Int) { print(2) } } struct S: P { func f(_ aa: Int) { print(3) } func f(_ aa: Int, _ bb: Int = 0) { print(1) } } let s: S = S() s.f(42) let p: P = s p.f(42)
Avatar
swiftNightly BOT 4/11/2020 5:21 PM
3 3
Avatar
@swift-main class C1 { func f(_ aa: Int) { print(1) } func f(_ aa: Int, _ bb: Int) { print(2) } } class C2: C1 { override func f(_ aa: Int, _ bb: Int = 0) { print(3) } } let c2: C2 = C2() c2.f(42) let c1: C1 = c2 c1.f(42)
Avatar
swiftNightly BOT 4/11/2020 5:26 PM
1 1
Avatar
omochimetaru 4/11/2020 5:26 PM
Comparing declarations func f(_ aa: Int) { } and func f(_ aa: Int, _ bb: Int = 0) { } (isDynamicOverloadComparison: 0) comparison result: not better Comparing declarations func f(_ aa: Int, _ bb: Int = 0) { } and func f(_ aa: Int) { } (isDynamicOverloadComparison: 0) comparison result: better comparing solutions 0 and 1
5:27 PM
↑ここだけみると逆に見えちゃうけど
5:27 PM
--- Solution #0 --- locator@0x7fd8578d8e00 [DeclRef@b.swift:15:3] with b.(file).main(a:).a@b.swift:14:11 as a: S --- Solution #1 --- locator@0x7fd8578d8e50 [UnresolvedDot@b.swift:15:5 -> member] with b.(file).P extension.f@b.swift:7:8 as S.f: (Int) -> () Opened types: locator@0x7fd8578d8e50 [UnresolvedDot@b.swift:15:5 -> member] opens τ_0_0 -> $T4
5:27 PM
↑ここからの推測で
5:27 PM
P.f の呼び出しは実際には func f<Self>(self: Self, _ aa: Int) の呼び出しだから (edited)
5:28 PM
「ジェネリックな方が弱い」が効いてるんじゃないかしら
Avatar
クラスの継承だと順位が変わった。
Avatar
omochimetaru 4/11/2020 5:30 PM
(-debug-constraints の comparing declarationsはログもっと出てほしいな
5:30 PM
ほんとだw
5:31 PM
継承はプロトコルと違って見えないジェネリックパラメータSelfが無いからじゃないかしら?w
Avatar
ところで comparing declaration で (-1|0|+1) を返すのでは無くわざわざ二回比較しているのは何故なんだろう?
Avatar
対応がわかりづらかったのでワンソースにして、 print する値もそろえてみた。 @swift-main protocol P { func f(_: Int) func f(_: Int, _: Int) } extension P { func f(_ aa: Int) { print(1) } } struct S: P { func f(_ aa: Int, _ bb: Int = 0) { print(2) } } let s: S = S() s.f(42) let p: P = s p.f(42) ////////////////////// class C1 { func f(_ aa: Int) { print(1) } func f(_ aa: Int, _ bb: Int) { print(999) } } class C2: C1 { override func f(_ aa: Int, _ bb: Int = 0) { print(2) } } let c2: C2 = C2() c2.f(42) let c1: C1 = c2 c1.f(42)
Avatar
swiftNightly BOT 4/11/2020 5:33 PM
2 1 1 1
Avatar
omochimetaru 4/11/2020 5:33 PM
あ〜、なんで2回比較してるのか謎だったけど == の場合を見たいからか。
5:34 PM
で、rintaroさんの言ってるのは最初から 3値論理で実装したら良いじゃんって事か。
5:34 PM
2値のほうが実装がミスしにくいからじゃないですかね?
💡 1
5:34 PM
でもパフォーマンスのこと考えるなら、3値にしたほうがよいですよね。
5:41 PM
@swift-main func f(_ aa: Int..., bb: String = "", _ cc: Double) {} func main(i: Int, d: Double) { f(i, i, i, d) }
Avatar
swiftNightly BOT 4/11/2020 5:41 PM
exit status: 1 with stderr:<stdin>:4:9: error: missing argument for parameter #3 in call f(i, i, i, d) ^ , <#Double#> <stdin>:1:6: note: 'f(_:bb:_:)' declared here func f(_ aa: Int..., bb: String = "", _ cc: Double) {} ^ <stdin>:4:14: error: cannot convert value of type 'Double' to expected argument type 'Int' f(i, i, i, d) ^ Int( )
Avatar
omochimetaru 4/11/2020 5:41 PM
↑可変長の後にラベル付きが必要だけど、かりにそこにデフォルトを与えた場合でも、当然期待通りには動かないな。
5:42 PM
でも呼び出しが通るとするなら、最後の d だけ #3 に対応させるしか無いはず。
Avatar
func f(_ aa: Int..., bb: String = "", _ cc: Double) {} は少なくとも現状は通らないようにすべきだ。
Avatar
omochimetaru 4/11/2020 5:44 PM
ユーザーが明示的に bb: を与えて区切れるから書けても良くないですか?
Avatar
ああ、そうですね。
Avatar
omochimetaru 4/11/2020 5:45 PM
デフォルト値が発動する事が絶対にない、という点はありますけどね。
Avatar
warning案件か。
Avatar
omochimetaru 4/11/2020 5:45 PM
うーんたしかに。
5:46 PM
簡単に作れそうだ。ネタ帳に書いとこ。
👍 1
Avatar
今まさに↓は普通にコンパイル通るのはいいのかと言おうとしてた。 @swift-main func f(_ aa: Int = 0, _ bb: Int) {} f(1, 2)
Avatar
swiftNightly BOT 4/11/2020 5:47 PM
no output
Avatar
= 0 は無駄なので警告かエラーがいいかと。
Avatar
omochimetaru 4/11/2020 5:48 PM
あ〜そっか、それもそういう事になるのか。絶対に使われないデフォルト値
Avatar
連続する同ラベルパラメータで後方のものが非defaultedの場合? @swift-main func foo(a a1: Int = 1, a a2: Int) {} (edited)
Avatar
swiftNightly BOT 4/11/2020 5:51 PM
no output (edited)
Avatar
omochimetaru 4/11/2020 5:51 PM
同ラベルこわい
Avatar
Kishikawa Katsumi 4/11/2020 5:52 PM
なるほど。Swiftの引数ってなかなか複雑なんですねえ
Avatar
omochimetaru 4/11/2020 5:53 PM
@swift-main func f(aa a1: Int = 1, aa a2: Int) {} f(aa: 2)
Avatar
swiftNightly BOT 4/11/2020 5:53 PM
exit status: 1 with stderr:<stdin>:2:8: error: missing argument for parameter 'aa' in call f(aa: 2) ^ , aa: <#Int#> <stdin>:1:6: note: 'f(aa:aa:)' declared here func f(aa a1: Int = 1, aa a2: Int) {} ^
Avatar
omochimetaru 4/11/2020 5:53 PM
同じだ〜ダメだ〜
5:53 PM
これも腐りデフォルト
5:54 PM
@Kishikawa Katsumi そうなんですよ。今このマッチング部分を改造してるんですけど、沼が深い。
5:54 PM
Apple主導だから成り立ってるけどC++みたいにフォーマルさが強い言語じゃあ採用できない仕様だなあと思う。
Avatar
Kishikawa Katsumi 4/11/2020 5:54 PM
ここまでの例をみる限りは、紛らわしいのは全部エラーにしてくれる方が良い気がしますが。。。
Avatar
omochimetaru 4/11/2020 5:56 PM
紛らわしいけど有用なものいろいろあるから線引が難しそう。
Avatar
Kishikawa Katsumi 4/11/2020 5:56 PM
そっすね。オーバーロードは便利だし。
5:57 PM
私はIDEがどっち呼んでるのかをちゃんと教えてくれたら複雑でも大丈夫かなと思ってるけど。。。
Avatar
omochimetaru 4/11/2020 5:57 PM
オーバーロードやばいよなあw
5:57 PM
この前発表してから tarunon とか iceman が @_disfavoredOverload 使っててウケる。
Avatar
Kishikawa Katsumi 4/11/2020 6:01 PM
@_disfavoredOverload が付いてたら、それを呼ぶ側が知らない場合、こっちが呼ばれるはずだけどなぜかこっち、みたいな混乱が起こりますか?
Avatar
omochimetaru 4/11/2020 6:01 PM
起こりますね。
6:02 PM
てか、SwiftUIでそれがめちゃくちゃ発生してるはず。
6:02 PM
Text("hoge") みたいな、文字列リテラルを与えたケースの優先度がひっくり返ってる
6:03 PM
どっちが呼ばれてもなんとなくユーザーが期待した挙動になるならいいってことでもありますけど。
Avatar
Kishikawa Katsumi 4/11/2020 6:03 PM
なるほど。やっぱり @overloadPrecedence(800) みたいなので決められるのがいいんじゃないか。
Avatar
omochimetaru 4/11/2020 6:04 PM
そうですね、1段階だけフラグがあるのは不自然だし。
6:05 PM
disfavorもひっくり返っててわかりにくいし。
6:05 PM
@favoredOverload(1) @favoredOverload(2) とかで数字が大きい方に吸い込まれるならわかりやすそう。
6:07 PM
protocol P1 { func f(a: Int) } protocol P2 { func f(a: Double) } func main(x: P1 & P2) { x.f(a: 0) }
6:07 PM
↑こうやって別の型から合流してくる時はその優先度数の足並みが合わせられなかったりしそう。
Avatar
Kishikawa Katsumi 4/11/2020 6:14 PM
めっちゃ難しいな。
1:34 PM
昨日の謎現象(#2 になるやつ) はめっちゃピンポイントな特別実装がされてた。
1:36 PM
arg[0] が type mismatch かつ call に missing arg が発生していて、 arg[1] が param[1] に convertbile な場合に
1:37 PM
missing arg の位置を arg[1] にして diagnose して、 type mismatch を握りつぶす
1:37 PM
というロジックが入ってる。
Avatar
5.1と5.2で変わったのがこれか。
Avatar
omochimetaru 4/12/2020 1:38 PM
ああ、5.2 で入った constraint fix を使って、こういう事が実装できるようになるので、そうです。
1:38 PM
5.1 までは もっと序盤でエラー落ちしちゃって、こういう凝った診断は出せない。
1:38 PM
微妙だと思ったのが、↑に出てくる [0] とか [1] がハードコードで
1:38 PM
マジで昨日のパターンのコードでしか起きない事。
Avatar
omochimetaru 4/12/2020 1:39 PM
実装時に想定しているのは、arg[0]にデフォルトが無い場合だけだったから、 (edited)
Avatar
このコミットはデフォルト引数関係なくて、診断のメッセージを改善するためで、
1:40 PM
その巻き添え(?)で昨日のメッセージ変わる現象が起こったのか。
Avatar
omochimetaru 4/12/2020 1:40 PM
バグも生まれた。
Avatar
[0] とか [1] がハードコードで
↓だとどうなるんだろ? @swift-main func f(x: String, _ aa: Int = 0, _ bb: Double) {} f("", 42.0)
Avatar
swiftNightly BOT 4/12/2020 1:41 PM
exit status: 1 with stderr:<stdin>:2:3: error: missing argument for parameter 'x' in call f("", 42.0) ^ x: <#String#>, <stdin>:1:6: note: 'f(x:_:_:)' declared here func f(x: String, _ aa: Int = 0, _ bb: Double) {} ^ <stdin>:2:3: error: cannot convert value of type 'String' to expected argument type 'Int' f("", 42.0) ^
Avatar
まちがえた
1:42 PM
@swift-main @swift-5.2.5 @swift-5.1.5 func f(x: String, _ aa: Int = 0, _ bb: Double) {} f(x: "", 42.0)
Avatar
swiftNightly BOT 4/12/2020 1:42 PM
exit status: 1 with stderr:<stdin>:2:14: error: missing argument for parameter #3 in call f(x: "", 42.0) ^ , <#Double#> <stdin>:1:6: note: 'f(x:_:_:)' declared here func f(x: String, _ aa: Int = 0, _ bb: Double) {} ^ <stdin>:2:10: error: cannot convert value of type 'Double' to expected argument type 'Int' f(x: "", 42.0) ^ Int()
Avatar
exit status: 1 with stderr:<stdin>:2:14: error: missing argument for parameter #3 in call f(x: "", 42.0) ^ , <#Double#> <stdin>:1:6: note: 'f(x:_:_:)' declared here func f(x: String, _ aa: Int = 0, _ bb: Double) {} ^ <stdin>:2:10: error: cannot convert value of type 'Double' to expected argument type 'Int' f(x: "", 42.0) ^ Int()
Avatar
exit status: 1 with stderr:<stdin>:2:14: error: missing argument for parameter #3 in call f(x: "", 42.0) ^ , <#Double#> <stdin>:1:6: note: 'f(x:_:_:)' declared here func f(x: String, _ aa: Int = 0, _ bb: Double) {} ^
Avatar
おおお、 #2#3 になってない・・・。
Avatar
omochimetaru 4/12/2020 1:43 PM
そうw
1:43 PM
起点が[1]だと発動しない。
1:43 PM
あと・・・
1:43 PM
@swift-5.2.5 func f(a: Int, b: String) {} f(a: "a")
Avatar
exit status: 1 with stderr:<stdin>:2:3: error: missing argument for parameter 'a' in call f(a: "a") ^ a: <#Int#>, <stdin>:1:6: note: 'f(a:b:)' declared here func f(a: Int, b: String) {} ^
Avatar
omochimetaru 4/12/2020 1:44 PM
↑こんなひどい誤作動も・・・
Avatar
omochimetaru 4/12/2020 1:44 PM
どうみても 引数a: は渡してるのにw
1:44 PM
コミットメッセージでは arg[0, 1] が unlabeled の場合のシナリオを書いてあるけど
1:44 PM
そのチェックが無いですね。
Avatar
でも unlabeled に限らず同じラベルのときとかも同じケースなんよね?
Avatar
omochimetaru 4/12/2020 1:45 PM
params[0]とparams[1]が同じラベル名だったときはうまく動いて見えますね。
Avatar
ああ、えっと、 unlabeled でないと弾くという処理にしてしまうとさっきの ab は解消されても aa は元に戻っちゃうよね?ということ。
Avatar
omochimetaru 4/12/2020 1:47 PM
そうですね。
1:47 PM
「params[0]とparams[1]が同じラベルだったら」
1:48 PM
って書くと良さそうです。
👌 1
Avatar
これって三つ以上でも同じ問題ってないの?
Avatar
omochimetaru 4/12/2020 1:48 PM
どういう意味ですか?
Avatar
今は [0][1] だけに対応が入ってるけど
1:49 PM
[0][1] 以外でも同じ問題は起こり得るよね?それこそさっきの異なるラベルの第一引数を入れるとか。
1:49 PM
なんで [0][1] だけ対応したんだろう?
Avatar
omochimetaru 4/12/2020 1:50 PM
なんか、他のところ見ててもPavelさんの実装はそういうのがよくあるんですよね。 昨日話した trailing closure の右にデフォルト引数が「1個だけ」置けるとか。
1:50 PM
これは予想ですけど
1:50 PM
Apple内部でSwiftUIを試しに使って、わかりにくいエラーメッセージが出たら内部raderに登録されて
1:50 PM
とりあえずそのチケットだけ潰してるんじゃなかろうか。
Avatar
ああ、あれ 1 個『だけ』だったのか。
Avatar
omochimetaru 4/12/2020 1:51 PM
そう。1個だけなのは変だと思ったんで、僕が、連続してればN個置けるようにした。
1:51 PM
ただ、他の問題との兼ね合いでまとめてリグレッションとしてrevertされた。
Avatar
なるほど。そういう場当たり的対応は放置すると禍根を残しそうだね・・・。
Avatar
omochimetaru 4/12/2020 1:52 PM
Pavelさん忙しそうな雰囲気があるし
1:52 PM
constraint fix が SwiftUI 改善の大きなテーマに位置づけられてるし
Avatar
リグレッションとしてrevertされた
えー。それが昨日 rintaro さんと話してたやつか。
Avatar
omochimetaru 4/12/2020 1:52 PM
めっちゃてんてこまいなんじゃないかと予想してるw
Avatar
なるほど。細かいところはとりあえず暫定で潰してる感じなのか。
Avatar
omochimetaru 4/12/2020 1:53 PM
ただこれ個人的には仮に汎用化しても微妙だと思ってて
1:54 PM
診断メッセージが出るところだけみたらうまく動いてるんですけど
1:54 PM
握りつぶしてメッセージをすり替えているので、 内部的には、メッセージとは異なるエラーが生成されているんですけど
1:54 PM
それがオーバーロード選択と関係しているんですよね
1:55 PM
だから、まあ例えば 片方の func f は エラーペナルティが2点, もう一つは エラーペナルティが3点だったとしたら、 (edited)
1:56 PM
この仕組は後者の3点のケースで、まるで1点の状況かのように出力だけいじってるんですよ
1:56 PM
だから、一つずつ実行すると、片方は2点、もう片方は1点の出力になるのに
1:56 PM
オーバーロード選択させると、なぜか成績の悪い2点の方の結果がでる
1:56 PM
という事が起こりえます。
1:57 PM
1点に見える呼び出しが内部的には3点だからです。
1:59 PM
昨日も書いたように本当に改善するならラベルマッチの時点で型情報が必要なので型推論の設計修正が必要で大変。
Avatar
https://github.com/apple/swift-evolution/pull/1144 複数 trailing closure がシンタックス変わって再提出されそうです。
👀 1
Avatar
omochimetaru 4/16/2020 2:39 AM
あ!このリポジトリだけsubscribeしてなかった。そうか、先にわかるのかw
2:39 AM
昨日 #swift で書いたけど PR30916 が気になってました。
2:42 AM
kylemacomber has 2 repositories available. Follow their code on GitHub.
2:42 AM
オーサーに見慣れない名前がある
Avatar
UIView.animate(withDuration: 0.3) { self.view.alpha = 0 } completion: { _ in self.view.removeFromSuperview() } animations: は書かないけど completion: は書くの?
2:46 AM
二つが対等なんじゃなくて、 animations が本体で completion は付随する処理てきなイメージなのかな?そういう場合に使う想定?
Avatar
想定としてはそうでしょうね。とはいえ、 UIView.animate(withDuration: 0.3, animation: { self.view.alpha = 0 }) { self.view.removeFromSuperview() } も相変わらず書けるので、想定の呼び出し方を強制するものでもないですね。
😂 1
Avatar
omochimetaru 4/16/2020 2:48 AM
なんか UIView.animate の場合は 奇跡的にその仕様でも自然に見えるな・・・
2:49 AM
.animate( が animationの指定の部分のタイトルっぽく見えるから・・・
2:49 AM
UIView.animate(withDuration: 0.3) animation: { self.view.alpha = 0 } completion: { _ in self.view.removeFromSuperview() } ↑こう書きたいな。
Avatar
うん、せめてそうなっててほしい気が・・・。
Avatar
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
Button { print("hello world") } label: { HStack { ... } } SwiftUIだとこんな感じになるのかな
2:53 AM
action後ろのほうが良くないかしら…
Avatar
action 後ろの方が良さそうに見えますね。
Avatar
omochimetaru 4/16/2020 2:55 AM
Optionally Labeled First Trailing Closure
Avatar
書いてあることとは別だけど ipAddressPublisher .sink receiveCompletion: { completion in // handle error } () ない場合、ラベル書けると気持ち悪いですね。 < Alternatives Consideredで否定
2:57 AM
API authors should be naming functions assuming that the argument label of the first trailing closure will be dropped.
3:00 AM
API ガイドラインにそんなのあるんでしたっけ?
3:00 AM
The first trailing closure drops its argument label (like today).
Name functions assuming that the argument label of the first trailing closure will be dropped.
Avatar
omochimetaru 4/16/2020 3:00 AM
1文目おかしくない?
Avatar
Proposal 中で繰り返し↑が言われてるけど。
Avatar
omochimetaru 4/16/2020 3:01 AM
todayで省略できるのはfirstじゃなくてlastじゃないのか
Avatar
_ にしろということかな。
Avatar
omochimetaru 4/16/2020 3:01 AM
あ、trailing closureに限って考えた場合はtrailing closureは1個だからfirstって解釈か。
Avatar
ああ、そういう意味か。
3:02 AM
今も省略できるんだから、これからも一貫性を持たせるべきってこと?
3:02 AM
で、それに沿って名前をつけろと。
3:02 AM
でも、並列で二つのクロージャを受けてた API とかもあるはずだし、なんかめちゃくちゃな主張な気が。
Avatar
omochimetaru 4/16/2020 3:03 AM
ww
Avatar
せめて、一つ目のクロージャ引数が _ の場合だけこの機能使えるとかの方がいいんじゃないかな?
Avatar
omochimetaru 4/16/2020 3:03 AM
明らかに変な事になるシナリオがありそうだよなあ (edited)
3:03 AM
UIView.animate の場合は
3:04 AM
オーバーロードが2つあって
3:04 AM
animationしか引数を取らないやつと、
3:04 AM
animationと、デフォルト = nil な completion を取るやつ
3:04 AM
があるんですね。
3:04 AM
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^ __nullable)(BOOL finished))completion API_AVAILABLE(ios(4.0)); // delay = 0.0, options = 0 + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations API_AVAILABLE(ios(4.0)); // delay = 0.0, options = 0, completion = NULL
Avatar
そういうシナリオではうまくいくけど、すごく限定的な気が・・・。
Avatar
omochimetaru 4/16/2020 3:05 AM
ここがポイントに思える。
3:06 AM
ipAddressPublisher .sink() receiveCompletion: { completion in // handle error }
3:06 AM
↑「最初のTCにラベルを付ける場合は空丸括弧が必要」
3:07 AM
ってルールとセットで、最初のTCにラベルを任意で付けられるようにするのが
3:07 AM
良いんじゃないかしら
Avatar
_ でないと trailing closure 禁止でいい気がする・・・
Avatar
omochimetaru 4/16/2020 3:09 AM
それだと従来の UIView.animate { }  もだめになって
3:09 AM
下位互換性がなくない?
Avatar
うん、ない。
3:10 AM
今からは無理なのはわかってるけど、それの方が良かったんじゃないかって話。
Avatar
omochimetaru 4/16/2020 3:11 AM
なるほど。
3:11 AM
この文法の場合はラベル構文との衝突が問題になりそうだけど
3:12 AM
プロポーザルで言及あるのかな
Avatar
もうここまでやるなら : も省略しちゃえば func if(_ condition: Bool, _ body: () -> Void, else: () -> Void) { ... } if(foo) { ... } else { ... } とかできるけど、 Swift でやることじゃないね。 (edited)
Avatar
omochimetaru 4/16/2020 3:14 AM
ラベルの次には if とか while が来ないといけないから曖昧にならない・・・?
Avatar
単一の式の場合は {} 省略とかだとなんとかならないかな?
Avatar
omochimetaru 4/16/2020 3:16 AM
今試してるけど LABEL: { } が今通らないな
3:16 AM
なんかそれは超初期に検討されてたらしいですね > if else 自作
Avatar
式指向の言語ならこういう方向で文と式を統合するのありかもしれないけど、 Swift は文指向なので違うと思う。
Avatar
omochimetaru 4/16/2020 3:17 AM
単一の式の場合って?
Avatar
ちょっと違うケースの話してたかも。 else if を↑の枠組みでどう書くか。
Avatar
omochimetaru 4/16/2020 3:18 AM
else_if 版をオーバーロードかなあ。
Avatar
単一の式の場合はブレースを省略
TSみたいな感じかな
Avatar
ですね。
Avatar
omochimetaru 4/16/2020 3:18 AM
ああ、そういうことか。
3:18 AM
autoclosureがそれじゃない?
Avatar
なるほどw
3:18 AM
いやでも {} で書きたいケースもあるから
Avatar
omochimetaru 4/16/2020 3:19 AM
autoclosureに { } 渡せなかったっけ
Avatar
渡せなくなかったっけ?
Avatar
omochimetaru 4/16/2020 3:19 AM
ほんとだ
Avatar
@swift-5.2.5 func foo(_ x: @autoclosure () -> Int) { print(x()) } foo { 42 }
Avatar
exit status: 1 with stderr:<stdin>:3:5: error: cannot convert value of type '() -> Int' to expected argument type 'Int' foo { 42 } ^
Avatar
omochimetaru 4/16/2020 3:19 AM
なんか途中でだめになりませんでしたっけ?
3:20 AM
@swift-4.0.3 func foo(_ x: @autoclosure () -> Int) { print(x()) } foo({ 42 }) (edited)
Avatar
exit status: 1 with stderr:<stdin>:2:5: error: function produces expected type 'Int'; did you mean to call it with '()'? foo({ 42 }) ^~~~~~ () (edited)
Avatar
@swift-5.2.5 func foo(_ x: @autoclosure () -> Int) { print(x()) } foo(42)
Avatar
42
Avatar
omochimetaru 4/16/2020 3:20 AM
ダメか。
Avatar
昔からダメで困った気がする。
Avatar
omochimetaru 4/16/2020 3:20 AM
なるほど。
Avatar
Tを受けるAutoclosureにClosureを渡すとT=()->(Int)として解釈される、みたいなのを勘違いしてるのでは
Avatar
ちがったかな。困ったのは可変長引数に配列渡せないことだったかも。
Avatar
omochimetaru 4/16/2020 3:21 AM
それかもしれん。 > T => () -> (Int) (edited)
3:21 AM
それ全然違う話ですけど、それも困りますねw
3:21 AM
昨日 @niw が書いてた・・・
Avatar
前もそれ勘違いして議論がぐちゃってたのを見た気がする
Avatar
Java では普通にできるのに、って思ったから困ったのは可変長な気がしてきた。
Avatar
omochimetaru 4/16/2020 3:22 AM
Javaってsplatできましたっけ?
3:22 AM
まあ新SE-0279は個人的にはありだなあ、最初のラベルの問題はあるけど
3:23 AM
前作の カッコ変わっただけやんけ版とは全然違う
3:24 AM
うーん、まあカッコ変わっただけよりはマシかも?でもなくてもいい気がするなぁ。
Avatar
omochimetaru 4/16/2020 3:24 AM
↑のどこみればわかりますか?
Avatar
引数展開じゃなくて
3:26 AM
代わりに配列を渡せる
Avatar
omochimetaru 4/16/2020 3:26 AM
どの例?
3:26 AM
あこれか
3:26 AM
String result = MessageFormat.format( "At {1,time} on {1,date}, there was {2} on planet " + "{0,number,integer}.", arguments);
3:27 AM
え、これって、曖昧では??
3:27 AM
配列をsplatしたのか、 可変長の要素の1番目として配列を渡したのか
3:27 AM
わからない。
Avatar
型で区別できないかな?
3:28 AM
オーバーロードがあると曖昧になりそう。
Avatar
omochimetaru 4/16/2020 3:29 AM
<T> だったらダメそう。
3:29 AM
[T] なのか T, T, T,... へのsplatなのかわからない。
Avatar
<T> はダメかもね。
Avatar
omochimetaru 4/16/2020 3:30 AM
む、いや、もしかして
3:30 AM
primitive型しか渡せない?
3:30 AM
いや、Stringがあるからそんなことないか。
Avatar
なんか型パラと配列問題ってあった気が。
3:36 AM
$ cat AmbiguousVarArgs.java public class AmbiguousVarArgs { public static void main(String[] args) { String[] ss = { "XYZ" }; foo(ss); } static <T> void foo(T... xs) { System.out.println(xs); } } $ javac AmbiguousVarArgs.java Note: AmbiguousVarArgs.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. $ javac -Xlint:unchecked AmbiguousVarArgs.java AmbiguousVarArgs.java:7: warning: [unchecked] Possible heap pollution from parameterized vararg type T static <T> void foo(T... xs) { ^ where T is a type-variable: T extends Object declared in method <T>foo(T...) 1 warning $ java AmbiguousVarArgs [Ljava.lang.String;@7852e922
Avatar
omochimetaru 4/16/2020 3:38 AM
?? ↑何が出力されているんだ?
Avatar
Kishikawa Katsumi 4/16/2020 3:42 AM
出力されてるのは String[] ss の文字列表現、に見えます。
Avatar
omochimetaru 4/16/2020 3:43 AM
なるほど てことは配列が展開されなかったってことか。
Avatar
Kishikawa Katsumi 4/16/2020 3:45 AM
どっちにしろ foo(T... xs) { のxsには配列が渡るんじゃないですか?
Avatar
omochimetaru 4/16/2020 3:47 AM
あら?printlnは可変長じゃないのか。
3:47 AM
fooの呼び出しの実験か。
Avatar
Kishikawa Katsumi 4/16/2020 3:49 AM
あ、そっちも可変長引数ということか。 可変長引数って引き継がれるんですかね? 違うか、fooの呼び出しと、printlnの呼び出しの両方で展開されても良さそう、ということですね?
4:04 AM
printf は可変長だけど。
Avatar
Kishikawa Katsumi 4/16/2020 4:11 AM
おお、引数は1つでオーバーロードだ。printlnはprintln(Object x) が呼ばれたんだな。
Avatar
一瞬 System.outPrintStream だったか自信がなくなったけど大丈夫でした。 https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#out
Avatar
Kishikawa Katsumi 4/16/2020 4:17 AM
@koher Javaのコードはどの部分があいまいに解釈されるんですか?
Avatar
可変長引数の一つ目と解釈されて xsString[][] になる可能性があると思います。 (edited)
4:20 AM
いや、 Java では型パラは実行時は常に Object だからおかしいか。
4:22 AM
xs が 第一要素に String[] が入った Object[] になるのか、 Object[] にアップキャストされた String[] になるのかの曖昧さ?
Avatar
Kishikawa Katsumi 4/16/2020 4:25 AM
あ、なるほど。理解しました。どう解決されてるんでしょうねえ。
Avatar
ちなみに Java の配列は covariant なので Object[]String[] を入れられるんですけど、ミュータブルなのでぶっ壊れます。 $ cat BrokenCovariance.java import java.util.Arrays; public class BrokenCovariance { public static void main(String[] args) { String[] ss = { "XYZ" }; Object[] os = ss; // OK System.out.println(Arrays.toString(os)); os[0] = 42; // Can be compiled, but causes runtime error System.out.println(Arrays.toString(os)); } } $ javac BrokenCovariance.java $ java BrokenCovariance [XYZ] Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer at BrokenCovariance.main(BrokenCovariance.java:10)
Avatar
omochimetaru 4/16/2020 4:28 AM
easy killだ
Avatar
Kishikawa Katsumi 4/16/2020 4:30 AM
なるほど。これは難しいな。
4:30 AM
Genericsを後から入れて整合性を保つのは大変なんですね。
Avatar
omochimetaru 4/16/2020 4:31 AM
String[] to Object[] は Java1.4 でもあったんじゃないか?
4:32 AM
< > のジェネリクスが1.5な気がする
Avatar
Kishikawa Katsumi 4/16/2020 4:32 AM
1.4でも実行時エラーになる?
4:36 AM
なりました。ジェネリクスは関係なかった。
4:37 AM
配列はそもそも1種類しか入らないやつか。
4:37 AM
ArrayList的なやつと思い込んでいた。
Avatar
List は use-site variance で covariant にしたら add が消えたりして上手く動くんですけどね。
Avatar
omochimetaru 4/16/2020 4:41 AM
Use site varianceむずい
Avatar
Kishikawa Katsumi 4/16/2020 4:45 AM
なるほど。use-site varianceっていうのは使う側がvarianceを決定できるのか。
Avatar
import java.util.*; public class CovariantLists { public static void main(String[] args) { { // Invariant List<String> ss = new ArrayList<>(); ss.add("XYZ"); // OK List<Object> os = ss; // compile error } { // Covariant List<String> ss = new ArrayList<>(); List<? extends Object> os = ss; // OK os.add(42); // compile error } } } (edited)
Avatar
Kishikawa Katsumi 4/16/2020 4:46 AM
declaration-site varianceは逆で使われる側が決定できるのかな。
Avatar
omochimetaru 4/16/2020 4:46 AM
yes yes
Avatar
です。 Scala は declaration-site で、 Kotlin は両方できます。
Avatar
omochimetaru 4/16/2020 4:46 AM
Javaのuse-site varianceが難しいねってなってC#がdeclaration-site varianceを採用した
Avatar
Kishikawa Katsumi 4/16/2020 4:47 AM
さっき見た記事だとScalaも両方サポートしてるって書いてありました。
Avatar
あれ? Scala 両方できるのか。
Avatar
use-site は難しいというよりも、 Java の ? extends の記法の奇抜さが良くなかった気も・・・。
Avatar
Kishikawa Katsumi 4/16/2020 4:48 AM
Scala, on the other hand, supports both use-site variance (syntax is similar to Java, just replace <? extends T> with [_ <: T]) and declaration-site variance.
^ 書いてあったのを引用しただけ。
Avatar
omochimetaru 4/16/2020 4:48 AM
Covariance if A is a subtype of B then: Java: L<A> is a subtype of L<? extends B> (use-site) Scala: L[A] is a subtype of L[_ <: B] (use-site) L[A] is a subtype of L[+B] (declaration-site) Contravariance if A is a supertype of B then: Java: L<A> is a subtype of L<? super B> (use-site) Scala: L[A] is a subtype of L[_ >: B] (use-site) L[A] is a subtype of L[-B] (declaration-site)
Avatar
Scala はよく知らないので、勝手に declaration-site だけと思ってました。
Avatar
Kishikawa Katsumi 4/16/2020 4:48 AM
なるほど。そういう意味だとScalaはSyntaxもちょっと変えてるからちょうどいいところなのですかね。
Avatar
omochimetaru 4/16/2020 4:48 AM
へ〜 キーワードや記号が違うだけで同じ書き方だな。
Avatar
Kishikawa Katsumi 4/16/2020 4:49 AM
[_ <: T] 確かに extends superは難しいけど、これはわかる気がしないでもない。
4:49 AM
たぶん < か > の方向で示すんでしょ。
Avatar
omochimetaru 4/16/2020 4:50 AM
Scalaは _ がいろんなところで出てくるからそういう意味で受け取りやすいかもな。
Avatar
<, > はどっちの型が広いかですね。
Avatar
omochimetaru 4/16/2020 4:50 AM
Javaの ? は唐突なんだよな
Avatar
初見で何ってなるよねw < ?
4:51 AM
List<? super Animal> とか、 Java 書いてる人の半分は理解してないと思う。
Avatar
omochimetaru 4/16/2020 4:51 AM
今度Scalaやってる人にあったらuse-siteどのくらい使うか聞いてみよ
Avatar
use-site は細かいコントールができるけど、実装側の記述が冗長になるんだよなぁ。
Avatar
Kishikawa Katsumi 4/16/2020 5:07 AM
まあしかしScalaは比べると対称性があってわかりやすい気がするけど、記号いっぱいだし難しいことに変わりはない気もする。 Javaは単語の選択と?が難しかったな。 (edited)
Avatar
omochimetaru 4/16/2020 5:08 AM
Scalaはジェネリクスが [ ] なのが異端で目が慣れるまでちょっと怖い
5:08 AM
印象の問題で本質的な違いではないですが
Avatar
型パラと variance は人類の認知能力では辛い感はありますよね。まあでも、だからこそ型で縛ってくれないと、動的型で適当にやってたら↑の Java の配列みたいに壊せるから。
5:25 AM
Go みたいな選択肢もあるけど。
Avatar
omochimetaru 4/16/2020 5:25 AM
コンテナに変な型のオブジェクトが入ってるのはデバッグも難しいしなあ。
5:25 AM
身元調査が必要になる
Avatar
その点、値型はこのあたりのわずらわしさから解放されてるよね。まずサブタイプないし。
5:26 AM
Swift は Optional でサブタイプもちこんじゃったけど。
Avatar
omochimetaru 4/16/2020 5:26 AM
サブタイプは TT? とかがあるけど
5:27 AM
共有が無いのが良いのかな
Avatar
Optional 、 Union がいいのか( Kotlin, TypeScript, Python )、 Tagged Union がいいのか( Scala, Haskell )、インチキサブタイプがいいのか( Swift )、どれがいいのかずっと自分の中で結論が出てない。
Avatar
omochimetaru 4/16/2020 5:30 AM
Rust も Tagged Union かな
Avatar
シンプルにやりたいことはほとんどのケースで Union なんだけど、きっちりやるなら Tagged Union だし、 Swift はいいとこ取りしようとしたけどインチキによる複雑さを持ち込んじゃったし。
Avatar
omochimetaru 4/16/2020 5:31 AM
インチキってどの部分ですか?
5:32 AM
サブタイピング自体は間違ってないと思うんですよね、値の集合の包含関係から考えて。
Avatar
Swift の Optional は tagged union だから本来 TT? には型の派生関係はないはずなんよね。
Avatar
omochimetaru 4/16/2020 5:32 AM
いや、tagged union だろうが、tagged された some だけに対してisomophicだから
Avatar
Optional にだけ特別にサブタイピングを認めてる。
Avatar
無いのが正解だと思っていて、あった場合は型システムに一定の複雑さを抱えることになる
Avatar
omochimetaru 4/16/2020 5:33 AM
特別扱いなのはそうですねえ。
Avatar
struct Foo<T> { case bar(T) case baz(T) }
5:34 AM
↑の場合に、 T is Foo<T> は成り立たない。
Avatar
T と T? にサブタイプ関係を認めるのと、T? と U? (TとUはサブタイプ関係) にサブタイプ関係を認めるが同居すると、しんどくなるやつですね
Avatar
omochimetaru 4/16/2020 5:34 AM
いや、成り立つのでは?
5:34 AM
別に決めの問題で、射像があればいいのだから
5:34 AM
T から Foo<T> のアップキャストは .bar(t) って例えば決めておけば
5:34 AM
型安全性自体は壊れないと思う
5:35 AM
タイプチェックが通るのにランタイムクラッシュするような穴があかない、という意味。 (edited)
Avatar
たぶんインチキの定義が違ってて、別の複雑さを持ち込まないと実現できないって意味。 (edited)
Avatar
omochimetaru 4/16/2020 5:36 AM
サブタイピングもう一個あって
5:36 AM
() -> () is () -> throws () があります。
Avatar
throws は認めざるを得ないなぁ。
Avatar
omochimetaru 4/16/2020 5:37 AM
概念的に整理するとこれは、 T is Result<T, Swift.Error> が、 Func<A, R>R でだけ発生する
5:37 AM
という理屈になってる。
5:37 AM
Rustだと多分これも無いですよね。
5:38 AM
「別の複雑さを持ち込まないと実現できない」なるほど。
5:38 AM
その結果サブタイピングの組み合わせの問題が出てきて曖昧なケースが出るのはそうですねえ。
Avatar
throwsはthrowsとして表現されてる限りはネストしないから
5:39 AM
正確にはuntagged unionの括りになるんじゃないかな
Avatar
なるほど。
Avatar
untagged unionならサブタイプ関係は成り立つでOKだと思うよ
Avatar
でも
Avatar
omochimetaru 4/16/2020 5:40 AM
ネストしないから、は微妙な気が。
5:40 AM
() throws -> Error
Avatar
throws E-> E が区別されてるから
5:40 AM
tagged 的な側面もある。
Avatar
omochimetaru 4/16/2020 5:40 AM
↑これが 例外を返すのかエラーなのか区別できるってことはtagged的
5:40 AM
被った。
Avatar
確かに
Avatar
throws は tagged と untagged のあいのこなのか。
Avatar
omochimetaru 4/16/2020 5:41 AM
仕組み的にはtagged的だけど、使えるポジションが関数型の返り値部分で1回だけって文法で制限してるから
5:41 AM
untagged的な特徴も持っている
Avatar
おもしろいな。
Avatar
Optionalのサブタイプが辛いのは、ネストする性質によるところがかなり強いので
5:42 AM
ネストが発生すると、map { $0 as T } / some(T) の優先順位を定義しなければいけなくなる (edited)
5:43 AM
この問題はResultがサブタイプ関係を認めたと仮定すると発生するし、現行のthrowsでは発生しない
Avatar
@swift-5.2.5 import Foundation struct Test: Codable { let a = 5 } struct Test2: Codable { var a = 5 } let json = """ { "a": 10 } """.data(using: .utf8)! let test = try JSONDecoder().decode(Test.self, from: json) let test2 = try JSONDecoder().decode(Test2.self, from: json) print(test.a) print(test2.a)
Avatar
5 10
Avatar
Codableに準拠したstructの変数をデフォルト値つきのletでかくと、decodeしても値はデフォルト値なのねという話がTwitterにあった https://twitter.com/khanlou/status/1252174018204950530?s=20 (edited)
@nicklockwood @bjhomer I expected you to be right but I have to got to say I am surprised by these results
Avatar
omochimetaru 4/20/2020 2:30 PM
あぁ〜
2:31 PM
@swift-5.2.5 struct S { let a: Int = 1 } S(a: 2)
Avatar
exit status: 1 with stderr:<stdin>:2:6: error: argument passed to call that takes no arguments S(a: 2) ^
Avatar
omochimetaru 4/20/2020 2:31 PM
↑そもそもこれができないから、まあ良さそう(できる気がしてた)
Avatar
Swiftの挙動としてはいいんだけど、もし他人が実装してたら気付く機構がないので、気をつけねばと思った
Avatar
omochimetaru 4/20/2020 2:35 PM
コンパイラが警告だすと良いのかな?
2:36 PM
でもわかってやってるときの抑制記法が必要になっちゃうな
Avatar
SwiftLintで検査するのが現状コスパいいんかね
Avatar
let プロパティに初期値設定したらイニシャライザでも書き換えられないから JSON の値が反映されないのは仕方ないとして、 @swift-5.2.5 struct Foo { let a = 5 init(a: Int) { self.a = a } }
Avatar
exit status: 1 with stderr:<stdin>:4:16: error: immutable value 'self.a' may only be initialized once self.a = a ^ <stdin>:2:9: note: initial value already provided in 'let' declaration let a = 5 ^ <stdin>:2:5: note: change 'let' to 'var' to make it mutable let a = 5 ^~~ var
Avatar
omochimetaru 4/20/2020 3:34 PM
それもだめなんだ タイミング的にはinitの呼び出しよりも早いのかな?
Avatar
Kishikawa Katsumi 4/20/2020 3:34 PM
^ これは私よく怒られるやつ。
Avatar
↓はめっちゃ微妙な気がする。 @swift-5.2.5 import Foundation struct Foo: Codable { let a = 5 } print(String(data: try! JSONEncoder().encode(Foo()), encoding: .utf8)!)
Avatar
{"a":5}
Avatar
omochimetaru 4/20/2020 3:35 PM
@swift-5.2.5 struct A { init() { print("A.init") } } struct S { let a: A = A() init() { print("S.init") } } S()
Avatar
A.init S.initstderr:<stdin>:12:1: warning: result of 'S' initializer is unused S() ^~~
Avatar
読み込みでは反映されないけど書き出される。
Avatar
omochimetaru 4/20/2020 3:35 PM
init()の本文より先に初期値はセットされているのか。
Avatar
Kishikawa Katsumi 4/20/2020 3:36 PM
読み込みでは反映されないけど書き出される。
^これは違和感はないですね。
Avatar
まあ JSON に不変の表現力がないから仕方ないのか・・・。
3:37 PM
動的型付けで変更しちゃいけない値と同じと考えたらいいんですかね。
Avatar
Kishikawa Katsumi 4/20/2020 3:40 PM
readonlyってやつですかねえ
Avatar
omochimetaru 4/20/2020 3:41 PM
一応decodeだけはやって、値が違ったらエラーのほうがマシか?
Avatar
でもやっぱり↓は微妙じゃないですか? @swift-5.2.5 import Foundation struct Foo: Codable { let a = 5 } let json = """ {"a":2} """ let foo = try! JSONDecoder().decode(Foo.self, from: json.data(using: .utf8)!) print(String(data: try! JSONEncoder().encode(foo), encoding: .utf8)!) (edited)
Avatar
{"a":5} (edited)
Avatar
デコード→エンコードしただけで違う JSON になる。
Avatar
omochimetaru 4/20/2020 3:42 PM
それはでも、読み込めないキーがあったときは、そうなので
Avatar
それはキーが消えるからいいけど、
Avatar
Kishikawa Katsumi 4/20/2020 3:43 PM
それは外部に出してる時点で違和感ないんですよね。戻らなくてもしょうがない。
3:44 PM
^ あくまで私の感覚の話ですが。
Avatar
うーん、書き換わっちゃうところには違和感はありますね。だからといってどうしようもないとは思うんですけど。
Avatar
omochimetaru 4/20/2020 3:45 PM
Currently, adding a default value to a decodable struct will always override the value, even if it appears in the original JSON. import Foundation struct User: Decodable { let id: Int let name: String = "" } let decoder = JSONDecoder() let user = try! decoder.decode(Use...
Avatar
let だから Codable の対象外とかもできないし。
Avatar
omochimetaru 4/20/2020 3:45 PM
2018年5月のスレッドがあった
Avatar
何でも議論されてるな。
Avatar
omochimetaru 4/20/2020 3:46 PM
話題には見覚えあった。
3:46 PM
そうか、memberwise initializationのトピックに話が伝搬してそこで止まってそうだ。
3:47 PM
デフォルトパラメータにletを含めるかどうかを変更しちゃうとinitのシグネチャが変わってABI互換性が保てないけど・・・
3:48 PM
letのプロパティも含んだinitと、letのプロパティは含まないinitの両方を自動生成すれば
3:48 PM
下位互換も保てるし、デフォルトパラメータの数が異なるから一応オーバーロードの曖昧性も無いかな・・・
3:49 PM
あ、でも、Decodableの振る舞い自体の下位互換性がなくなるな。 (edited)
Avatar
最近Swiftを書いてなさすぎてアレだったんで、ちょうど作りたいiOSアプリができたので作ってたんですが、またそれを微妙にほっぽりだして謎なことをやっていたら意外になんかこれ使えるんじゃないか(本当か?)ってものができたので、ちょっとここに宣伝させてください 🙏 https://qiita.com/yyu/items/22fd6e52267daac49f8e (edited)
はじめに Swift 5からはResultという他のプログラム言語では主にEitherとしても知られている型が入った。しかしiOSプログラミングをはじめてみると複数のエラーを同時に集めてきてUIに表示するという必要を感じるように...
👍 2
Avatar
「関数に渡されたクロージャが必ず呼ばれることをコンパイル時に保証できるようにする」っていうやつのプロポーザルを考えてるのですが、同じようなproposalって既に出てますっけ ↓ の場合だと、mustCalledがついたクロージャは必ず呼ばれなければならない func function(@autoclosure @mustCalled completion: () -> Void) { completion() } もし、関数内で別の関数のクロージャ中で呼ばれないといけないときは、その別の関数のクロージャがmustCalledならコンパイル通る func function1(@autoclosure @mustCalled completion: () -> Void) { function2 { completion() } } func function2(@autoclosure @mustCalled completion: () -> Void) { completion() } 的な(日本語怪しくてすいません)
8:33 AM
非同期が絡むやつのcompletionとかの呼び忘れ防止になりそうかなあっておもいまして (edited)
Avatar
Swift4 で引数で渡したコールバックが必ず実行されることを保証するアノテーションの提案. 前々から欲しかった機能だけど Swift4 stage2 以降までおあずけ / https://t.co/Xp8VqEZ36Y
8:40 AM
これどうなったんだろう
Avatar
あ、そんなのです!
8:42 AM
すでにあるかなあとは思ってたけど本当にあった
Avatar
https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160815/026288.html この辺追いかけると何か結論見つかるかもですね
Avatar
ありがとうございます!
Avatar
その前にもこんなのがあったっぽいですね https://github.com/apple/swift-evolution/blob/master/proposals/0073-noescape-once.md
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
みんなでSwiftにサインアップしたら優先度があがるとかあるかな https://github.com/features/codespaces
Your instant dev environment
😋 3
Avatar
https://gist.github.com/freddi-kit/3d055f95b3ef0c51b741b01b3dc00ae2 コンパイルにすごく時間がかかるコード見つけたんですがこれ原因なんですかね
GitHub Gist: instantly share code, notes, and snippets.
Avatar
Kishikawa Katsumi 5/9/2020 5:41 AM
おもしろ
5:42 AM
コンパイラの弱点を突いてるみたい
😆 1
Avatar
まるで @omochimetaru さんみたい
Avatar
あ、このコードだとまだ終わる ↓ これがやばい (edited)
5:43 AM
Avatar
ゴミを出そうw
Avatar
昔のバイト先で書いた張り紙ですw
Avatar
tupleまわりかな...
Avatar
ですかね、 これのせいで書いたコードが間違ってたことさえも気づかなかったです
5:45 AM
Avatar
めっちゃ遅いw
5:45 AM
ugh swiftcはsipってるとlldbできないのか
5:47 AM
あ、最近のバイナリならエラーになる
5:48 AM
2020/4/1 の nightly ではおこらないですね(たまたまもってたnightlyがこの日付だった)
Avatar
おー
Avatar
xcodeについてるやつの問題かなぁ
5:49 AM
そもそもswiftcがsourcekitserviceを使うんだろうか...?
Avatar
あ、それは ↑ でのせたcommitをコンパイラしたときです
5:50 AM
gistの方はまだ親切な(?)時間で終わりますが、commitのやつは死にます(説明不足でした) (edited)
Avatar
なるほど
5:52 AM
nightlyで試すとどうでしょうか?
Avatar
commitのリンクも間違えてたのでEdit nightly でためしてみまっす!
Avatar
May-05 nightlyだと治っててさらにエラーがユーザーフレンドリーになってました (edited)
8:22 AM
安心
8:25 AM
これが今現在のやつで $ swiftc bug.swift bug.swift:7:1: error: the compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8:25 AM
これがnightly $ swiftc bug.swift bug.swift:7:14: error: value of type 'Int' has no member '0' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~ ^ bug.swift:7:26: error: value of type '[Int]' has no member '0' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~~ ^ bug.swift:7:39: error: value of type 'Int' has no member '1' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~ ^ bug.swift:7:51: error: value of type '[Int]' has no member '1' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~~ ^ bug.swift:7:64: error: value of type 'Int' has no member '2' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~ ^ bug.swift:7:76: error: value of type '[Int]' has no member '2' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~~ ^ bug.swift:7:89: error: value of type 'Int' has no member '3' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~ ^ bug.swift:7:101: error: value of type '[Int]' has no member '3' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~~ ^
8:26 AM
よく読むと、前のやつはユーザーフレンドリーじゃないんじゃなくて「the compiler is unable to type-check this expression in reasonable time」だった。草 (edited)
Avatar
おお、とてもフレンドリー。
Avatar
ウハウハな気持ちでcommitのやつnightlyでビルドしようとしたら別のところでcrashするので、今後に期待 (edited)
8:28 AM
swiftc死にがち
😆 1
Avatar
なにがともあれ未来に希望が持てました(多分)
💯 1
Avatar
Kishikawa Katsumi 5/9/2020 9:41 AM
軽い気持ちでコンパイルして終わらんなあと思ってXcode終了したけどswiftcはずっといてメモリを食い尽くしてさっきMacを再起動することになりました。
Avatar
あ、一番やばい状況まで行った感じですね 失礼しました、「※ 注意: ビルドは自己責任で」と↑コメントに追加しておきます!mm (edited)
Avatar
まさかさっき見かけたこのツイートw https://twitter.com/___freddi___/status/1259099476905451527
知見: macはメモリ使用量がすごくなると最終的にTrackpadが暴走する
😆 1
Avatar
それですwwww
Avatar
自分ならここまで複雑なTupleなら先にtypealias作るかな 😅 typealias TestCase = (input: (Bit, Bit, Bit, Bit, Bit, Bit), expected: Bit) let testBitResultBit: [TestCase] = //...
💯 1
Avatar
ほぼの脳死でやってたのでおもいつかなかった、CPUの実装が終わったらリファクタしますw
Avatar
omochimetaru 5/9/2020 10:55 PM
最近コンパイラが暴走してトラックパッド効かなくなるので困るわかる
😆 1
10:55 PM
新しく入ったGit連携機能がヤバくて
10:55 PM
gitプロセスがめちゃくちゃ大量に立ち上がってOSが死ぬ
Avatar
fork爆弾かな
Avatar
omochimetaru 5/10/2020 7:30 AM
無限に増えて続けてるのか固定数なのかはよくわかってない(アクティビティモニタがガタガタになって調べられなくなる)けど、ファイルIOが多すぎるのかなんなのか、OSがもっていかれる。 (edited)
10:18 AM
ただ、この自作CPUが遅いのがビット演算をすべてenumにしてからなのかそうでないのかが知りたい。(36ページ目) (edited)
Avatar
Kishikawa Katsumi 5/11/2020 10:22 AM
めっちゃすごいですね
❤️ 1
10:23 AM
勉強になります
10:24 AM
Boolもごく初期はEnumだったのを思い出した
10:24 AM
確かそんな時期ありましたよね
11:09 AM
多分2014年に公開されたときにはすでに enum じゃなかったんですよね。
Avatar
Kishikawa Katsumi 5/11/2020 11:13 AM
そんなに昔でしたか
Avatar
↑でおもちの言ってる、昔は enumcase が camelCase じゃなく CamelCase だったってのが意外と理由かもしれませんね💧
Avatar
https://github.com/apple/swift/pull/31847 ドキュメントの修正を投げてみたんですが、PRはこんなんでいいんだろうか
What is it? Fixing unconditional_checked_cast_addr description in SIL.rst Why Looks the description of unconditional_checked_cast_addr is a little wrong. There is a $1 in the description of example...
4:32 AM
ドキュメントの修正だけでテストも走しらせてしまったし。。。 (edited)
Avatar
omochimetaru 5/17/2020 4:33 AM
説明文に$1って書いてるけど%1じゃないの?
Avatar
あ、
4:34 AM
修正しました 🙇 (edited)
Avatar
omochimetaru 5/17/2020 4:39 AM
コミットメッセージは、その変更を表す動詞にするのが慣習だから
4:40 AM
fixed descriptionじゃなくて、fix description of ... って文が良いと思う
Avatar
なるほどー
Avatar
omochimetaru 5/17/2020 4:40 AM
内容自体はこれであってるのかはわからん SIL文法わすれた
Avatar
unconditional_checked_cast_addrのBNFが、 sil-instruction ::= 'unconditional_checked_cast_addr' sil-type 'in' sil-operand 'to' sil-type 'in' sil-operand ってなってるんですが、Exampleだと unconditional_checked_cast_addr $A in %0 : $@thick A to $B in $@thick B ってなってて、二番目のsil-operandがsil-typeだけになってて、 sil-operand ::= sil-value ':' sil-type のようにsil-valueがたりないですね
4:43 AM
これもPRにかくべきか
4:44 AM
commitメッセージ書き直してPR出し直すべきかな
Avatar
omochimetaru 5/17/2020 4:45 AM
ああ、そういう形の式なのか
Avatar
ですです
Avatar
omochimetaru 5/19/2020 6:10 AM
iOS / Server / Android 案件で、iOSとServerだけSwiftでコード共有してるんだけど、Android向けも共有したくなってくる
Avatar
Kishikawa Katsumi 5/19/2020 6:13 AM
前にhttps://www.scade.io/ っていうのを見ましたね。詳しくは知らないですけど。。。
Next generation native cross platform development with Swift
Avatar
omochimetaru 5/19/2020 6:14 AM
お〜
6:14 AM
フラッターみたいな感じで、専用のフレームワーク上で全部組むタイプかな
6:15 AM
Swift上でJavaをinteropするのはGCの壁があるから無理があるけど、
6:16 AM
Java上でSwiftをinteropする分には、弱/強参照を丸ごとGCに載せられるから
6:16 AM
deinit は効かなくなるけど、やれんかなぁ
Avatar
Kishikawa Katsumi 5/19/2020 6:21 AM
https://qiita.com/H_Crane/items/ea445c65a903c42ce86e DroidKaigi 2020が開催されていたらそれについてのセッションもあったみたい。 ベータの期間を合わせると3年以上は続いてるプロダクトみたいですね。 UIツールキットから作ってるように見えます。たぶん。
前置き この記事自体は2019年10月に書き終わっていたのですが、、、 DroidKaigi2020に応募したCFP 「Scadeを使って「Swift」で始めるAndroidアプリ開発」 が通ったため、だいぶ温めてからの公開...
Avatar
omochimetaru 5/19/2020 6:22 AM
お〜。
6:22 AM
フラッターやるんだったらDartよりSwiftがいいからスケードやりたいな。 (edited)
6:22 AM
でもOSのAPIはそのまま使いたい。ザマリンみたいな。 (edited)
Avatar
Android NDKでSwift動かせるなら、UIをHTML/CSSにすることでそこだけそれぞれのプラットフォームでWebViewに投げる形でSwiftでアプリ作れないかなって空想したことある。
6:29 AM
検索したら↓出てきたけど NDK で動くのは動く? https://github.com/apple/swift/blob/master/docs/Android.md
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 5/19/2020 6:29 AM
動きますね。
6:30 AM
WebViewは変な問題がいろいろ生じがちだからなあ
Avatar
じゃあかていくんのJavaScriptKit的なの挟んでSwiftで書けたりしないかなぁ。
Avatar
omochimetaru 5/19/2020 6:30 AM
構成的にはReactNativeのUI層だけHTMLにしてエンジン言語だけSwiftにしたような構成に近いですね (edited)
6:31 AM
JavaScriptKit的なの挟んでSwiftで
それはかなりReactNativeに近くなりますね あれはJSを動かしてるけどWASMを動かすことになるから
Avatar
いや、API的な話で
6:32 AM
JavaScriptKit的なもののレイヤーでプラットフォームの差を吸収する。 (edited)
Avatar
omochimetaru 5/19/2020 6:32 AM
ただ家庭君のJavaScKitもGC境界問題があるんですよね。
Avatar
AndroidだとそこでNDKでWebViewと仲介させるとか。
6:33 AM
もしくは、UIはネイティブにしてAndoridのViewシステムをラップした層を作るかだけど、辛そう・・・。
Avatar
omochimetaru 5/19/2020 6:33 AM
UIはネイティブにしてAndoridのViewシステムをラップした層を
これがReactNativeですね
6:34 AM
UIコードまでクロスにしなくていいんですよね、個人的には
6:34 AM
UIは無難にOSの標準のやつでいい
Avatar
うーん、個人のリソースでラッパー層作るのは無理と思ったけど、機械的に生成ならワンチャンあるかな?
6:36 AM
まあでも用途絞ってHTML/CSSの方が実現度高そう・・・。
Avatar
omochimetaru 5/19/2020 6:37 AM
HTMLならレンダラとインタラクションは既にクロスなものが搭載されてるというのはありますね
6:38 AM
ただフラッター以前のXPlat系は、それでみんな死んできた歴史があるから・・・(PhoneGap、あとなんかと、なんか)
6:38 AM
なんかハマるんだろうなあ
Avatar
FlutterみたいにUIも独自でクロスって方向は現実的かもしれないね。UIKit完全互換とか目指すより。
Avatar
omochimetaru 5/19/2020 6:43 AM
っぽいですね。使ってる人の様子見てると、Flutterはうまくいってそう。
👀 1
Avatar
Flutterみたいないい感じのUIフレームワークでiOS/Android両対応して、かつ影響力があって信頼できるプレーヤーがそれを開発・メンテしてくれれば、Swiftでクロスプラットフォームアプリ開発の道が開ける?遠いなぁ・・・。
Avatar
omochimetaru 5/19/2020 6:45 AM
Avatar
Appleはやらないだろうしなぁ。
Avatar
omochimetaru 5/19/2020 6:46 AM
WWDC2020でSwiftUI for android出てくれ〜
Avatar
企業がやらなくても、オープンソースコミュニティ作でもRxSwiftくらい盛り上がれば使われるかな・・・。 (edited)
6:47 AM
GoogleがSwiftUI for Androidの方がまだ可能性あるんじゃ?
Avatar
omochimetaru 5/19/2020 6:47 AM
なるほどw じゃあGoogleIOで出てくれかw
Avatar
うんw
6:47 AM
もういっそ Swift for Android でいいよw
Avatar
omochimetaru 5/19/2020 6:48 AM
AndroidのDalvik実行モデル全部捨てていきなりネイティブアプリ起動するようになってほしい
6:49 AM
でもその可能性ゼロってわけじゃないと思うんだよなぁ。
Avatar
omochimetaru 5/19/2020 6:50 AM
Fuchsiaはどうなったのかな
6:50 AM
Dart, Go, Rustなどがある (edited)
Avatar
2019年6月28日 (現地時間) - GoogleはFuchsia開発者向け公式Webサイト https://fuchsia.dev/ を公開したと報道された。
https://ja.wikipedia.org/wiki/Fuchsia_(%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)
6:52 AM
Swift for TensorFlow もいいけど、ここにも Swift のチーム突っ込んでー < Dart, Go, Rustなどがある (edited)
Avatar
Adds initial support for Fuchsia OS to the compiler and adds support for building for Fuchsia in the stdlib. This change also introduces lld linker support to the build system and fixes a number of...
Avatar
omochimetaru 5/19/2020 7:55 AM
単に放置しすぎてcloseしたやつか
7:55 AM
誰かやれば進みそう。
Avatar
その前にビルドシステム大工事が終わらないと…
Avatar
omochimetaru 5/19/2020 8:09 AM
それは誰かがやれないやつ
Avatar
this summerに完了予定って言ってたし大丈夫
Avatar
omochimetaru 5/19/2020 8:11 AM
おお。
Avatar
嘘だった、this summerにやるよ、としか言ってなかった https://forums.swift.org/t/separate-cmake-process-into-compiler-and-stdlib/35392/3?u=kateinoigakukun
At a high level, I think that having someone else do this would actually be a net reduction in engineering time to the team since it is an involved change that would require me to hand hold/there is additional work that would need to be done to make sure it doesn't break inter...
Avatar
hopefully get a chance to do this sometime over the summer.
できたらこの夏のどこかでやりたい(やれたらいいな)くらいのニュアンスなのかな?
Avatar
omochimetaru 5/19/2020 8:16 AM
😐
Avatar
頼む〜〜
Avatar
泳げる頃には出来る奴(それはダメ (edited)
Avatar
omochimetaru 5/19/2020 2:18 PM
ビルドシステムが他の人に触れないのは、cmakeがワケワカメってのもあるんですけど、 appleが内部でもってる計画があって全容が見えないので設計改修が通せないという理由が大きいです。 arm mac向けのビルドするためのパッチが内部にある説がある。
Avatar
cmakeワカメ
Avatar
https://github.com/apple/swift-evolution/blob/master/proposals/0283-tuples-are-equatable-comparable-hashable.md Accept されたけど、Comparableはいらなくない?とおもってしまった
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
2:58 AM
EquatableとHashableは便利だけど (edited)
2:59 AM
Comparable への違和感がどうも抜けない
Avatar
(1, 2)(2, 1) どう比較するんだ? 🤔
Avatar
omochimetaru 5/21/2020 3:06 AM
Comparableは辞書式比較じゃないんかな?見てないが
Avatar
(1, 2) < (2, 1) ?
3:06 AM
(1) < (1, 2) ?
Avatar
omochimetaru 5/21/2020 3:06 AM
あ、
3:07 AM
数が違うと型が違うから比較できないのかな。
Avatar
naruhodo
Avatar
omochimetaru 5/21/2020 3:07 AM
Look at the first element, if they are equal move to the second element. Repeat until we find elements that are not equal and compare them.
Avatar
辞書順は汎用的でいいとしても、例が座標なのはいまいちな気が。
Avatar
ですね、座標の場合完璧に破綻します
Avatar
omochimetaru 5/21/2020 3:08 AM
単に同じ集合があったときに、同じ順序付けが保証されてればいいから、なんでもいいと思う。
3:09 AM
配列をシャッフルしてからソートしたときに、何度やっても同じ結果になってほしいだけ。
Avatar
辞書順は汎用的でいいとしても、例が座標なのはいまいちな気が。
それだ
Avatar
omochimetaru 5/21/2020 3:09 AM
ちょうどこれ話してる頃忙しくてディスカッション見れてない・・・
Avatar
つい最近、例のリバーシで、盤面のbefore/afterからディスクをひっくり返す順番のアニメーションを生成するところで、方向スコアと距離スコアを作って、 (directionScore, distanceScore) でソートするってのをやった。 sort のクロージャを書かないといけなかったけど、これが使えたら書かなくて良さそう。
👍 1
Avatar
omochimetaru 5/21/2020 3:10 AM
あ〜
3:10 AM
ソート処理を書くときに優先度付けした多段キーを作るところをタプルに投げられるか。
Avatar
そういうusecaseはあるのですね、なるほど
Avatar
うん。
Avatar
omochimetaru 5/21/2020 3:10 AM
それは便利ですね。
3:11 AM
型が混ざっててもいいのが活きるな。
3:11 AM
配列でやろうとすると詰む時があるので。
Avatar
座標のexample でしか見てなかったので思いつかなかった
Avatar
Kishikawa Katsumi 5/21/2020 8:29 AM
パスの通ってるライブラリは自動的に補完候補に出てきて、入力するとimportも一緒に補完される、っていうの結構一般的だと思うけどXcodeは先にimportを書かないとUIViewすら補完に出てこないのは、それはそれでいいんだけど特に慣れてない人には難しいだろうなという気はする。
Avatar
omochimetaru 5/21/2020 8:30 AM
言われてみれば確かに。
Avatar
パスの通ってるライブラリは自動的に補完候補に出てきて、入力するとimportも一緒に補完される、っていうの結構一般的
はえ、そうなんですね
9:23 AM
import 書いたらみたいに、#include かいたらでてくるイメージだった
Avatar
omochimetaru 5/21/2020 9:23 AM
Javaだとそもそも
9:23 AM
使うクラス一個ずつimport文書くから
9:24 AM
1ファイルにimportが30行とかあるのが普通で
9:24 AM
やってらんないからそういうふうになってそう
Avatar
おー、たしかにそういわれると Android Studio 使ってらそういう挙動してたの思い出しました
9:25 AM
クラス書いたら import 文出るやん!みたいな
9:25 AM
(1年以上前なので忘れてしまっていた
Avatar
さっき gitでswiftのmasterをpullして utils/update-checkout --clone したら 新しく https://github.com/apple/swift-driver がcloneされ始めたように見えたんですが前からなんですかね
Swift compiler driver reimplementation in Swift. Contribute to apple/swift-driver development by creating an account on GitHub.
1:48 PM
(my 最終pull 1月くらいだった...) (edited)
3:36 PM
15日前から? (edited)
Avatar
おお
9:19 AM
PR見てもなんで追加したのかわかんなかった
Avatar
少し前に #swiftpm で話してましたが、SwiftPMでswift-driverを使うためですね。 https://github.com/apple/swift-package-manager/pull/2736--use-integrated-swift-driverオプションが追加されています。
Add bootstrap and build support for building the new Swift driver and importing it (as a library) into SwiftPM. Then introduce the new SwiftPM flag --use-integrated-swift-driver to enable use of th...
Avatar
お、そうなんですね
Avatar
memberwise initializerの自動実装があって別ファイルでアクセスレベルだけ変更したinitializerが定義できないのが不便
Avatar
Kishikawa Katsumi 5/30/2020 8:52 AM
"".data(using: .utf8) . <= ここで補完にでてくるのは`write(to:)`を選ぶと
8:53 AM
"".data(using: .utf8) ?.write(to: savePath) ^ オプショナルの?をつけてくれるんだけどそうするとここで改行ができなくなるからコンパイルエラーになるな (edited)
Avatar
omochimetaru 5/30/2020 9:44 AM
その形ってハテナだけ上の行のお尻につけて、ドットだけ次の行に書けませんでしたっけ
Avatar
swiftはできるはずですね。kotlinはできない。
Avatar
omochimetaru 5/30/2020 9:47 AM
あれシンタックスがどうなってるのかよくわからない
9:48 AM
?.で一つのトークンだと思ってたら分割できるから。
Avatar
?が次の行にあるとコンパイルエラーか。
Avatar
Kishikawa Katsumi 5/30/2020 9:53 AM
try expected .data(using: .utf8)? .write(to: loadPath)
9:53 AM
^ これは正しい
Avatar
omochimetaru 5/30/2020 9:53 AM
そう、それなんなんでしょうね。
Avatar
Kishikawa Katsumi 5/30/2020 9:54 AM
エラーメッセージによると改行したのは三項演算子と解釈されてるっぽい (edited)
Avatar
omochimetaru 5/30/2020 9:54 AM
ハテナが次の行にあっても良いように言語仕様を変更するのが良いのかなあ? (edited)
9:55 AM
それとも補完でハテナを上の行末にスパッと入れるのかw
Avatar
Kishikawa Katsumi 5/30/2020 9:57 AM
最終的に残す結果としてはドットが揃ってる方が良さそうだから「?」は前の行で良さそう
Avatar
omochimetaru 5/30/2020 9:57 AM
左右で離れてると読みづらいと思うんです
Avatar
Kishikawa Katsumi 5/30/2020 9:57 AM
カッコいいのはドットの前に?が補完されて、保存したタイミングでキュッと前の行にフォーマットされる、ってやつだな。
9:58 AM
?.write( ... の方がベター?
Avatar
Swiftにデフォで sorted ((Result, Result) -> Bool, (Element) -> Result) ほしい(他の言語にはあった気がする、忘れた) こんなかんじで、比較対象を重複して書かなくていい // 面積でソート [CGRect()].sorted(<, { $0.width * $0.height }) (edited)
10:18 AM
てか、なんかこれに似たようなやつってすでに有りませんでしたっけ (edited)
Avatar
omochimetaru 6/9/2020 10:21 AM
comparableならクロージャ無しでsortできるけど
10:22 AM
その形だと元の型を最後に取り出したいから、それは使えない
10:25 AM
Hey everyone, I'd like to continue a discussion about sorting ergonomics that I pitched in July. (This is a refined iteration of that pitch, based on great feedback from the original thread). Today, to sort a Collection of non- Comparable elements, we write a closure that re...
❤️ 1
10:25 AM
フォーラムに提案はあるね
10:26 AM
NSArrayのNSSortDescriptorを使うやつが既存の似たやつかも
Avatar
(フォーラム検索力強い・・・)
Avatar
omochimetaru 6/9/2020 10:26 AM
フォーラムでスレッドを見た記憶があった。
Avatar
(なるほど) NSSortDescriptorの存在しらんかったので見てみます
10:29 AM
extension Collection { func sorted<Result: Comparable>(_ comparing: (Result, Result) -> Bool, _ data: (Element) -> Result) -> [Element] { sorted { comparing(data($0), data($1)) } } } // 面積 [CGRect()].sorted(<, { $0.width * $0.height }) とりあえず考えてみたものの単純な例を実装してみた(Comparableだけど) (edited)
Avatar
try-swiftで知り合った @tarunon さんから面白い話を伺いました。 以下、Xcode 7.2.1 (7C1002)の環境での話です。 結論 どうしたらいいかわかりません。。 本題 下記のように、 エクステン...
11:40 PM
これ毎回どうだっけってなる
Avatar
古い記事だ
Avatar
「どうしたらいいかわかりません。。」 (edited)
11:40 PM
WWDCでもなんかこれについて喋ってる回があったんですよね
11:40 PM
一昨年かな (edited)
Avatar
今はわかってるけど記事を更新してないんですよね
11:42 PM
フォーラムでも挙動変えたいって意見は今もあるけど
11:42 PM
だいたいコアチームがモジュール跨いでると無理だし〜とか言って話終わる
11:43 PM
finalじゃないclassは禁止
Avatar
まあprotocol requirementsがあるかどうかがディスパッチを変えるって事と
11:46 PM
protocol methodとclass methodは別テーブルって事を
11:46 PM
知らなきゃSwiftは書けないって事で
11:47 PM
良いのでは〜
11:47 PM
内部の実装しらないとダメってのはしんどい
11:47 PM
わかるけど。
Avatar
結局だいたいのものは中身を知らないと罠を踏むしカプセル化とか幻想なんじゃないかと最近思う
11:48 PM
それは正しい
Avatar
w
11:51 PM
このトピックに関して改善点としてありえると思うのは
11:51 PM
protocol existentialの表記方法をP から any P に変更するという仕様変更です
11:52 PM
cat as Hogeable がアップキャストっぽく見えるけど、 実際には Hogeable の existential への格納と言ったほうが近いので
11:52 PM
cat as any Hogeable って書いてあったらもうちょっととっかかりやすいんじゃないかなあ。
11:53 PM
any Hogeable 型のコンテナにオブジェクトを格納するときにメソッドを埋めないといけなくてそれをどこから持ってくるかという話なので。
11:54 PM
Java的な発想でオブジェクトという根源的な対象が存在してそこにメソッドが生えているっていうデータモデルで考えてるとハマります
Avatar
たしかに
Avatar
「メソッドを埋めるためにどこかから持ってくる」というのがSwiftのプロトコル周りの挙動のポイントの一つで
12:01 AM
Scalaでいうと Addable の List に対して sum メソッドを定義するみたいな事をやるときに、implicit parameterで その要素の型の型クラスを持ってきますけど
12:02 AM
Swiftのprotocol extensionでwhere Element: AdditiveArithmeticとか書いてる時はコンパイラが静的にそれをやってるんですよね。
12:03 AM
そこで静的に解決されて、実行時に渡されてるモノがprotocol witness tableです。Scalaだとプログラマがそれを半分手動で書いてるわけですね。 (edited)
Avatar
ふむふむ
Avatar
だからScalaの型クラスを理解した後にSwiftのprotocolはそれを簡単に書けるものであるって理解すると良さそうなんだけど、 Scalaの型クラスでは扱える高カインド型が、Swiftだと存在しないのでそれはそれで話がややこしくなってしまうんだよなあ。
Avatar
例え話はわかりやすいけれど誤解をうむこともあるので... (edited)
Avatar
初めておもちさんと知り合った記事だ 👀
Avatar
https://bugs.swift.org/plugins/servlet/mobile#issue/SR-103 かれこれ11回重複して報告されてるw
Avatar
おもちさんと知り合った記事...!
Avatar
なつかしい。おもちがtarunonさんと知り合ってずいぶん楽しそうにしてたのを思い出します。
Avatar
🐱 (edited)
4:16 PM
🐱 (edited)
4:19 PM
WWDCのチャンネルあった。そっちだった。
Avatar
NDA用のチャンネルもあります
Avatar
まだNDAに触れるようなことは公開されてない
4:21 PM
フォーラムが来週からだって。
Avatar
何が出てくるかな
Avatar
ARMかなあ
Avatar
norio_nomura 6/12/2020 3:36 AM
ARMなMacが来るとしたら、iOS, iPadOS, tvOSアプリがどの程度動くのだろうか。 (edited)
3:37 AM
App Storeのバイナリがそのまま動くのかどうか。
Avatar
Simulator で App Store からアプリ入れられるとうれしいですね。
Avatar
SimulatorがリアルにSimulatorに
😆 2
Avatar
皆様、お初にお目にかかります。 Swift3.1がリリースされる約半年前のイベントで「Swift的なイントロスペクションが登場するかもよ?」と言及してる方の記事が、Realm Academyにあったんですね。 https://academy.realm.io/posts/mobilization-roy-marmelstein-objective-c-runtime-swift-dynamic/ で。Swift5がリリースされて暫く経った今、「Mockingツールが作れそうな、Swift的な動的ディスパッチだったり、リフレクションだったり」ってのは、はて、搭載されてましたっけ? ※今、Swift化に個人的に取り組んでる「PXSourceList」には、左様な「動的ディスパッチだったり、イントロスペクションだったり」を行なってるクラスが搭載されてるので、是非、知りたいな、と思いまして。 ※該当のクラス→ https://github.com/Perspx/PXSourceList/blob/master/PXSourceList/Internal/PXSourceListDelegateDataSourceProxy.m ※記事の最後に触れていた「ObjectiveKit」ってのが、解決の糸口になるのかな???? https://github.com/marmelroy/ObjectiveKit
A new talk introducing advanced techniques with the Objective C runtime and assessing their relevance in an increasingly Swifty world.
Source List control for the Mac. Contribute to Perspx/PXSourceList development by creating an account on GitHub.
Swift-friendly API for a set of powerful Objective C runtime functions. - marmelroy/ObjectiveKit
Avatar
Kishikawa Katsumi 6/30/2020 12:26 AM
4 as Double // fine 4 as! Double // crashes https://oleb.net/2020/as/ これ面白かった。
The as and as? operators in Swift are more different than their similar names suggest.
💡 3
Avatar
foo .bar .baz って書きますけど、 ?. のときは↓ですか? foo? .bar? .baz
Avatar
omochimetaru 7/2/2020 8:04 AM
8:04 AM
ハテナを次の行に持ってくるとsyntaxの解釈が変わってだめなんすよね。
8:05 AM
8:05 AM
これもだめ
8:05 AM
だからそれしかないと思ってます
👉 1
Avatar
なるほど。
8:27 AM
?. が不可分じゃないのおもしろいね。 Swift 1 Swift 1 前の beta の頃はたしか ? は独立した後置演算子だったし。 (edited)
8:28 AM
ってか foo?() とかもあるから
8:28 AM
分けられても不思議はないのか。
8:28 AM
foo? が廃止されただけで。
Avatar
omochimetaru 7/2/2020 8:28 AM
8:29 AM
?()は改行できないですけどね。
8:29 AM
その辺の文法構造をLexer/Parserでどう扱ってるのかはよく知らない。
Avatar
@swift-5.2.5 let f: (() -> ())? = { print("hello") } f? () (edited)
Avatar
swift52 BOT 7/2/2020 8:30 AM
hello (edited)
Avatar
スペースはいけるのか。
8:32 AM
; がない言語はそのあたりの厳密なルールの理解が難しい。
Avatar
omochimetaru 7/2/2020 8:35 AM
そうですね
Avatar
danger-swiftのgit diffパッチを取得するプラグインを作ってみたw(目標はいろんなgitとかの機能をまとめるライブラリーです) https://github.com/el-hoshino/DangerSwiftHammer
"Everything can be fixed with a hammer." - Jeremy Clarkson - el-hoshino/DangerSwiftHammer
Avatar
急に思い立って書いてみました。Apple環境『以外』のSwiftほぼ全部盛り。
  • wasm: SwiftWasm, JavaScriptKit, Tokamak
  • SSS: Vapor, Leaf, Fluent
  • Swift AWS Lambda Runtime
  • Swift for TensorFlow
https://qiita.com/koher/items/c738fe09a955087b436c
(edited)
Swift は iOS アプリを作るための言語というイメージが強いと思います。しかし、実際にはサーバーサイドプログラムや機械学習、コマンドラインツールの開発など、 多様な目的で利用できる汎用言語です 。 2015 年にオープンソース化...
👀 1
💪 1
5:57 AM
今日の 15 時までで「Qiita夏祭り」なるものが行われていて、「〇〇(言語)のみを使って、今△△(アプリ)を作るとしたら」というお題があったので。 https://qiita.com/official-events/5d181aadf5db26b73d33
Avatar
ここまでSwiftだけで書けるようになるとコードの共通化が捗りそうですねー
Avatar
モバイル、Webフロントエンド、バックエンドで共通化できたら最高ですね。Androidの壁が高いけど…。
Avatar
omochimetaru 7/15/2020 8:32 AM
Androidェ・・・
Avatar
ちゃんと分かってないんですが、Androidの厳しいポイントはどこなんですか?
Avatar
omochimetaru 7/15/2020 8:37 AM
Swiftコードが使えないこと
Avatar
SwiftをAndroidで動かす上で
Avatar
omochimetaru 7/15/2020 8:38 AM
Viewとかはネイティブを使いたいからそのままSwiftを持ってきてもブリッジが大変
Avatar
JNIとかいうのを使ってどうにかならないんですか
Avatar
omochimetaru 7/15/2020 8:39 AM
例えばモデル型があったとして、プロパティが3つあったら
8:40 AM
Javaのクラスを書いた上で、 ctor, finalyze, propery(A|B|C) getter/setterで最低8つのブリッジJNI関数を書かないといけないし
8:40 AM
ctor対応のnative c++でJava側のfield IDを取ってくるみたいなJNI VM経由リフレクションも書くし
Avatar
ふむー
Avatar
omochimetaru 7/15/2020 8:41 AM
Swift型の型を受け取る/返す 関数は、その引数/返り値も全部変換をかけないといけないから
8:41 AM
手間を考えると最初からKotlinでモデル書き直したほうがマシ
Avatar
実行モデル的に厳しいみたいな話ではないんですね
Avatar
omochimetaru 7/15/2020 8:42 AM
書き直すといってもSwiftからコピペして、syntaxが似てるから、IDEのエラーを潰していく作業になる
8:43 AM
あとは、そうやってポーティングするにしても、
8:43 AM
ListとDictのコピーセマンティクスが違うから
8:43 AM
神経を使う
8:43 AM
Android側のパフォーマンスは犠牲にしてdefensive copyに寄せてる
8:44 AM
自明なケースは参照共有でいいんだけど。
Avatar
その辺のJava連携のためのグルーコードを上手いこと吐いてくれるツールが欲しいな
8:45 AM
ListとDictのコピーセマンティクスが違うから
これはどうしようもないけど
Avatar
Viewは諦めてModelだけ共通化した上でKotlinラッパー吐くか、共通の独自UIフレームワーク導入するかかなぁ?
Avatar
omochimetaru 7/15/2020 8:46 AM
GC特性については、弱いSwiftを強いKotlin(JVM)に持っていく分には問題なし。
Avatar
GC境界は小細工が必要そう…
8:48 AM
なるほどなぁ
Avatar
omochimetaru 7/15/2020 8:49 AM
JNI境界の壁は結構厚いんだよなあ体感
Avatar
JVMのコードは抽象度が高いお陰でLLVMからコード生成するにも厳しいし… (edited)
Avatar
omochimetaru 7/15/2020 8:50 AM
Swift(SIL)→Java トランスパイルについて何度か考えてるけど
8:51 AM
Stringとかがtagged pointerとかのポインタ実装依存のハックとか
8:51 AM
ビットに畳み込んだ実質enumみたいなのを使いまくってるせいで
8:51 AM
それをJava上で表現できないんだよね
8:51 AM
まずビットからポインタに戻す操作がJavaには存在しないし
8:51 AM
バイト配列みたいなものを使おうとするとbyte[]が出てきてそこでオブジェクトが1段分離されてポインタが挟まっちゃう
8:52 AM
そうすると、ストレージ領域に対するビットコピーとかの振る舞いが変わってくるから
8:52 AM
SIL上で記述されたunsafeBitCastとかが一通りぶっ壊れて無理そうなんだよね
8:52 AM
つまり、SILの記述レベルがJavaの抽象度よりもマシン寄りにローレベルすぎてトランスパイルできない。 (edited)
8:53 AM
SIL実行仮想マシンみたいなものをJava上で再実装するみたいなインタプリタモデルならできるけど
8:53 AM
まともな性能が出ないしデバッグとかできなそうだしダメ
8:54 AM
Swift→Kotlin トランスパイルを狙って、StringとかArrayとかのstdlibで実装されたhackyなやつらは専用の再実装ライブラリに差し替えるとかならいけるかもなあ。
8:54 AM
Swiftレベルの、unsafe系ではない操作だけだったら、ほぼほぼトランスパイルできると思うので。
Avatar
あとdeinitがだめですかね
Avatar
omochimetaru 7/15/2020 8:55 AM
ただそっちはそっちで、protocol witness tableを渡す部分とかを陽なコードにコンパイルしなきゃいけないので、 ロジック規模がめちゃくちゃでかそう
8:55 AM
あ〜!deinitはダメだね
8:56 AM
deterministic resource managementなコードは死ぬ
8:56 AM
SILレベルなら参照カウンタ操作が陽だからいけるけど
8:56 AM
Swiftレベルからだとダメだね。
8:57 AM
いや、結局SILレベルからでも、マップしたモジュールをjavaから触るところで retain とか呼ばなきゃいけなくなっちゃうのか・・・
9:01 AM
共有部分だけネイティブに持っていってからJNI経由でマップしたクラスを自動生成する、っていうのが現実的なんかなあ
Avatar
C++ on Androidとかはそういう使い方なのかな
Avatar
Java の Project Panama (JEP 191 - foreign function interface) 待ち続けて 5 年経ったけど、まぁ一筋縄では行かないなぁという感じなので難しい (edited)
Avatar
へー 新しいFFI仕様の提案があるのか
Avatar
Flutter方式がいいと思うんだよなぁ。SwiftUIより使い勝手の良い(特にレイアウト)イケてるUIライブラリを作って、それがクロスで動くようになればワンチャンあると思う。
12:48 PM
ただ、作り手が信頼できないと流行らないだろうから、GoogleかAppleが出すとかしないときつそう。
12:49 PM
Appleには何のメリットもなさそうだけど、GoogleはiOSエンジニアを取り込んで同時にAndroidアプリを充実させられるから、戦略的にはありだと思うんだけどなぁ。
12:50 PM
あとはUnityがSwiftに対応するとか。
12:52 PM
もしくは、Androidで動作するSwiftUIクローンがあればいいのかな。
Avatar
omochimetaru 7/16/2020 1:51 AM
Scadeがその方式だけど、作り手が第三者なのでどうなの?って感じですね。 (edited)
1:52 AM
FlutterがSwiftで書けるようになったら手っ取り早いですね。
1:53 AM
UnityはUI系は弱いですよ。
1:54 AM
AndroidでのSwiftUIは便利そうだけどUI以外のOS固有モジュールとのブリッジをどうするか問題は結局残りそう
Avatar
Unityは一般のアプリという意味じゃなくて、クロスが弱い Swift の現状打開の方向性の一つとして。
Avatar
omochimetaru 7/16/2020 1:57 AM
ああなるほど。
Avatar
AndroidでのSwiftUIは便利そうだけどUI以外のOS固有モジュールとのブリッジをどうするか問題は結局残りそう
OS固有は最悪これで実装できるという穴を空けておいて、まずは UI からちょっとずつ充実させていく感じかなぁ。 Google にやってほしい・・・。
Avatar
omochimetaru 7/16/2020 1:57 AM
Windows/Linux向けのデバッガとかが充実すればありえるかも?
Avatar
Google にとってメリットあると思うんだよなぁ。
Avatar
omochimetaru 7/16/2020 1:59 AM
UnityじゃなくてもSceneKit/GameKitとかをクロスプラットフォームにしてもらうとか。
1:59 AM
Google にやってほしい・・・。
Avatar
↑、 Google に、ってことか。
Avatar
omochimetaru 7/16/2020 1:59 AM
Swift for TensorFlow チームはあるからちょっとだけ期待できますね。ちょっとだけ。
2:00 AM
いや、Appleがやればいいと思いますけどね。
Avatar
Apple がやる分には Apple にとっていいことなくない? Apple のエコシステムに囲ってたものが Android 等にも広がるだけで。
Avatar
omochimetaru 7/16/2020 2:00 AM
Swiftが普及する。
Avatar
Swift が普及しても Apple の利益に直結しない気がする。
Avatar
omochimetaru 7/16/2020 2:01 AM
うーんでも
2:01 AM
On the road to Swift 6 で
2:01 AM
対応環境の拡充を打ち出してますよ (edited)
Avatar
それはオープンソース Swift のコミュニティとしての方針であって、 Apple のフレームワークである SceneKit をオープンにするかは Apple の判断だからまた別な気が。
2:03 AM
Core Team の大半が Apple の人で、 Apple の影響は受けているにしても、 Core Team は Swift を広めていくことに積極的なマインドだと思うんよね。
2:03 AM
でもそれは必ずしも Apple の方針とは一致しないと思っていて、 Apple にとって Swift クロス開発ができてもあまりうれしいことはなさそうだと思う。
Avatar
omochimetaru 7/16/2020 2:04 AM
そうなんですかねえ。稼働時間が取られるわけだから、ある程度Appleの意図も反映されていると思うんですけど。
2:04 AM
これまでもSwiftはなんだかんだAppleの意図にかなりコントロールされていたと思うし。
Avatar
逆に、 Microsoft が Xamarin やるのはすごい意味があって、後発でシェアも小さい中で自社プラットフォームのアプリを作ってもらうには、 iOS/Android もクロスで開発できるよというのは大きかっただろうなと。
2:06 AM
iOS が Android に対して圧倒的不利な状況になったら Apple が iOS/Android クロス開発できるツールを作るかもしれないと思ってる。
Avatar
omochimetaru 7/16/2020 2:07 AM
そのギャップはたしかにそうですね。
Avatar
ある程度Appleの意図も反映されていると思うんですけど
影響を受けてるのは間違いないと思うけど、どっちかっていうと、 Swift を作りたかった人たちが Apple をうまく利用して Swift を広めたってことだと思ってる。
2:09 AM
FlutterSwift か SwiftUIAndroid の登場が求められるな・・・。
2:13 AM
一方で、クロスでおもしろいと思ってるのは、 SwiftUI で iOS/macOS でクロスになるのが、これまで Electron とかで Windows/macOS クロスになってたのと対立して、 iOS/macOS をとるか Windows/macOS をとるかみたいな葛藤が生まれそう。
Avatar
一方日本企業は MSIE を選んだ
😂 1
Avatar
Apple に SwiftKit とか出してほしい。 iOS や macOS に同梱された実行時用 Swift コンパイラで、 Swift を(本来の意味での)スクリプティング言語として利用できるような。そうすればユーザーが Swift を書いて色々制御できるアプリ作れるのに。 Playgrounds アプリとか実質そうだし。言語仕様安定するまできついかなぁ。
Avatar
例えばユーザーがSwiftLintのカスタムルールをSwiftで書ける,みたいなことですか?
Avatar
アプリのちょっとしたカスタマイズコードを書けたり(そのアプリの機能を組み合わせて自動化するとか)、ゲームのキャラの行動をスクリプトとして書けたりというイメージです。
6:12 AM
iOSアプリだとJavaScriptCoreを使えばJSでユーザーが書いたスクリプトを実行することはできますが、Swiftでできるようにしたいなと。
6:13 AM
標準ライブラリに限ればファイルI/Oもネットワークもないし、ちょうどいいと思うんですよね。
Avatar
実装や言語機能の問題と言うよりは審査の問題な気もする
Avatar
JavaScriptCore を使ってユーザースクリプトを実行するのも、今は認められてませんっけ?主要機能を変更しなければ。
Avatar
出来るんでしたっけ?
Avatar
Pythonista というPythonを書いて実行できるiOSアプリがあり https://apps.apple.com/jp/app/pythonista-3/id1085978097 、このアプリはdlsymがPythonから呼べるのでobjc_* を呼んで好き勝手できる(し、ObjCのクラスを呼び出すライブラリもアプリに内蔵されてる)んですが、そういうのが許されているので、(個人的な解釈ですが) Apple的にはたぶんユーザーに書かせる分には良いんじゃないかと思うんですよね
‎Pythonista is a complete scripting environment for Python, running directly on your iPad or iPhone. It includes support for both Python 3.6 and 2.7, so you can use all the language improvements in Python 3, while still having 2.7 available for backwards compatibility. In tru...
6:24 AM
ただこれを使ってリリースしたアプリの機能をごっそり変えるみたいなのは当然怒られると思いますが。
Avatar
DLしてきて実行する、を加えると怒られるのかな。pythonも使えるのは良いですね
6:32 AM
コンパイルせずに実行可能なswiftがあれば、これのSwift版が出来るので、それがほしいと
Avatar
途中で規約が変わって、こういうのは許されるとなったはず。
7:01 AM
じゃなかったら Swift Playground はだいぶあれ。
Avatar
omochimetaru 7/26/2020 8:20 AM
自由なコードが取ってこれるようになってなくてアプリのオーナーが提供するならセーフだったと思う
8:21 AM
playgroundみたいに自分で書けるのはどうなんだ?
Avatar
DLやユーザーが書くのもOKになったんじゃなかったですっけ?アプリの中身を入れ替えてしまうようなのはアウトだけど、基本の挙動を変えない(ゲームのキャラクターの動作ロジックを書く)とかはOKと思ってました。
12:05 PM
2.5.2 Appはバンドル内で完結している必要があります。他のAppを含め、指定されたコンテナエリア外に対するデータの読み書き、またはAppの特徴や機能を導入したり変更したりするコードをエリア外からダウンロード、インストール、実行することは許可されません。実行形式のコードの学習や開発、学生によるテストを目的とした教育用Appでは、コードが他の目的で使用されないという、限られた状況での使用に限り、コードのダウンロードが許可される場合があります。こうしたAppでは、ユーザーがApp上でソースコードの全体を確認し、編集できることを許可しておく必要があります。
https://developer.apple.com/jp/app-store/review/guidelines/
(edited)
12:05 PM
結構厳しそう?
Avatar
conditional な dictionary literal ってどこかで論じられてませんでしたっけ? let dict = [ "a": 2, "b": 3, "c": 5 if isFoo, ] みたいなの。
Avatar
omochimetaru 8/4/2020 2:43 AM
初めて見た
2:44 AM
リテラルの中で #if したい みたいな話は見覚えがある
2:44 AM
僕はそういうのやりたくなったら optional にして compactMapValues する事があります (edited)
Avatar
あったら便利だと思うんだけどねー。
2:48 AM
ときどきやりたくなるから。
Avatar
omochimetaru 8/4/2020 2:48 AM
あ〜ってか、それで困って var にして if 文で ちょこちょこ組み立てていくような
2:48 AM
コードを良く書くな。
2:49 AM
あったら便利な気もするけど式的なifはSwiftらしくない気もする。
Avatar
そうなんよね。 var にして組み立てることになる。
2:52 AM
Function Builder ならできなくはないだろうけど・・・
Avatar
omochimetaru 8/4/2020 2:53 AM
let dict = { var d = [:] ... return d }() こうするとvar性の延長は避けられるか。
Avatar
// Function Builder let dict: [String: Int] = .init { ("a", 2) ("b", 3) if isFoo { ("c", 5) } } (edited)
Avatar
omochimetaru 8/4/2020 2:54 AM
できそうですねw
2:54 AM
DictionaryはまさにドキュメントみたいなもんだしFunction Builderの使い所としても正しそう
2:54 AM
でもタプル並べてるのがちょっと残念か・・・
Avatar
リテラルの拡張よりも Function Builder を使うのが現実的な道か。
2:55 AM
もしくは Dictionary literal 並べられるといいのかな?
Avatar
omochimetaru 8/4/2020 2:55 AM
Function builderでユーザ構成するほうが仕組みとしてはきれいだけど
2:55 AM
見た目的にDictionary Literalらしくなくなってしまうのが微妙ですね
Avatar
let dict: [String: Int] = .init { [ "a": 2, "b": 3, ] if isFoo { ["c": 5] } }
2:57 AM
callAsFunction と組み合わせれば↓みたいなこともできる? let dict = [ "a": 2, "b": 3, ] { if isFoo { ["c": 5] } }
2:58 AM
任意箇所への挿入がわかりづらいのは callAsFunction 版の難点か。
Avatar
omochimetaru 8/4/2020 2:58 AM
げ、マジ
Avatar
multiple trailing closure をさらに組み合わせたら任意箇所への挿入っぽく書けるかな?ww
Avatar
omochimetaru 8/4/2020 2:59 AM
その技、応用が効きそうだけど、見た目やばいですね・・・
Avatar
型推論で死にそう・・・
Avatar
omochimetaru 8/4/2020 2:59 AM
自己のfunction builderによるmutatorを受け取るcallAsFunctionをもたせる
2:59 AM
テクニックとして一般化できそう
3:00 AM
function builderの型推論はかなり良くなってるらしいけど
Avatar
Function Builder あんま好きじゃないんだよなぁ・・・
Avatar
omochimetaru 8/4/2020 3:00 AM
SwiftUIをやってないからわからん。
Avatar
知らないだけかもしれないけど、途中に無関係な式を挿入する方法あるのかな? (edited)
Avatar
omochimetaru 8/4/2020 3:01 AM
無関係な式?
Avatar
式でなくて文でもいいんだけど、
3:01 AM
計算結果を変数にとっておいて利用するとか。
3:02 AM
VStack { let foo = ... Text(foo) Text(foo) }
3:02 AM
みたいな
Avatar
omochimetaru 8/4/2020 3:02 AM
letは対応したんじゃなかったでしたっけ?
Avatar
5.3 でサポートされるんだっけ?
3:02 AM
Function Builder ちゃんと追ってないのでわかんない。
Avatar
omochimetaru 8/4/2020 3:02 AM
わからない
Avatar
if let はサポートされたはず。 (edited)
Avatar
omochimetaru 8/4/2020 3:02 AM
one-way constraintのPRで
3:03 AM
そういうletができるようになるぜって書いてたけど
3:03 AM
仕組み的な基盤が入るってだけの話で
3:03 AM
その構文が入りましたよって話題では無かったから
3:03 AM
まだだめかも。
Avatar
これまで↓だったのが if foo != nil { Text(foo!) }
3:04 AM
↓はできるようになるはず。 if let foo = foo { Text(foo) }
Avatar
omochimetaru 8/4/2020 3:04 AM
それは出来てほしいですよね〜
Avatar
うん、辛い
Avatar
omochimetaru 8/4/2020 3:05 AM
てかまあ、 => オペレータを自作すれば今も一応・・・
Avatar
!= nil 書く度に //FIXME 付けてる😂
Avatar
omochimetaru 8/4/2020 3:05 AM
func =><T, R>(_ f: (T) -> R) -> R
3:06 AM
VStack { ... => { (foo) in Text(foo) Text(foo) } }
3:06 AM
あ、だめか、 => の ViewBuilder版が必要だw
Avatar
.mapでよさそう
Avatar
map だと ViewBuilder にならなくないですか?
Avatar
omochimetaru 8/4/2020 3:07 AM
.some(foo).map { }
3:07 AM
これもViewBuilderにならない問題があるね。
Avatar
Optional:View where Wrapped: Viewじゃなかったでしたっけ (edited)
Avatar
omochimetaru 8/4/2020 3:11 AM
extension Optional where Element: View { func map<T, U: View>(_ f: @ViewBuilder (T) -> U) }
3:11 AM
↑これが生えてないと駄目だけど
3:11 AM
いや、これもおかしいなw
Avatar
↓になる? extension Optional where Element: View { @ViewBuilder func map<T, U: View>(_ f: @ViewBuilder (T) -> U) }
Avatar
ああなるほど。mapの中でGroupとか使えば解決しそうな気はした
Avatar
omochimetaru 8/4/2020 3:12 AM
funcの左側に @ViewBuilder 付ける文法あるんですか?
3:13 AM
Groupとか使えば
その手はありだね。
Avatar
ちゃんとした構文は知らないけど↓はよくやるよ。 @ViewBuilder var body: some View { ... }
Avatar
omochimetaru 8/4/2020 3:14 AM
そんなのあったのか。トップレベルがViewBuilderになる?
Avatar
トップはわからないけど、メンバはできる。
Avatar
compute getterがbuilderになりますね
Avatar
omochimetaru 8/4/2020 3:14 AM
あー、トップと言うか、その場合の body の中身が。
Avatar
メソッドにも付けてる例を発見したからメソッドでもできるはず。
Avatar
omochimetaru 8/4/2020 3:15 AM
なるほど。定義側で自発的にViewBuilderにできるのか、便利。
3:16 AM
さっきの例だと Optional.map 自体の実装を ViewBuilder で書けるって事だけど (edited)
3:16 AM
ユーザーには関係無さそう
Avatar
rethrows 的な re@ViewBuilder がほしくなるねw
3:17 AM
判定不能か。
Avatar
1つtoplevel関数作れば解決できる
Avatar
まあ、 if let が使えれば解決なわけで、 5.3 で問題ないはず?
Avatar
今の ViewBuilder って 10 個以上要素並べられないの? https://developer.apple.com/documentation/swiftui/viewbuilder
Avatar
omochimetaru 8/4/2020 3:27 AM
去年の時はそうだったし今もそうじゃないかしら
3:27 AM
TupleViewのオーバーロード数までしかいかない
Avatar
これだと Dictionary literal に使うのは厳しそうだなぁ。
3:28 AM
巨大リテラルを書かない前提ならいいのかな・・・。
Avatar
omochimetaru 8/4/2020 3:28 AM
あーたしかに、SwiftUI.Viewと違って入れ子にしてごまかす方法が無いですね
Avatar
まあ同じ技で入れ子を作らせることはできるだろうけど・・・。
3:29 AM
タプルじゃなくて↓方式ならまあいけるか。 let dict: [String: Int] = .init { [ "a": 2, "b": 3, ] if isFoo { ["c": 5] } }
Avatar
omochimetaru 8/4/2020 3:30 AM
それも刻みの数が10個までになっちゃうのでは。
Avatar
そうだけど、そんなにたくさん条件挿入しないんじゃない?
Avatar
omochimetaru 8/4/2020 3:31 AM
まあそうですね 足りるであろう数まで定義すれば良い
Avatar
buildBlock って可変長引数対応してるのかな?
3:35 AM
それであれば Dictionary は可変長でいけそう。 (edited)
Avatar
omochimetaru 8/4/2020 3:36 AM
そうですね。試さないとわからない。
Avatar
😂
Failed to produce diagnostic for expression; please file a bug report
3:43 AM
@_functionBuilder public struct DictionaryBuilder<Key: Hashable, Value> { public func buildBlock() -> [Key: Value] { [:] } public func buildBlock(_ c0: [Key: Value]) -> [Key: Value] { c0 } public func buildBlock(_ c0: [Key: Value], _ c1: [Key: Value]) -> [Key: Value] { c0.merging(c1) { _, new in new } } } extension Dictionary { public init(@DictionaryBuilder<Key, Value> _ builder: () -> [Key: Value]) { self = builder() } }
3:43 AM
import XCTest @testable import DictionaryBuilder final class DictionaryBuilderTests: XCTestCase { func testExample() { let dictionary: [String: Int] = .init { [ "a": 2, "b": 3, ] [ "c": 5, "d": 7, "e": 11, ] } XCTAssertEqual(dictionary, [ "a": 2, "b": 3, "c": 5, "d": 7, "e": 11, ]) } }
3:44 AM
モジュール本体はビルドできるけどテストでコンパイラが "Failed to produce diagnostic" に・・・。
3:44 AM
init はあやしいかと思って static func にしてみたけど変わらず。
Avatar
buildBlock() 群を static func にする必要がありますね。 (edited)
Avatar
おお、見落としてました。ありがとうございます。
4:20 AM
それとは別に diagnostic の問題はあるかと。 Function Builder が非公式だからまだいいのかな?
Avatar
omochimetaru 8/4/2020 4:21 AM
diagnosticは結構筋肉実装だから
4:21 AM
見落としてる可能性もあるから報告するといいかも
4:22 AM
「staticにし忘れてbuildBlock を定義する」時だけの謎挙動を踏んでる気がする (edited)
Avatar
↓可変長できた。これなら使い物になりそう。 @_functionBuilder public struct DictionaryBuilder<Key: Hashable, Value> { public static func buildBlock(_ contents: [Key: Value]...) -> [Key: Value] { contents.reduce(into: [:]) { $0.merge($1) { _, new in new } } } }
Avatar
"Failed to produce diagnostic for expression;" はすべからくコンパイラのバグなので、報告してください🙏
Avatar
omochimetaru 8/4/2020 4:25 AM
あ、「semaが失敗したけど何もdiagnose出てない」的なelseのメッセージなんですかね (edited)
Avatar
そんな感じです。
Avatar
omochimetaru 8/4/2020 4:29 AM
なるほど
Avatar
おおお、動いた!
4:30 AM
let dictionary: [String: Int] = .init { [ "a": 2, "b": 3, ] if isFoo { ["c": 5] } }
4:30 AM
コンパイラのバグなので、報告してください🙏
了解です!
Avatar
omochimetaru 8/4/2020 4:32 AM
SwiftUIも途中にAnyViewが挟まっても動くんだから
4:32 AM
可変長のやつがあればいいのに。
Avatar
Proposal Draft には buildIf が Alternative Considered になってる一方、 buildDo とかも載ってて、何が今使えるものなのかわからない・・・。
Avatar
SwiftUIで可変長やろうとしたら可変長Genericsが必要になるぞ
Avatar
omochimetaru 8/4/2020 4:38 AM
@tarunon AnyViewで返すならパラメータ要らないじゃん
Avatar
Dictionaryは可変長Genericsが不要なので可能
Avatar
omochimetaru 8/4/2020 4:38 AM
あー引数が受け取れない?
Avatar
そうなりますね
Avatar
omochimetaru 8/4/2020 4:38 AM
そっか
4:38 AM
ユーザー側が全部を .eraseToAnyView するって仕様にしないと
4:39 AM
引数の配列の型が書けないのか
Avatar
FunctionBuilderは取りあえず1個取り回しの効く定義を置いといて、protocolを拡張する形で色んなのにcoformさせると便利
Avatar
Swift と JavaScript の async/await を比較した場合、 suspendAsync(...) に相当するのは new Promise(...) で、 beginAsync に相当するのは await なしでのコールかな? https://gist.github.com/lattner/429b9070918248274f25b714dcfc7619
Concrete proposal for async semantics in Swift. GitHub Gist: instantly share code, notes, and snippets.
2:37 AM
beginAsync だと中に複数の非同期関数のコールを書けるからちょっと違う? beginAsync 相当は↓みたいな感じ? (async () => { await foo(); await bar(); })(); // ここでは await なしでコール (edited)
Avatar
omochimetaru 8/6/2020 2:38 AM
そうだと思う
2:38 AM
Kotlinだと suspendCoroutine と launch に対応しそう
2:42 AM
JavaScriptはそのへんが全くタイプセーフじゃないのでつらそうだ。
Avatar
suspend fun はコールサイトでのマーク( try とか await 的な)は特に必要ないのか。 Java の throws 相当に近いな(コールサイトのマークが必要ないけど suspend / throws が静的にチェックされるという意味で)。
2:58 AM
Kotlin 、 suspend を静的にチェックするなら throws もチェックしてくれればよかったのに・・・。そこが一番辛いんだよなぁ。
3:00 AM
これか。確かに suspendAsyncnew Promise に対応してそう。 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.coroutines.experimental/suspend-coroutine.html
Avatar
omochimetaru 8/6/2020 3:04 AM
確かにkotlinは await のマークが無いな。
3:04 AM
コルーチンコンテキストであるかどうかの静的検査はされてるけど。 (edited)
3:05 AM
JavaScriptだと静的検査がないからマーキングは絶対に必要だけど
3:05 AM
Kotlinは検査があるからマーキングが無い文法を構成できるんだな
3:05 AM
Swiftは静的検査があるけどマーキングもする方針で
3:05 AM
どれも違うのが面白いな (edited)
Avatar
await あるほうが可読性高そうだけど・・・。ぱっと見でどこで await になってるかわからないのって結構怖そう・・・。
Avatar
omochimetaru 8/6/2020 3:14 AM
Android開発でちょっと触ってますけど、
3:14 AM
結局外側から見ると、開始するかキャンセルするかで制御するから
3:14 AM
フローのどこがawaitなのかってあんまり関係ない気がする
3:15 AM
Rx書いてても、map map map って書くのと map flatMap map って書くので
3:15 AM
特に何か意識が変わったりしないのと同じで。
3:15 AM
単に次のオペレータの型に合わせてflatMapって書いてるだけというか。
Avatar
同期であることを前提として処理を書くことって結構あると思うけど、(シングルスレッドであればここからここまでの間で状態が変化しないとか)非同期が挟まった瞬間にそういう前提が崩れることって結構あると思うんだけど、新しいコードベースに触れるときにどこまでが同期でどこからが非同期なのかが見えなかったらコード読みづらくないかな?書いているときはそこを把握した上でだから書けるだろうけど。
Avatar
omochimetaru 8/6/2020 3:28 AM
非同期が挟まっちゃった時点で
3:28 AM
async func foo() { (await?) f1() (await?) f2() (await?) f3() }
3:29 AM
このどこが非同期だったかどうかに影響を受けるシチュエーションが無いような気がする。
3:30 AM
現在の状態をビューに書き出す render() があったとして、 await の直後には必ず render() を入れたいとかがあるかなあ? でもそれは状態の変化の方で呼び出しておけばいいしなあ。
Avatar
func foo() async { guard let first = self.values.first else { return } ... bar() if self.values.count == 1 { ... } else { ... } } みたいなのがあったときに、 barasync だと values が空でないことが保証できないとか。
Avatar
omochimetaru 8/6/2020 3:42 AM
あ〜、なるほど。 そういうのは確かに怖いので、 fooが values を引数を取るようにして self を都度見ないようにするか、 そもそもfoo() の実行中に self に関して他の競合しうるような非同期タスクが実行されないように、 画面レベルで 非同期タスクの多重実行防止機構をもたせてます。
3:43 AM
というのも、 barasync だったとして、 ほかの非同期タスクの影響でも values が変更されうるようなシナリオって、 そもそも認知負荷が高すぎて考慮しきれないから、避けちゃう。
3:43 AM
いや、逆なのか 「async じゃなかったときは心配しないでそういうコードを書くことができる」
3:43 AM
というメリットが生まれている?
3:44 AM
「Optional型の静的検査があって嬉しいのは non-optional 型が扱えるようになること」 みたいな話か
Avatar
なるほど、非同期が async に集約されれば async でないことが同期であることの保証になるのか。
Avatar
omochimetaru 8/6/2020 4:25 AM
はい。いや、それを koher が主張しているのかと思ったw
Avatar
言いたかったのは、 async でも await が可視なら、 await から await までの間は同様の保証が働くということでした。
Avatar
omochimetaru 8/6/2020 4:29 AM
そうですね。そこに同期前提のロジックを書ける。
Avatar
という意味で await が不可視なのは怖いかなぁと。
4:30 AM
try がなくてジャンプが不可視なのもだけど、 await はより怖い感覚があるなぁ。
Avatar
omochimetaru 8/6/2020 4:30 AM
確かに書いた時にここは同期だからこれは安全なんだ〜って思って書けるけど
4:31 AM
後で読んだ時に ここが非同期だったらバグるけど大丈夫なのか?って
4:31 AM
心配になってしまいそうな気がしてきた。
4:31 AM
たしかにそうですね、例外が飛んできてもまあエラーハンドラが発火するだけで
4:31 AM
変な状態になることは多分すくないけど
4:32 AM
思わぬ非同期割り込みは再現性の低いバグの原因になるからもっと悪質な事が起こりそう。
Avatar
The Swift Programming Language に Opaque Type の章できてるの見つけた。 Existential Type のことを Protocol Type と呼んでるんだけど、それに倣った方がいいのかな? https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.html
3:00 AM
でも、もし any 導入されたら some Animalany Animal のどっちも "Protocol Type" に見えそうだし(もしくはどっちも見えなさそうだし)、やっぱり Existential Type の方がいいか。 (edited)
Avatar
複数エラーを throw したくて禁断の技を使ってしまった・・・。 extension Array: Error where Element: Error {}
😆 1
12:35 AM
本当はこれをラップしたエラー型を作るべきなんだろうけど。
Avatar
Kishikawa Katsumi 8/8/2020 3:09 AM
おもしろい。こういうのもアリかなあ。
Avatar
禁断...!
Avatar
omochimetaru 8/8/2020 6:48 AM
Setの方が意味的に望ましい? 同じものの重複と順番があってもいいか。
Avatar
@omochimetaru 意味的には Set かもだけど、 Hashable にしないといけないので。
Avatar
僕はOptionSetでやった
12:17 AM
任意のエラーは無理だけど
Avatar
↓ができてほしくて let aToZ: ClosedRange<Unicode.Scalar> = "A" ... "Z" for c in aToZ { print(c) } ↓みたいな extension 書いた。これって標準で付いてたらダメ? extension Unicode.Scalar: Strideable { public func distance(to other: Unicode.Scalar) -> Int { Int(other.value) - Int(self.value) } public func advanced(by n: Int) -> Unicode.Scalar { Unicode.Scalar(UInt32(Int(self.value) + n))! } }
Avatar
omochimetaru 8/17/2020 3:49 AM
文字列リテラルって Unicode.Scalar にもなるのか。
Avatar
ExpressibleByStringLiteral じゃなくて ExpressibleByUnicodeScalarLiteral が付いてるみたい。 https://developer.apple.com/documentation/swift/unicode/scalar
Avatar
omochimetaru 8/17/2020 4:07 AM
おお。じゃあリテラルがunicode scalarで見て1単位であることが検証されてそう。
4:07 AM
4:07 AM
あれ、てかありそうですよ
4:08 AM
あ、 Strideable がついてないって話か
Avatar
うん、 Strideable が欲しい。
Avatar
omochimetaru 8/17/2020 4:10 AM
どうなんですかねえ
4:10 AM
割当のない歯抜けのコードポイントとかもあるから
4:10 AM
ちょっと変な感じもする
4:11 AM
A から Z とかで使うならたしかにしっくりくるけど。
Avatar
あいうえおはソート用に意図的な配列になってるけど
4:11 AM
他の言語の文字や記号がそうなってるわけじゃないし
4:11 AM
実用性は?かも
4:11 AM
使途によるかなあ。
Avatar
omochimetaru 8/17/2020 4:11 AM
うーんでもレンジの構成はできるんだからいいのかなあ
Avatar
割当のない歯抜けのコードポイント
これって Unicode.Scalar.initnil になるのかな?
Avatar
ならないとおもう
4:12 AM
Scalarとしては正しい。
Avatar
omochimetaru 8/17/2020 4:12 AM
Scalarである以上1ずつ増やすのが自然な気もしてきた。
Avatar
Scalar として考えるなら Strideable であってもおかしくない気が。
Avatar
実用性の問題?
4:13 AM
あるいは意図的にscalarでやると分かってない人がへんなコードかくだろうからって
4:13 AM
わざと実装してないとか?
Avatar
omochimetaru 8/17/2020 4:14 AM
文字列から取り出した1つのscalarを、ある範囲にあるか調べるシナリオはよくあるけど
4:14 AM
ある範囲のscalarを連続して生成するってシナリオはあんまりない気もしますね
Avatar
("a" ... "z").randomElement()! とかやりたいことは結構あると思うんだけどなぁ。
Avatar
omochimetaru 8/17/2020 4:17 AM
なるほど
Avatar
asciiではそうかもだけど
4:18 AM
一般的なUnicode Scalarでそうかといわれるとうーん
4:19 AM
微妙
4:25 AM
あって困らないものをAPIにいれるかどうかはなんか思想とては興味深い
Avatar
omochimetaru 8/17/2020 4:26 AM
PythonとRubyはドカドカ入れてるイメージ
Avatar
そうそう
Avatar
omochimetaru 8/17/2020 4:26 AM
C++やSwiftはケチケチしてる
Avatar
JavsScriptはnpmで増やしてる
Avatar
標準に入れるものに慎重になるのは理解できる。際限なくなるし。あれが入ってるならこっちが入ってないのはなぜ?と。
4:28 AM
OrderedCharacter とかあればいいのかな・・・。
Avatar
assoctypeを縛ればexistentialを作れるようにしようぜ!という提案のドラフトだ。 https://github.com/apple/swift-evolution/pull/1170
This proposal is about adding support for values of existential type when its associated types are known to be fixed to fully concrete types. protocol P { associatedtype X } protocol Q: P where X =...
Avatar
あ、そういうことか。 generalized existential ですべての assoctype を縛らないといけないのかと思ったら。
1:38 AM
これが今までできなかったのって実装上の問題なんでしたっけ?何か意味があるんですっけ?
Avatar
Create own FunctionBuilder from Protocol. Contribute to tarunon/Buildable development by creating an account on GitHub.
12:37 PM
emptyとmergeのオペレーターを生やすだけで、任意の構造でFunctionBuilderが使えるようになります
Avatar
なるほど。これは汎用的ですね!
Avatar
型プログラミングがめっちゃ超絶技巧なんで見て欲しいw
Avatar
@tarunon ↓こういう実装はいかがでしょうか? https://github.com/koher/Buildable/commit/c4d046af99d884c6327af5312e36dc9641af55e9
Avatar
あーーー
1:50 PM
前半は型が減ってすっきりなんですが、FunctionBuilder周りはこれ触っちゃうと
1:51 PM
_Builderを使ったオレオレサブタイピングの余地が無くなっちゃうんで
1:51 PM
ここは置いときたい感じですね。上手いことやれば
1:54 PM
@omochimetaru https://t.co/woMynTWzal とりあえずサンプルやで
1:54 PM
このパターンに展開できると考えています
1:55 PM
これやろうとすると可変長引数だと出来ない
Avatar
FunctionBuilder 自体は汎用にしておいて、 Buildable に適合した型だけその結果を使って build できるようにしたいってことですか?
1:57 PM
つまり、 Buildable 以外にも FunctionBuilder を使えるようにしたいと。
2:00 PM
ちがうか。 _Builder があるから任意の型を生成できるのか。 (edited)
Avatar
そうです
2:01 PM
例えば_Builderを使って、OptionalをArrayとして振る舞わせる、みたいな凶悪なことも出来ます
Avatar
組み立てるときに使う部品と完成物が同じ型でなくとも構わないと。
Avatar
流石に単一Buildableでそれをやるとassociatedtypeのコンフリクトで死んじゃうんですが、制約は殆どprotocol extensionに逃がしているので (edited)
2:03 PM
手前でprotocol定義して拡張を重ねる、とかもできるはず
Avatar
完全には理解できてないですがなんとなくわかったような気がします。
Avatar
https://github.com/tarunon/Buildable/blob/831b09aac1bb05fc47a6b171efbce70c8317ece8/Sources/Buildable/FunctionBuilder.swift#L51-L53 Pair<Pair<Pair<C0, C1>, C2>, C3> じゃなくて Pair<Pair<C0, C1>, Pair<C2, C3>> なのには意図があります?
Avatar
これどっちでも良かったんですけど、とりあえず慣らしておくか〜と思ってそうしてます
1:34 AM
ただまあこの辺はユーザーサイドで弄ることないんで、Tuple2〜9まで用意しちゃってもいいですね
Avatar
結合順序が一定していた方が安心かなと思いました。Tuple用意すれば良いのは確かに。
Avatar
悪いこと出来そうだな〜と思ったけど駄目でした
Function builder attribute 'FunctionBuilder' cannot be applied to an autoclosure parameter
11:51 AM
FunctionBuilderで評価されるexpressionをFunctionBuilderに再帰的に食わせることが出来れば、割と何でもできそうだ、と思ったけど前提が成り立たなかった
Avatar
@swift-5.2.5 struct Foo { func get() -> Int { 42 } var bar: Int { get() } }
Avatar
swift52 BOT 9/1/2020 9:30 AM
exit status: 1 with stderr:<stdin>:4:12: error: expected '{' to start getter definition get() ^
Avatar
↑パースできないおもしろい例見つけた。
🤔 1
Avatar
norio_nomura 9/1/2020 10:25 AM
@swift-5.2.5 struct Foo { func get2() -> Int { 42 } var bar: Int { get2() } } なるほど。
Avatar
no output
Avatar
getは予約語じゃないんすね
Avatar
Resultget メソッド持ってますよ。
👉 1
Avatar
omochimetaru 9/3/2020 2:59 AM
@swift-5.3.3 struct V<K> { func f(_ k: K) {} } struct S { var name: String = "" } V<KeyPath<S, String>>().f(\.name) // OK V<PartialKeyPath<S>>().f(\S.name) // OK V<PartialKeyPath<S>>().f(\.name) // NG (edited)
Avatar
swift53 BOT 9/3/2020 2:59 AM
exit status: 1 with stderr:<stdin>:9:24: error: type of expression is ambiguous without more context V<PartialKeyPath<S>>().f(\.name) // NG ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~ (edited)
Avatar
omochimetaru 9/3/2020 3:00 AM
これ推論機のバグかなあ。残念すぎる
Avatar
V<PartialKeyPath<S>>().f(\S.name) ならいけるっぽい?
Avatar
omochimetaru 9/3/2020 3:01 AM
うん。それはいける(すまん入れ違いで追記した
3:04 AM
うーんこれが通ったらおしゃれなユーティリティになったのに・・
Avatar
KeyPathは使えないんですかね
Avatar
omochimetaru 9/3/2020 3:05 AM
使えない
Avatar
Partialが必須なのかな
Avatar
omochimetaru 9/3/2020 3:05 AM
VはValidatorなんだよね
3:05 AM
結果をフィールド種類ごとに勝手に収集するvalidation helperを作っていて
3:05 AM
任意のHashableをキーに使えるようにしたんだ
3:05 AM
もともとStringだったけどそれだとtypoするから
3:06 AM
で、ユーザ側で勝手に Key = PartialKeyPath<Props> ってやったら
3:06 AM
キーパスに限らない使い方もできて便利だった。
3:06 AM
KeyPath<Props, String> だと、 Stringじゃないプロパティが収納できないから駄目。
Avatar
ん〜〜
3:06 AM
KeyPath<Props, T>
Avatar
omochimetaru 9/3/2020 3:07 AM
シンボルならなんでもいいんだけどKeyPathを使うと便利だった
Avatar
これでGenericsパラメータを埋めるなにか後一手があればうまくいきそうだけど
Avatar
omochimetaru 9/3/2020 3:07 AM
Validatorを自由なKeyじゃなくてKeyPathに縛った仕様にしちゃえば多分回避できる
3:08 AM
mutating func notEmpty(for key: Key, value: String) -> Bool { if !value.isEmpty { return true } addFailure(for: key, .empty) return false }
3:08 AM
これに <T> たせば PartialじゃなくてKeyPathにできるね。
3:08 AM
で、内部のdictionaryにしまうときにPartialKeyPathにアップキャストすればいいから。
Avatar
そんなかんじ
Avatar
omochimetaru 9/3/2020 3:08 AM
KeyPath以外で使いたくなるときが来ることが実際は多分ないから
3:09 AM
バグレポだけしていったんそうするか・・・
3:11 AM
struct Validator<T> { typealias Key = PartialKeyPath<T> mutating func notEmpty<X>(for key: KeyPath<T, X> , _ value: String) -> Bool { ... } var validator = Validator<Props>() _ = validator.notEmpty(for: \.name, props.name)
3:11 AM
これだと動いたよ。無駄な <X> ださい・・・
3:12 AM
KeyPath<T, X> から PartialKeyPath<T> への変換は暗黙変換だから
3:12 AM
まあ、実装は対して汚れないが・・・
Avatar
お〜
3:13 AM
Keyが任意の型であっても
3:13 AM
extension Validator where Key == PartialKeyPath<T> { // ここに生やす } でいけそうやな
Avatar
omochimetaru 9/3/2020 3:14 AM
そこに <T> 書けなくない?
Avatar
Validator<T, Key>
Avatar
omochimetaru 9/3/2020 3:14 AM
それ T にしばる意味がない
3:14 AM
validation対象のパラメータセットが1つのstructに集約されている必要が生まれちゃうんだよね
3:14 AM
まあ、実際そう作ってることが多いとは思うが。
3:15 AM
bugs落ちてるんだがw
3:15 AM
🥺 1
3:15 AM
もともとの実装は Validator<Key: Hashable> だったのだ。
Avatar
てか、Tいらないんだったら
3:16 AM
PartialKeyPathである必要もないのでは、AnyKeyPathとか (edited)
Avatar
omochimetaru 9/3/2020 3:16 AM
それだと
3:16 AM
そもそも \.name って書けなくなる。 (edited)
Avatar
や、それが書きたいのは関数引数のときだけでしょ
3:16 AM
だからStorageはAnyKeyPathにしても問題ないのでは〜と
Avatar
omochimetaru 9/3/2020 3:17 AM
ああ、Storageはまあそうだけど
3:17 AM
Validator自体が <T> もってるからどうせTのkeypathでしか使えなくなってる
3:17 AM
if validator.failures[\.password]?.isEmpty, validator.failures[\.passwordConfirm]?.isEmpty { }
3:18 AM
辞書参照のほうが通らねえ・・・w
3:18 AM
こっちは直接 PartialKeyPath が見えてるから・・・ 辞書直接さらさずにこれも <X> つけたアクセサ作ればごまかせるけどw
Avatar
Validator自体にsubscript生やせば解決しそう
3:20 AM
extension Validator { subscript<X>(failure: KeyPath<T, X>) -> } ざっくりこんな感じか
Avatar
omochimetaru 9/3/2020 3:20 AM
そうだねえ・・・
Avatar
確か4.xぐらいでsubscriptにGenerics使えるようになったので
3:20 AM
これは動くはず
Avatar
omochimetaru 9/3/2020 3:20 AM
validator[\.name] が収集されたエラーであることが自明でないからAPIとして微妙だな〜
Avatar
やや
3:21 AM
validator[failure: \.name] やで
3:21 AM
ラベル付きsubscript
Avatar
omochimetaru 9/3/2020 3:21 AM
あ、その場合は定義側では2回書くよ
Avatar
あれ、せやったか
Avatar
omochimetaru 9/3/2020 3:21 AM
subscriptはfuncのときとルールが逆なのだ
3:21 AM
subscriptのラベルでアクセスストレージを示すの微妙じゃない?
3:22 AM
dictionaryの["a", default: []] みたいに
3:22 AM
オプションパラメータに使うのは良いと思うんだけど。 (edited)
3:22 AM
まあ func failure<X>(key: KeyPath<X, T>) -> [Failure] かなあ
Avatar
setterいらないならそれでいいやね
Avatar
omochimetaru 9/3/2020 3:24 AM
if validator.failures(for: \.password).isEmpty, validator.failures(for: \.passwordConfirm).isEmpty { }
3:24 AM
まあnil潰せるメリットがおまけで付いてくるのでこれで。。
3:24 AM
いまは private(set) だからちょうどいいよ
3:24 AM
これ setter あけるとき、 setFailures も実装するけど、
3:24 AM
コピーコストが気になって modifyFailures も実装することがよくある
3:25 AM
subscriptだと効率的なmodifyが自動で提供されるのが嬉しいよね。
Avatar
subscript作っちゃったほうが精神衛生的に良さそう
Avatar
omochimetaru 9/3/2020 3:26 AM
tarunonはそういうときどうしてんの
3:26 AM
俺はよく不愉快になりながらget/set/modify3つ書いてる
Avatar
初手subscriptかな
Avatar
omochimetaru 9/3/2020 3:26 AM
マジか 外で見たことある?
3:26 AM
ストレージをラベル指定するタイプのsubscript
Avatar
subscriptの難点はIDEの保管に出てこないところなんやが
Avatar
omochimetaru 9/3/2020 3:27 AM
実装効率と性能は取れるけどAPIがSwiftyでなくなるよね
Avatar
えーっと
Avatar
omochimetaru 9/3/2020 3:27 AM
あ〜、補完たしかに。
Avatar
RxSwiftのButton周りがなんかそんなんなかったっけ。。。ちょっと記憶があやふや
Avatar
omochimetaru 9/3/2020 3:27 AM
ほお
Avatar
気のせいな気がしてきた
Avatar
subscript(dynamicMember:) とかは?
Avatar
そもそもsubscriptをSwiftyじゃない、と定義してしまうのは、心が狭いというかそんな感じはしていて
3:29 AM
便利に使えるものは便利に使うといいんじゃないかな
Avatar
omochimetaru 9/3/2020 3:29 AM
ん、今 dynamicMember にしたいことは特にない
Avatar
いや↓
ストレージをラベル指定するタイプのsubscript
Avatar
omochimetaru 9/3/2020 3:30 AM
あー
3:30 AM
Validator<Props> にたいして validator.name で nameのエラーが取れるようになるのかな
Avatar
ちょっとちゃんと話を追えてないけど。
Avatar
omochimetaru 9/3/2020 3:31 AM
どうなんだそれ、validation関数のほうは書けるかな?
Avatar
結論ストレージを露出させる場合、Dictionaryを見せたくない場合は
  • subscript用意する
  • getter functionはsubscriptを参照するalias functionにする
  • setter functionもalias用意するけどwarningでsubscript使えと誘導する
こうしますかね
3:32 AM
これなら補完を普通functionにぶん投げつついい塩梅のAPIになるとおも
Avatar
omochimetaru 9/3/2020 3:32 AM
結果の方は一旦中継すれば validator.failures.name とかはできそうですね
3:33 AM
検査の方は順番ひっくりかえして validator.name.notEmpty(props.name)
3:33 AM
こんなスタイルにはできるかも。
3:34 AM
誘導用のsetなるほど
3:38 AM
KeyPathに寄せるんだったら値の指定も不要にしちゃうか・・・
3:41 AM
var validator = Validator(target: props) if validator.notEmpty(for: \.password) { _ = validator.minLength( for: \.password, length: setting.passwordMinLength ) } _ = validator.notEmpty(for: \.passwordConfirm) if validator.failures(for: \.password).isEmpty, validator.failures(for: \.passwordConfirm).isEmpty { _ = validator.checkConfirm(for: \.passwordConfirm, original: \.password) }
3:42 AM
おしゃれではある
Avatar
omochimetaru 9/4/2020 4:56 AM
swift-nioのEventLoopFuture使いにくいンゴね
4:57 AM
Event-driven network application framework for high performance protocol servers & clients, non-blocking. - apple/swift-nio
4:57 AM
mapの中でthrowできなくて、mapの中でthrowするやつはflatMapThrowsで、 flatMapの中でthrowできない
4:58 AM
throwsをResultモナドだと思ってResultモナドがFutureモナドのサブタイプだとみなしているのできれいではあるけど
4:58 AM
フローの組み換えで面倒な場面が多い
5:01 AM
CombineのflatMapもthrowはできないのか。 mapの中でthrowするやつはtryMapだった。
Avatar
async/await 入ったら標準ライブラリに Future も入るのかな? Proposal で触れられてるけど。そしたら、標準ライブラリと Combine と SwiftNIO で Future が乱立・・・。
Avatar
omochimetaru 9/4/2020 5:12 AM
SEは別になるか一緒になるかはわからんけど Future は追加されそう Resultがあるし。
Avatar
throw に対する Resultasync に対する Future とすると、標準ライブラリでは FutureFailure を持たないという設計も考えられる。
Avatar
omochimetaru 9/4/2020 5:12 AM
てか、Futureがないと、2つ開始して両方を待つとかできないですから。 (edited)
5:13 AM
あ〜。
5:13 AM
文法上のasyncはthrowsと直行するからか。
5:13 AM
うーん、厳密にasyncだけをモナド化しなくて、throwsコミコミのFutureが使いやすい気がするけどな
5:14 AM
nothrowなasyncはFuture.Failure==Neverで扱えるし。
Avatar
もし Future<Value, Failure: Error> にしてしまうと、今後第三のモナドに対する throws/try, async/await 相当の構文が導入されたときにモメそう。 (edited)
5:20 AM
async throws な関数をラップすることを考えると FutureFailure がないと厳しいよなぁ・・・。
5:21 AM
let a = Future { try await foo() } let b = Future { try await bar() } let c = try await a.get() + b.get()
Avatar
第三のモナド、差し当たりyield/generatorとかですかね?
Avatar
omochimetaru 9/4/2020 5:22 AM
そのget()、Future.FailureがNeverのときやっぱりnothrowになってほしいな
Avatar
かもしれないし、もっと何かあるかもしれません。何せ今見えてないものなので。 < 第三
Avatar
omochimetaru 9/4/2020 5:23 AM
generatorは func next() async で扱えそう
Avatar
async/await で generator 作る例を Joe Groff が昔書いてたはず。
Avatar
omochimetaru 9/4/2020 5:24 AM
one-shot な Algebraic Effectsなら 例外構文とPromiseがあればエミュレートできるから
Avatar
FutureにError入れなくても、一応はモナドにラップできるんで入れないほうがいいんじゃないかな〜
Avatar
omochimetaru 9/4/2020 5:24 AM
async/throwsの2つでかなりの線形計算?をカバーしてるはずで
5:24 AM
そこから漏れてるのはone-shotじゃない場合だから
5:25 AM
callcc的な繰り返し再開できる継続って事になるんかな
Avatar
let a = Future { await Result { try foo() } } let b = Future { await Result { try bar() } } let c = try await a.get().get() + b.get().get() throws-rethrowsと同じように、async-reasyncがあれば、↑のように書けるはず。
Avatar
let a = Future { await Result { try await foo() } } let b = Future { await Result { try await bar() } } let c = try await a.get().get() + b.get().get() って まったく同じこと書いてたw (edited)
5:26 AM
あ、 foobarawait がいるはず。
Avatar
one-shot な Algebraic Effectsなら 例外構文とPromiseがあればエミュレートできる
asyncがある世界でgenerator欲しくなるのは、one-shotじゃない場合がほとんどなんじゃないかしら(one-shotの意図を履き違えてたらすまん
Avatar
reasync されて Future の方でさらに await が必要。
Avatar
ああ、
5:27 AM
確かに
Avatar
omochimetaru 9/4/2020 5:27 AM
generatorは
5:27 AM
たんにasyncなSequenceじゃない?
Avatar
Future<Result<T, E>> に対して、 func get() async throws E -> Textension がほしい。
5:28 AM
そうすれば get().get()get() でよくなる。 (edited)
Avatar
async generatorとgeneratorは分けて考える気がする(TS脳
Avatar
omochimetaru 9/4/2020 5:29 AM
あーまあそういう整理もできるけど
5:29 AM
asyncでないgeneratorは結局coroutineでsuspend/resumeしているので
5:29 AM
ユーザにasync/awaitが扱える言語ならasyncの上で一般のgeneratorが組めるよ
Avatar
そのためにはまず Parameterized extensions が必要で、道は遠い・・・。
Avatar
omochimetaru 9/4/2020 5:30 AM
Swiftの予定だと Coroutineをまず作って、その上でawaitとgenerator作れるねって話になっとるね
Avatar
overloadの解決順も、結構柔軟に定義できるようにしないといけない気がするな
Avatar
omochimetaru 9/4/2020 5:31 AM
Kotlinと同じ方針
Avatar
その方針自体は良さそうだと思っていて
5:31 AM
まあ追々Generatorも出てくるのか。
5:31 AM
try, async, yieldに対して、それぞれ単一のモナドがstdlib上に定義されている状態が
5:32 AM
まあシンプルだと思うんだけどな〜FutureはErrorつけられちゃうんだろうか。
Avatar
omochimetaru 9/4/2020 5:32 AM
yieldのモナドは既にあるSequenceじゃないか?
5:32 AM
実装側がシーケンシャルな処理でreturnの代わりにyieldで停止/再開するだけで
5:32 AM
それをオブジェクト化したものは
Avatar
どのSequenceを当てるんだろ、LazySequenceでいいのかな
Avatar
omochimetaru 9/4/2020 5:32 AM
いや、Sequenceは.next() だけだから
5:32 AM
ぴったりはまってるはず
5:33 AM
next()が呼ばれたら再開して次のyieldの結果を持ってくる。
Avatar
Sequenceはprotocolでしょ、何らかの具体型が用意される予感はしている
Avatar
Swift 6 で async/await 導入されるなら、 Future が同時に導入されないのはきついので、 Parametrized extension はそれまでに入らなさそうな気がするし、 Failure 入れられちゃいそうな気がする・・・。
Avatar
omochimetaru 9/4/2020 5:33 AM
個別の generator func が、 some Sequence じゃない?
Avatar
妥協で FutureResult 型が導入されればいいのかな。
Avatar
omochimetaru 9/4/2020 5:34 AM
実装がそのままfuncなんだから、一つずつ違う型になる
Avatar
ふむ。
Avatar
omochimetaru 9/4/2020 5:34 AM
eraseしたいならAnySequenceにしまう。
Avatar
Futureが同時に入らない、というのは有り得そうな気がする
5:34 AM
確かにAnySequenceで良さそうだ
Avatar
同時に入らないの結構つらそうじゃないですか?並行で実行しづらい。
Avatar
omochimetaru 9/4/2020 5:35 AM
てか、僕は普通に
Avatar
オレオレ Future が乱立するか、 Combine.Future に対する extension ができるかかな。
Avatar
omochimetaru 9/4/2020 5:35 AM
例外内包したFutureが良いと思っているので
5:35 AM
それで良い
Avatar
Combine.Future に対する extension ができる
現実的にはここに落ちると思います
Avatar
omochimetaru 9/4/2020 5:35 AM
NIO.EventLoopFuture は EventLoop の制御が入ってるんでちょっと別ですね
5:36 AM
Combine.Future はどうなんだろう。
Avatar
そのままだと何も入ってないと思います
5:37 AM
オペレーターで付与していける
Avatar
omochimetaru 9/4/2020 5:37 AM
Futureが例外もってても、Failure == Never のときにはasyncだけの振る舞いをもってれば、十分じゃないです?
Avatar
import Combine extension Future where Failure == Error { init(execute: () async throws -> Value) { ... } } (edited)
5:38 AM
みたいなのがあれば良い?
Avatar
omochimetaru 9/4/2020 5:38 AM
それは欲しいですね。 @escaping がいりそう
Avatar
あと extension Future where Failure == Never { init(execute: () async -> Value) { ... } } 現実的にはこれと↑の2つで
5:39 AM
完了とされるんじゃないか、と思います。
Avatar
omochimetaru 9/4/2020 5:39 AM
それで良いと思うなあ。
Avatar
あとは get() async throws -> Output か。
Avatar
Resultと違ってmap/flatMapの先が普通にPublisherになっちゃうんで
Avatar
omochimetaru 9/4/2020 5:40 AM
そうですね。Neverのときにthrowsなしのgetがほしいですね。
Avatar
Never のときは get() async -> Output
Avatar
get()をどの範囲まで生やすか、というのが難しそう
Avatar
omochimetaru 9/4/2020 5:40 AM
Resultに無いけど・・・
Avatar
しかし、それを言うならこのまえの Result のが。
Avatar
omochimetaru 9/4/2020 5:40 AM
まあResultは遅れてその後のSEで入れるとかなりそう。
Avatar
Resultと違ってmap/flatMapの先が普通にPublisherになっちゃうんで
これつらそう・・・。
Avatar
ぶっちゃけNeverとthrowsに関してはそこまで問題ではない、map/flatMapのが
Avatar
omochimetaru 9/4/2020 5:41 AM
それはCombine.Futureの話?
Avatar
そう
Avatar
omochimetaru 9/4/2020 5:41 AM
mapしたら要素数Nになるのw
5:41 AM
Combine.Futureはインチキだったのか
5:42 AM
RxSwift.SingleはmapしてもSingleなのに・・・
Avatar
single であることを表す protocol を導入して、 conditional comformance 使って解決する?
Avatar
omochimetaru 9/4/2020 5:43 AM
RxSwiftはzeroとzero or oneとoneが型になってるけどなかなか便利。
5:43 AM
Maybe型の zero or one は async awaitにキャンセルが追加されたような世界観で使える。
Avatar
singleというか、async compatibleなprotocolを用意して
Avatar
protocol Single: Publisher { ... } extension Future: Single { ... } extension Publishers.Map: Single where Upstream: Single { ... }
5:44 AM
みたいな。
Avatar
Futureがそれに適合、Map,FlatMapはUpstreamがそれに適合してれば…みたいに
5:44 AM
かなり広範囲で拡張が必要でしんどそうだな、と。
Avatar
omochimetaru 9/4/2020 5:45 AM
RxSwiftみたいにSingleは別で用意して、 asPublisher() で 通常のN個のストリームに切り替えでも良いのでは
Avatar
async で取り出せる get がないと辛いし、やっぱ専用の標準 Future ほしそう。
5:45 AM
Future なしで async/await 入って、オレオレ Future 乱立がありそうだな・・・。
Avatar
omochimetaru 9/4/2020 5:45 AM
まあそうやってがんばったextensionだと、暗黙変換(というか型が同じ)にできるのは便利だけども。
5:45 AM
antitypical/Result を思い出すw
Avatar
まー最初はオレオレFutureでバトロワさせて
5:48 AM
優勝したやつを採用!とかすれば、効率いいんじゃないですかね
5:48 AM
Resultと同じパターン
Avatar
FutureFailure を持たなくても、 extension<T> Future where Value == Result<T> { init(execute: @escaping () async throws -> T) { ... } } があれば良い?
Avatar
それはそうだと思いますよ
Future が Failure を持たなくても、
(edited)
Avatar
omochimetaru 9/4/2020 5:49 AM
mapがめんどくさくないですか?
Avatar
map も同様
Avatar
omochimetaru 9/4/2020 5:49 AM
同様だと、値としてResultを持ちたいFutureと
5:49 AM
値はTだけどエラーとともにあつかいたいFutureが混ざる
Avatar
mapに関しては、overloadの優先順位付けがもうちょいちゃんと書けるように慣れば
5:49 AM
解決する
Avatar
ってか、よく考えたらそんなこと PromiseK でやってたわ。その頃は Result じゃなくて Optional だったけど。
Avatar
omochimetaru 9/4/2020 5:50 AM
PromiseK でやってたわ
それ念頭にあって話してるのかと・・・
5:50 AM
a: Future<String, Error>b: Future<Result<String>, Never (edited)
5:51 AM
a.flatMap { Future.failure(err) }.map { print("出ない") } b.map { Result.failure(err) }.map { print("出る") } このへんが違うから。 (edited)
Avatar
うーん
5:52 AM
ネストしたモナドにおいて全部mapで表現しようとしてるからしんどくなるのであって
Avatar
mapMap とかにすれば良い?
Avatar
どのモナドまでmapするのかみたいなのが明示出来るようになる方が良さそうな気がしている
Avatar
omochimetaru 9/4/2020 5:53 AM
てか、こう言えば良いのか do { let a = try await foo() } catch { ... } do { let b: Result<String, Error> = await bar() } catch { ... } ↑この2つの違いに相当する (edited)
Avatar
例えばFeature<Result<T, E>>なら、
Avatar
でも、 Future<Result<T, E>>Future<T ,E> の気分で使いたいと考えたら、基本的にそういう挙動をするようにすればいいんじゃないのかなぁ。
Avatar
omochimetaru 9/4/2020 5:53 AM
async/awaitを使いつつ throw/tryはしないでResultを取り回したい時があって
5:54 AM
エラーを値として使いたくて、失敗フローにはしたくないとき
Avatar
foo.map { a: Result<T, E> in ... } foo.result.map { a: T in ... } こういう感じの書き方ができると
Avatar
omochimetaru 9/4/2020 5:54 AM
それをFutureで再現するには、Future自体にエラーコンセプトが要る。
Avatar
何重ネストしても任意のところで取り出せるようになるよね
Avatar
↓は? let b: Result<String, Error> = await Result { try await bar() }
Avatar
或いは第一引数に識別子入れるとクロージャの引数が合わせた型になるとか。
5:56 AM
foo.map(who: .future) { a: Result<T, E> in ... } foo.map(who: .result) { a: T in ... }
5:57 AM
こういう感じにしておくと、第三第四のモナドが出てきても安定して拡張していける、と思う。
5:57 AM
先に出した案のほうがネストして重ねまくっても対応出来るので良いかな〜という気はしているけど
5:57 AM
引数パターンのほうが使いやすそうではある。
Avatar
asyncthrows をちゃんと区別してくれたら、 FutureFuture<T, E> でいい気もします・・・。
Avatar
omochimetaru 9/4/2020 5:58 AM
let b: Result<String, Error> = await Result { try await bar() }
↑これどうなってるんです?なぜResult.initの中でawaitできる?
Avatar
FutureResult は主役ではなくて、 async/awaitthrows/try では解決できないコーナーケースをハンドリングするためのヘルパーなので。
5:59 AM
@omochimetaru reasync がついてる。
Avatar
omochimetaru 9/4/2020 5:59 AM
initをasyncにできるようにするってこと?
5:59 AM
うーん、まあ別にできてもいいか。
5:59 AM
init?もinit throwsもあるし。
Avatar
init(catching body: () throws -> Success) ↑の Result.init が↓に変わる。 init(catching body: () async throws -> Success) reasync
Avatar
出来なくてもinitじゃなくてstatic funcになるだけかと。
Avatar
omochimetaru 9/4/2020 6:00 AM
それはできるね > static func
Avatar
これ見てて思ったんだけど、明示的なPromiseやFutureを表に見せる方式のasync/awaitを採用してる場合、コンストラスタをasyncにすることができない? https://t.co/SxI1pvzemi
6:00 AM
コンストラクター内でasync/await使いたい時がちょくちょくあるけど、普通にasync無名関数即時実行で書けるのか( ´・‿・`) 見にくいような、ありなような、迷う🤔
6:01 AM
Swift の initasync 書けると思ってるんだけどどうなんだろう?
Avatar
omochimetaru 9/4/2020 6:01 AM
これどういうことですか?
6:01 AM
コンストラクタの呼び出しは、async関数投げっぱなしのまま戻ってきちゃうよね?
Avatar
JS みたいに Promise を基本として async/await を考えた場合、
6:01 AM
コンストラクタは Promise を返せないから async にできないけど、
6:02 AM
Swift みたいに PromiseFuture に基づかずに async/await を導入する場合、
6:02 AM
コンストラクタ/イニシャライザが async になれる。
Avatar
omochimetaru 9/4/2020 6:03 AM
まあそうですね
6:03 AM
なんか、表面的な話に思いますけど。
Avatar
この mono さんの書いてるのは async 付いてるのとは挙動は違うけど(待たずに返るので)。 (edited)
Avatar
omochimetaru 9/4/2020 6:04 AM
別にJSでもctorがasync付けられるように拡張してやることはできそう シンプルに仕様を積み上げていったら都合上できなくなっただけの話に思う。
6:04 AM
ですよね、待たずに返りますよね
6:04 AM
普通になしでは・・・
Avatar
いや、 mono さんがやりたかったのは単に待たずに返すので (edited)
Avatar
omochimetaru 9/4/2020 6:05 AM
@_mono オブジェクト生成に直接係わらないasync関数を呼びたい場合に有効、ってことですか?
@Cat_sushi そんな感じです。
6:05 AM
会話があった
6:05 AM
単純に外側がasyncじゃないからawaitが書けないということを言いたかっただけで
Avatar
それを見ながら別の話としてイニシャライザに async を付ける話を考えたということ。
Avatar
omochimetaru 9/4/2020 6:05 AM
非同期なオブジェクト初期化をしたいという話ではなかったのか。
Avatar
async コンストラクタができる言語ってあるのかな?
Avatar
omochimetaru 9/4/2020 6:06 AM
知る範囲では無いです
Avatar
C# とか Python とかどうなんだろう。
6:06 AM
Rust も確かできないんだっけ?
Avatar
omochimetaru 9/4/2020 6:06 AM
C#ではstatic funcでCreate関数つくろうねって
6:07 AM
ガイドラインがある
Avatar
API の意味合いが異なるのはわかるけど、 init(bigEndian:).bigEndian って挙動同じじゃない? https://developer.apple.com/documentation/swift/uint64/1539824-init https://developer.apple.com/documentation/swift/uint64/1538836-bigendian
Avatar
omochimetaru 9/7/2020 8:58 AM
挙動というのがデータ変換のことなら同じ処理ですね。
8:58 AM
意味は逆さまだと思います。
Avatar
意味は逆さまだけど、 @swift-5.2.5 let a: UInt64 = 1 print(a.bigEndian) print(UInt64(bigEndian: a))
Avatar
swift52 BOT 9/7/2020 9:00 AM
72057594037927936 72057594037927936
Avatar
結果はまったく同じになるよね。
9:01 AM
コードの意図で使い分けるだけで。
Avatar
omochimetaru 9/7/2020 9:01 AM
はい。 LE to BE と BE to LE は同じ処理です。
9:02 AM
ただ、だからといって、このAPIを .endianSwapped などにはしないほうが良いです
9:02 AM
なぜなら、ホスト環境を隠蔽できなくなるから。
9:03 AM
このAPI ( init LE from BE と convert LE to BE ) にしておけば、 もしホスト環境が BE になってても、同じコードで動きます。 ( init BE from BE と convert BE to BE になる )
Avatar
それは .bigEndian.littleEndian の話じゃない? (edited)
Avatar
omochimetaru 9/7/2020 9:05 AM
let a: UInt64 = 1 print(a.bigEndian) // aをLEだと思ってそのBE表現を得ているコード print(UInt64(bigEndian: a)) // aをBEだと思ってそのLE表現を得ているコード // ↑この2つが並んでるのは `a` の解釈が矛盾してるのでおかしい
9:06 AM
LE環境だったら.littleEndian は何もしない関数になるけど
9:06 AM
もしBE環境だったら、 .bigEndian が何もしない関数で、 .littleEngian がスワップする関数に切り替わりますね。
Avatar
.endianSwapped.bigEndian と同じじゃなくて、常にひっくり返すって意味やんね?
9:06 AM
それじゃだめで、 .bigEndian.littleEndian の二つは必要。
9:07 AM
でも、 init(bigEndian:)init(littleEndian:) はそれぞれ .bigEndian, .littleEndian と同じ挙動だから、コードの意図の表明以上の意味はないよね?という疑問。
Avatar
omochimetaru 9/7/2020 9:08 AM
そうです x3 (edited)
Avatar
つまり、実装は extension UInt64 { var bigEndian: UInt64 { UInt64(bigEndian: self) } } でも構わないわけだ。
Avatar
omochimetaru 9/7/2020 9:09 AM
そうですね。
Avatar
実際はそれぞれ実装されてたけど。
9:09 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 9/7/2020 9:09 AM
流石に意味的な可読性が最悪なので・・・
9:10 AM
@inlinable public var bigEndian: Self { #if _endian(big) return self #else return byteSwapped #endif }
Avatar
了解です。認識が合っててよかったです。ありがとう。 (edited)
Avatar
omochimetaru 9/7/2020 9:10 AM
_endian
↑こんなんあるんや
9:10 AM
裏技だ
9:12 AM
まあなんか例えば、 bitpatternに対してXORする暗号化方式があるときに
9:13 AM
encrypt関数とdecrypt関数が全く同じ実装になるのと 同じような話ですね
Avatar
2回前のわいわいで話した、SILInstruction::myTrap のケースが不十分説(https://speakerdeck.com/freddi/mayhavesideeffect?slide=40) いつか調べると言ってましたが、PR出したら本当にケースが不十分だったっぽい https://github.com/apple/swift/pull/33851 (edited)
👏 6
Avatar
https://github.com/apple/swift/pull/33932 #unavailable を追加するやつ (edited)
Implementation for an upcoming evolution proposal. apple/swift-evolution#1184 Swift evolution thread: https://forums.swift.org/t/support-negative-availability-literals/
Avatar
#available(*, unavailable) があるのに。
Avatar
あーいわれてみればたしかに
Avatar
let expectation = XCTestExpectation() var cancellables: [AnyCancellable] = [] observableObject.objectWillChange.sink { _ in expectation.fulfill() }.store(in: &cancellables) wait(for: [expectation], timeout: 3.0) みたいなコード書いてたけど、最適化を有効にしたら(おそらく)スコープの途中で cancellables が片付けられてしまって observableObject が発火しなくなってしまった。
Avatar
Kishikawa Katsumi 9/16/2020 2:47 AM
それ、最適化のせいだとするとコンパイラの不具合ですよね。
Avatar
うーん、使われないものは前倒しして解放されても良いというルールなら不具合とは言えないかもしれません。 (edited)
2:55 AM
↑のケースでは、仕方なくスコープの最後に(必要なテストを行った後で) cancel を呼び出すことで解放されなくなりました。
Avatar
Kishikawa Katsumi 9/16/2020 2:56 AM
ちなみにstoreを無くして戻り値として受けるとどうなりますか?
2:56 AM
cancelを呼ばないと消える?
Avatar
お、消えませんね。
2:58 AM
cancel を呼びやすいように元々 store をなくして戻り値で受けてたんですが、 cancel を消しても(未使用警告は出ますが)購読解除はされませんでした。
2:59 AM
store に戻した上で
2:59 AM
cancellables.forEach { $0.cancel() }
2:59 AM
を最後に実行しても購読解除されなかったので、最適化で早期リリースされてるのは間違ってないんじゃないかと思います。
3:00 AM
戻り値で受けたときに早期リリースされないのは単なる最適化の実装の問題で、 store で最適化されるなら戻り値で受けた場合も最適化され得るものとして、末尾 cancel するのが良さそうに思います。
Avatar
Kishikawa Katsumi 9/16/2020 3:01 AM
ローカル変数が最適化でスコープの途中で消えるのは正しい、、、のかなあ、と気になっています。
Avatar
store のときの挙動が最適化のバグの可能性もあると思います。
3:03 AM
それが確定して修正されればいいんですが、現時点でははっきりしないので、仕様の可能性もある前提で対処することになりそうです・・・。
Avatar
これはwithExtendedLifetimeを使うのが正しそう
3:54 AM
「使われないものはどこで解放しても良い」の命題は真なので
Avatar
Kishikawa Katsumi 9/16/2020 3:56 AM
そういえばそんなのありましたね > withExtendedLifetime
Avatar
そのための関数ですね。Discordに登場するのはこれで3回目だ
Avatar
Kishikawa Katsumi 9/16/2020 3:56 AM
とはいえ、 >「使われないものはどこで解放しても良い」の命題は真なので これの判定はそれほど自明じゃないと思いますよ
Avatar
うーーーん
3:57 AM
むしろwithExtendedLifetimeという関数が存在することが、命題が真であることの裏付けであると言える気がしていて
Avatar
Kishikawa Katsumi 9/16/2020 3:57 AM
いや、でもレキシカルに使われてないように見えたら消してもいい、のルールの方が自明とも言えるか。
Avatar
スコープの途中で消えない仕様ならそんな関数要らないので。
Avatar
Kishikawa Katsumi 9/16/2020 3:58 AM
それでいい気がしてきました。
Avatar
最適化したら消えるようになる、と言うのは、省メモリを最適化の目的に置くなら(当然置かれるわけですが)割と合理的な気はしますし (edited)
Avatar
Kishikawa Katsumi 9/16/2020 4:00 AM
まあコンパイラなりStatic Analyzerなりが教えてくれないと事故が起こりそうなやつですね。
Avatar
宣言した変数が一切参照されてない場合は、warningは出ると思います (edited)
Avatar
Kishikawa Katsumi 9/16/2020 4:05 AM
さっきの例で戻り値で使ってない場合はそうなんですけど、 var cancellables: [AnyCancellable] = [] observableObject.objectWillChange.sink { _ in expectation.fulfill() }.store(in: &cancellables) このinoutに渡した例だと何もでない、ですよね?
Avatar
確かにー
Avatar
Kishikawa Katsumi 9/16/2020 4:05 AM
で、消えるのはこっちなんですよね。。。
Avatar
まあなんか非同期テストのIFがもうちょいなんとかなってくれや、と言う話な気はしますね
4:06 AM
exp作ってwait([exp])やって、と言うのがモダンではないしスコープも人間が管理するにしては難しい
4:06 AM
nimbleとか使いたくなる気持ちがとてもわかる
Avatar
Kishikawa Katsumi 9/16/2020 4:06 AM
確かによく考えたらこれ非同期を待ってるから、そもそも一回スコープを出ているのか。。。?
Avatar
出てはないですね。waitで止まるので
Avatar
Kishikawa Katsumi 9/16/2020 4:07 AM
いや、出てないよね。
Avatar
swiftというかObjCの場合は、runloopがあるのでスレッドを含めた話だともうちょいややこしくなるけど
Avatar
Kishikawa Katsumi 9/16/2020 4:07 AM
async/awaitが必要なんだな。Test Frameworkの方に先に入れる、とか良さそうじゃないかしら。
Avatar
swiftならもっとまともなIFは用意できるはずなので公式に出して欲しいなぁ
4:08 AM
async/awaitだと遥かにマシになるのはそうなんですが
4:08 AM
observableObjectはasyncの枠に収まってないので
4:09 AM
結局同じ問題は起きそう
Avatar
Kishikawa Katsumi 9/16/2020 4:10 AM
あ、おっしゃる通りですね。。。この例については解決しない。
4:12 AM
wait(for: [expectation は要するにPromiseだからAsync/Await的な書き方にできそうだな。
Avatar
tsのjestとか見てると出来てますね
Avatar
Kishikawa Katsumi 9/16/2020 4:14 AM
へえ。勉強しよう。
Avatar
2パターンあって、中に宣言する関数が全てasyncなら、test関数そのものをasyncにしてしまえばOKで、 コールバックを含めた処理がある場合は、test関数の第一引数にテスト完了を通達するクロージャが渡ってきて、それを呼ぶ事でテストが完了する
4:16 AM
こういう作りにしておくと上手くいきます。いまのXCTestCaseは引数無しなんで、実現出来ない。
Avatar
Kishikawa Katsumi 9/16/2020 4:18 AM
test関数そのものをasyncにしてしまえばOK
わかる。
test関数の第一引数にテスト完了を通達するクロージャが渡
かしこい。 つまりtest関数が最初から非同期処理を考慮した作りになってるんですね。
Avatar
そうです。tsはベースが動的型付言語で、引数の数が合わなくてもなんとかなる(=省略して書いてもok)なので、上記の条件が満たされたいれば、同期的なテストもそのままでOKになってる感がありますね。 内部的に高効率にオーバーロードしてるのかは調べてないですが。 (edited)
Avatar
Kishikawa Katsumi 9/16/2020 4:30 AM
TypeScriptはそのJavaScriptの性質のためにオーバーロードはあまり得意じゃないんじゃなかったかしら。 Testing Frameworkみたいなプロダクションに載らないのは分けてメンテする、みたいにならないかな。 別の依存関係がただ同梱されている、みたいな。
Avatar
コールバックを含めた処理がある場合は、test関数の第一引数にテスト完了を通達するクロージャが渡ってきて、それを呼ぶ事でテストが完了する
これってタイムアウトどうなってるんですか?
4:31 AM
completionを呼ばなければずっと完了しない?
Avatar
jestって、testメソッドの宣言ではなく、スコープ内でtest関数をコールしてその中に処理を書くスタイルなんですよね
4:31 AM
なのでtest関数にタイムアウトを渡すことができる
4:32 AM
nimbleと一緒です
Avatar
あーなるほど、そのコンテキスト自体にタイムアウトの設定が渡せるのか。
Avatar
ですです
4:34 AM
IDEとXCTestが密結合してるせいでnimble使っても微妙な感じになりやすいのがなー。そういえば
4:34 AM
XCTest周りはXcode12で色々変わってませんでしたっけ
4:34 AM
カスタムできるようになってると嬉しいですね
Avatar
Kishikawa Katsumi 9/16/2020 4:36 AM
あまりちゃんとみてないけどStoreKitとか今までテストしようがなかったものがテストできるようになった、とかは良い変更ですね。
Avatar
いつかその辺りのインテグレーションもカスタムできるようになるのかなぁ…?
4:37 AM
あれ、でもこのcompletionクロージャのパターンでも一旦スコープ抜けるから購読は解除されるんじゃないですか?
4:38 AM
RxJSのObservableをテストするときはどういうことになってるんだろう
Avatar
jsはガベコレだから無意識に循環参照作って解決したりしてそう
Avatar
ああそうかarcじゃないか
Avatar
swiftだとリテイン用のコンテナ渡さないといけなさそうですね
4:40 AM
理想的にはテスト用のコンテキストを渡すようになってるといいのか
Avatar
[AnyCancellable]を inoutで渡せば良いのかな
Avatar
完了の通達とか完了までリテインカウント増やしてくれるための参照とか
4:40 AM
そういうのが必要なはず、でも今時点では整ってないから、使う側で事故ってる (edited)
4:41 AM
AnyCancellableは今回のコンテキストではその通りですが、一般的に任意の参照を取りたくなるはずなので (edited)
4:41 AM
Anyで良さそう
Avatar
func XCTAsync<Context>(_ context: Context, timeout: TimeInterval = 3.0, _ body: (inout Context, () -> Void) -> Void) { var context = context let expectation = XCTestExpectation() withExtendedLifetime(context) { body(&context, expectation.fulfill) wait(for: [expectation], timeout: timeout) } } (edited)
4:46 AM
こんな感じかな
Avatar
💮っぽい
4:47 AM
contextが後から決まる事の方が多そうなのでOptionalの方が良いのかなとか考えたけど
4:47 AM
そうすると型推論がはちゃめちゃになるから微妙か
Avatar
しばらくこれ使ってみよう
Avatar
withExtendedLifetime、どっちかというとクロージャー内で宣言された全ての変数のライフタイムを管理してほしいとか思ったんだが無理筋だなー
4:52 AM
FunctionBuilderで何とかなったりしないかなとか思ったけど1行ずつスコープ抜けるから無理か…
Avatar
autoreleasepoolのリリースしないバージョンみたいな
Avatar
そうそう
Avatar
Kishikawa Katsumi 9/16/2020 5:04 AM
文字通りAutoReleasePoolをリリースしなければいけそう、だけどSwiftだと専用クロージャになってしまったからダメだな。 (edited)
Avatar
norio_nomura 9/17/2020 1:14 AM
swift OSS Toolchain macOS版のシンボルインストーラのダウンロードが2048MBで止まってしまう問題、半年近く経っても直らない… https://bugs.swift.org/browse/SR-12405
Avatar
CDNの問題?
Avatar
norio_nomura 9/17/2020 2:10 AM
CDN使ってるのかな?swift.orgから直接ダウンロードしている様に見える。
Avatar
> GET /builds/swift-5.2.1-release/xcode/swift-5.2.1-RELEASE/swift-5.2.1-RELEASE-osx-symbols.pkg HTTP/1.1 > Host: swift.org > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 200 OK < Connection: close < Proxy-Connection: close < Via: HTTP/1.1 localhost.localdomain (IBM-PROXY-WTE) < Date: Thu, 17 Sep 2020 05:51:35 GMT < Server: Apache < X-Frame-Options: SAMEORIGIN < Strict-Transport-Security: max-age=15768000;includeSubDomains < Last-Modified: Mon, 30 Mar 2020 11:10:20 GMT < Accept-Ranges: bytes < Content-Length: 3305608957 < Content-Type: application/vnd.apple.installer+xml
5:51 AM
IBM-PROXY-WTE とは
5:53 AM
swift.org は 169.47.73.10 に解決されて、
5:53 AM
# whois.ripe.net inetnum: 169.47.73.0 - 169.47.73.31 netname: NETBLK-SOFTLAYER-RIPE-CUST-MS43377-RIPE descr: IBM - Open Technology and Cloud Performance
5:53 AM
なんですよね
5:53 AM
IBM?
Avatar
https://swift.org/blog/swift-on-windows/ Win32 API のラッパーUIライブラリとかも作ってたんですねー
Avatar
Kishikawa Katsumi 9/22/2020 9:09 PM
サンプルがGUIアプリやぞ⁉️っと思って見に行ったらWin32 APIをSwiftから呼べるようにラップしとった。 すごい作業だなあ。
Avatar
私もちょっと前に Swift on Windows 試してみたんですが、Swift から Win32 API を呼び出すのなかなか新鮮な体験で面白かったです https://github.com/rinsuki-lab/win32-hello-world-in-swift/blob/master/hello-world.swift
Win32 Hello world in Swift! Contribute to rinsuki-lab/win32-hello-world-in-swift development by creating an account on GitHub.
😄 1
Avatar
Win32...
Avatar
omochimetaru 9/23/2020 7:03 AM
Win32は不死身
Avatar
compnerdの尽力すごい... すごいけど...
7:03 AM
すごいけど... なんかsingle point of failureな気持ち
Avatar
omochimetaru 9/23/2020 7:03 AM
ドットネット系は接続しづらいからなあ。
Avatar
win32辛すぎる
7:03 AM
Microsoftが本腰いれてとかならあれだけど。
Avatar
omochimetaru 9/23/2020 7:05 AM
業務で使うんだと、C#/XAMLでGUIだけ作って、Swiftで作ったコアにつなぐみたいな感じのほうが現実的そう
Avatar
Corelib FoundationのコードみてからmacOS以外で実用するのが怖くなった感ある
Avatar
omochimetaru 9/23/2020 7:07 AM
正式リリースされたし大丈夫・・・
Avatar
Foundationのソースみたら多分macOSも使えなくなるかも
Avatar
omochimetaru 9/23/2020 7:07 AM
ww
Avatar
(diassembleした限りやばいのがちらほら...)
7:08 AM
(UIKitも動いてるからま、いいのかな...)
Avatar
compnerdさんがSwift on Winモチベ無くなった時にどうなるんだろう 🤔
Avatar
それ怖い
Avatar
omochimetaru 9/23/2020 7:08 AM
一応Google Brainに転職したぐらいだし
7:08 AM
モチベは過去最高なのでは
Avatar
CI なくなるとか
Avatar
omochimetaru 9/23/2020 7:08 AM
これまでは趣味だったわけだし。
Avatar
そうそうCIとかインフラが個人に依存してるのがちょっと怖い
Avatar
omochimetaru 9/23/2020 7:09 AM
Google Brainは S4TF を広めるために Windows サポートは必須でしょって方向だと思う。
7:09 AM
エネルギーおばけのcompnerdさんがやる気なくすよりも、 Googleが Swift for TensorFlow 諦める可能性のほうが高そうで怖い。
Avatar
うーんたしかに
Avatar
omochimetaru 9/23/2020 7:10 AM
Googleは結構巨大プロジェクトしばらくやってやっぱ無理ポイーすることある
7:11 AM
Windowsサポートが出たわけだし、次のTFサミットでどうなるかだと思う・・・
Avatar
どっかパブリックな場でgoogle canonical languageにSwift追加しました、とか出てきたらオッてなりそう
Avatar
omochimetaru 9/23/2020 7:52 AM
FlutterをSwiftにしてほしい。
Avatar
わかる(iOSDCの雑談でもその話した)
7:53 AM
kotlin/swiftどっちかなら間違いなく覇権でしたね〜って
Avatar
omochimetaru 9/23/2020 7:54 AM
わかる
Avatar
わかる
Avatar
tsでも覇権になってたかも知らん
7:55 AM
兎角プレイヤー人口の多い言語ならね
Avatar
omochimetaru 9/23/2020 7:56 AM
ああ〜。
Avatar
わかる
8:00 AM
D... D...
Avatar
omochimetaru 9/23/2020 8:04 AM
Dartが言語としてどうなのかはしらんけどわざわざ新しく学ぶハードルはありますねえ
Avatar
語弊はあるかもしれないけれど、一度死んだ言語だったという印象がある
8:05 AM
それが蘇ったと。
Avatar
omochimetaru 9/23/2020 8:05 AM
Chromeにネイティブで載せようとしてましたね
8:05 AM
そのへんが流れたから死んだ感はあるけど
8:06 AM
言語仕様というよりウェブ哲学の関係で駄目だったと思うしDart2.0でいろいろ変わってるからまあそこは関係ないはず
8:06 AM
そのせいで印象が悪いというのはありそう。
Avatar
Googleのチーム政治とか関わってそうで怖い。知らんけど。
Avatar
omochimetaru 9/23/2020 8:08 AM
Flutterエンジン自体が根っこは小さなchromiumみたいな話があって
8:08 AM
思想的に継承されたプロジェクトな気がしてる
Avatar
KotlinがGoogleのじゃないことも影響してそう
😞 3
Avatar
omochimetaru 9/23/2020 8:25 AM
時系列的にAndroid開発にKotlin推奨するよりも前じゃなかったっけ
Avatar
同じような時期だったきが。
8:27 AM
言語として登場したのは。
Avatar
omochimetaru 9/23/2020 8:27 AM
ふむ
Avatar
Kishikawa Katsumi 9/23/2020 3:17 PM
https://medium.com/flutter/announcing-flutter-windows-alpha-33982cd0f433 FlutterもWindowsサポートに投資してるっぽいし、ここが最後の決め手になるのかもしれませんね。 ただデスクトップはWebとの競争があるけど。。。
Native Windows app compilation, some early plugins, and a desktop-ready Flutter Gallery app
Avatar
Kishikawa Katsumi 9/26/2020 9:52 AM
Online Playgroundにシェア機能(パーマリンク)つけた https://swift-playground.kishikawakatsumi.com/eg3me6bkn5g55bdetc3eipcnue ^ Swiftのバージョンとコードが一意のURLで保存されてるのでコードを共有できる。
Avatar
yutailang0119 9/26/2020 9:53 AM
gist読んでくれるの神機能
Avatar
ogp画像まで付いてる 🙄
Avatar
Kishikawa Katsumi 9/26/2020 9:55 AM
Gistから取れるの https://carbon.now.sh/ から拝借したアイデア。OGPも https://carbon.now.sh/ で作られています。
Carbon is the easiest way to create and share beautiful images of your source code.
9:55 AM
あとは適当にID発行してFirestoreにコードとSwiftバージョンを保存しているだけ。
9:59 AM
OGPはデータで返すのはダメっぽいのでパーマリンクに .png を付けたら画像が返るようになっていて、それをOGPのURLにしたHTMLを返している。
Avatar
Kishikawa Katsumi 9/26/2020 12:03 PM
iframeで埋め込みできるようにしたいな。そしてブログ記事には抜粋を載せておいて、完全な実行できるコードはこちら、みたいにしたい。
Avatar
pod try 的なパッケージをサクッと試せる環境がオンラインで作れると嬉しそうですね
Avatar
Kishikawa Katsumi 9/26/2020 12:31 PM
それやりたい。 Swift Package Registry Serviceが導入されたら簡単になるかなあ。
Avatar
Hello! Last June, Apple and GitHub announced that the GitHub Package Registry will support Swift packages. A few months ago, Bryan Clark started a thread to gather ideas about a standard package registry API that could be implemented by anyone, not only GitHub. Over the past...
12:57 PM
そういえばGo PlaygroundもRust Playgroundも基本外部ライブラリを使えないようになってるんですけど、任意のライブラリを入れられるようにするのはやっぱりまずいんですかね。
Avatar
コピペして突っ込めるから問題なさそうな気がする
Avatar
そんな気もするんですけどねー
Avatar
Kishikawa Katsumi 9/26/2020 1:05 PM
別に問題ないと思うよ。実行はサンドボックスだし。
1:07 PM
私はUIが難しくなって、あまり広くは使われなさそうと思ってたけど、動くドキュメントとして使うぶんにはURLやリクエストパラメータで設定できるからそこをサポートするだけで便利かも。
Avatar
That’s always a possibility, but I’ve yet to come up with or hear a workable solution that doesn’t cost lots of money or expose a service for abuse. Right now, all the crates are precompiled so that when you click the run button, only your entered code needs to be compiled. A...
1:27 PM
That’s always a possibility, but I’ve yet to come up with or hear a workable solution that doesn’t cost lots of money or expose a service for abuse.
Avatar
omochimetaru 9/26/2020 1:28 PM
コスト
Avatar
サービスの乱用
1:32 PM
コンテナからホストにアクセスする脆弱性がない限り大丈夫そう
Avatar
Kishikawa Katsumi 9/26/2020 4:00 PM
もうちょっと大掛かりなやつだけどRepl.itはJSとPythonはライブラリを突っ込める仕組みが用意されてた https://docs.repl.it/repls/packages JSで試したけどサイドバーからパッケージ検索できて検索結果をインストールできるみたいな感じ。VSCodeのエクステンションのインストールのUIに近い。
Avatar
Kishikawa Katsumi 9/28/2020 10:31 PM
10:34 PM
WebのPlaygroundでSourceKit-LSPのAuto Completeが出せるようになった。 だいぶ遅いけどチューニングすればもうちょい速度でそう。 まあこういう速度だと分かって使うぶんには便利なはず。iPadみたいなそもそもまともな補完が不可能なデバイスからちょっと書きたいとか。 (edited)
👀 1
10:35 PM
https://swiftfiddle.com/ で試せる。
SwiftFiddle is an online playground for creating, sharing and embedding Swift fiddles (little Swift programs that run directly in your browser).
Avatar
omochimetaru 9/29/2020 4:31 AM
おー!
4:32 AM
サーバー側でサービス立てて、jsのカーソル位置とか自力で通信を中継してるんですか?
Avatar
Kishikawa Katsumi 9/29/2020 4:34 AM
そうです。SourceKit-LSPとやりとりするのはVaporで作ったAPIサーバで、Node.jsのWebアプリからそれとローカルで通信します。 カーソルの情報とかトリガーはブラウザから送られるので、まあ多少時間かかりますね。
Avatar
omochimetaru 9/29/2020 4:38 AM
IDEサービス使いこなしてて良いですねえ でもサーバー側のCPUコスト課金が心配になる
Avatar
Kishikawa Katsumi 9/29/2020 4:41 AM
今のところ同じところにデプロイしているので変わってないんですけど(500/月)、ちょっといろいろ便利にしようという気になってきたので、性能をちょっとあげようかなと思っています。 ドメインも取った。
Avatar
omochimetaru 9/29/2020 4:46 AM
いいですねえ
Avatar
Kishikawa Katsumi 9/29/2020 4:46 AM
Vaporはめっちゃ簡単でよくできていた。 ただCtrl+Cで終了しなかったり、プロセスが残ったりする(後者はSwiftのせいかも?)とか、 コード変わってないのに swift run すると30個くらいのファイルがコンパイルされたりするのがよくわからない。
Avatar
omochimetaru 9/29/2020 4:47 AM
うーんなんだろう?Vaporやってるけどその辺は心当たりなし
Avatar
C-cで終了しないのは、何らかのthreadが残ってるから?
4:50 AM
swift runでいっぱいコンパイルされるのはmtimeが変わってしまうなにかが動いてるとか。
Avatar
Kishikawa Katsumi 9/29/2020 4:50 AM
あ、勝手にSourceKit-LSPのプロセスを実行してるからですか?
Avatar
fork(2)ですか?
Avatar
Kishikawa Katsumi 9/29/2020 4:51 AM
Foundation.Processですね。forkかどうかはよくわからないです。。
Avatar
omochimetaru 9/29/2020 4:51 AM
vaporがC-cを自前でハンドルしてるとしたら、そっちのプロセスにはシグナルが飛んでなさそう
Avatar
fork(2)してexecev(2)が普通ですが
4:52 AM
pidをwaitしないとゾンビ化すると思う
Avatar
Kishikawa Katsumi 9/29/2020 4:52 AM
直せそうな気がしてきました🙏🏻
Avatar
システムとしては、プロセスの管理は自前でやるより、macosなら、launchd(1)とかsystemdとかに任せる方が良いと思います
Avatar
omochimetaru 9/29/2020 4:54 AM
SourceKit-LSPとvaporとnodejsをそれぞれdockerに閉じ込めてdocker-composeで管理するとか。
Avatar
全部おなじコンテナでもいいと思うけれど。
Avatar
Kishikawa Katsumi 9/29/2020 4:55 AM
デプロイ先はLinuxですね。 SourceKit-LSPのバインディングがProcessクラスのインスタンスをセットする作りになってるんですよね。。
Avatar
へー。
Avatar
Kishikawa Katsumi 9/29/2020 4:56 AM
あ、Processは不要でした。file descriptorでよかったです。
Avatar
omochimetaru 9/29/2020 4:57 AM
じゃあソケットにもできそうですね。
Avatar
ですね
4:57 AM
時代は疎結合
4:57 AM
きみのことは知らないし、面倒みない!
Avatar
omochimetaru 9/29/2020 4:58 AM
launchdとかsystemdとかよくわからない、docker-compose.ymlのほうが簡単・・・
Avatar
pid1問題だけ気を付けれていれば
Avatar
Kishikawa Katsumi 9/29/2020 4:58 AM
どうもありがとうございます。 この問題のせいで、Pushして再デプロイするときにポートが開放されないままだったりという症状が起こったりして、 デプロイが自動化できなかったんですよね。
Avatar
それでもいい
4:59 AM
launchdしらないとmacosでサバイブできない
☠️ 1
Avatar
Kishikawa Katsumi 9/29/2020 5:00 AM
LaunchdはCronとしての使い方しかしたことないですね。。
Avatar
priviledge とるのにlaunchdのサービス書かないとダメなんですよねー。macos。
Avatar
omochimetaru 9/29/2020 5:01 AM
へ〜
5:02 AM
なんかこのへん
5:04 AM
privileged helperをlaunchdで起動してそいつと通信してなんかしてて的なそんな感じ
5:04 AM
sandboxでは必須だった気がする
Avatar
Kishikawa Katsumi 9/29/2020 12:34 PM
Vaporちょっと触ってみて、クライアントからサーバサイドまで全部同じデータ型の利点はなんとなくわかった気がする。
12:36 PM
レスポンスで返すにはCodableとは似て非なる型に適合する必要がなぜなのか若干よくわからない。
Avatar
Content protocol ですね、あれは、 Codable + ContentType です。
12:58 PM
HTTPの。 application/json とか。
12:58 PM
デフォルトのContent-Typeをその型に与えてるだけで、直接指定もできる。
Avatar
そこ型ごとに決まるのか
Avatar
指定しなかった場合のデフォルトだからあんまり気にする必要もないけどね
Avatar
Content-Typeはエンコーダと対応して欲しい感覚があるけど、型で指定できた方が嬉しい場面があるのかな
1:01 PM
デフォルトで決まるのはあくまでエンコーダで、それに対応するContent-Typeがデフォルトで挿入される、みたいな。
Avatar
omochimetaru 9/29/2020 1:01 PM
JSONしか使ってないから何も感じてない 要らないしくみな気がする (edited)
Avatar
Kishikawa Katsumi 9/29/2020 1:01 PM
なるほど。 Asoc Typeがオプショナルなとき?にその型はCodableなんだけどそのままContentにできなかった。
Avatar
omochimetaru 9/29/2020 1:02 PM
ただデフォルト extensionでJSONが入ってくるから必要になったらつけてる
Avatar
Kishikawa Katsumi 9/29/2020 1:02 PM
Conditional Conformで解決できるらしいけどわからなかった。
Avatar
JSONしか使わない なるほど
Avatar
omochimetaru 9/29/2020 1:03 PM
extension Optional: Content where Wrapped == その型 { ... } かな?
1:04 PM
デフォルトで決まるのはあくまでエンコーダで
なんかContentEncoderってオブジェクトも介在していた気がする
Avatar
Kishikawa Katsumi 9/29/2020 1:04 PM
なんかそのあとencodeなんとかの実装を求められた気がします。後でもう一度やってみます。 (edited)
Avatar
omochimetaru 9/29/2020 1:04 PM
あ、それはそうですね。 encodeinit(from decoder) は手書きになるはず
1:05 PM
その型自体がCodableなんで singleValueContainer で出し入れすればいいけど (edited)
Avatar
さすがにそれは自動実装してくれないか
Avatar
omochimetaru 9/29/2020 1:05 PM
あいや、 Codable はそもそも
1:05 PM
conditional conform されてるか?
1:05 PM
Optionalってどうだったっけ。
Avatar
Kishikawa Katsumi 9/29/2020 1:06 PM
その必要だと言われるencodeなんとかはCodableのじゃなかった気がするんですよね。 リクエストオブジェクトがパラメータで渡るやつだった気がする。
Avatar
omochimetaru 9/29/2020 1:07 PM
💧 A server-side Swift web framework. Contribute to vapor/vapor development by creating an account on GitHub.
1:07 PM
extension Dictionary: Content, ResponseEncodable, RequestDecodable where Key == String, Value: Content { public static var defaultContentType: HTTPMediaType { return .json } }
1:07 PM
↑defaultContentTypeが必要だったのかも。
Avatar
Kishikawa Katsumi 9/29/2020 1:07 PM
なるほど。
Avatar
omochimetaru 9/29/2020 1:08 PM
extension Content { public static var defaultContentType: HTTPMediaType { return .json } ↑これ自動で入らないのかな・・・
1:08 PM
Conditional Conform するとき、そのrequirementsがdefaultをもってても自動注入されない? (edited)
Avatar
Kishikawa Katsumi 9/29/2020 1:08 PM
ビューを返すタイプのサービスはよく分からないけどAPIを作るのは全然Vaporでいけるな。
Avatar
omochimetaru 9/29/2020 1:09 PM
@swift-5.3.3 protocol P { func p() -> Int } struct S<T> {} extension P { func p() -> Int { 1 } } extension S : P where T == Int {}
Avatar
no output
Avatar
omochimetaru 9/29/2020 1:10 PM
されてるな? う~ん?
1:10 PM
ビューを返すタイプのサービス
Vaporが採用してるテンプレートエンジンのLeafってやつがあるんですけど
(edited)
1:10 PM
これは全然イケてないので
1:11 PM
FunctionBuilderでHTMLレンダラを自作するか、ライブラリを探して来ると良いと思います。
Avatar
Kishikawa Katsumi 9/29/2020 1:12 PM
FunctionBuilderでHTMLを書くのは絶対にツラいと確信してるけど、やってみたら変わるかもしれないな。。。
Avatar
omochimetaru 9/29/2020 1:12 PM
既存のHTMLから機械変換できるツールはほしいですね。
1:13 PM
今回は僕はサーバはJSON埋め込んだ固定の出力にして、JS側のReactをテンプレートの代わりに使ってます。
Avatar
Kishikawa Katsumi 9/29/2020 1:14 PM
それはめっちゃいいと思う。 JSX?
Avatar
omochimetaru 9/29/2020 1:14 PM
ですね。TypeScriptなんでtsx
1:14 PM
これがよいのは
1:14 PM
webpack-dev-serverで、tsxだけライブでプレビューできるので
1:14 PM
XIBの見た目をInterfacebuilderで確認しながら作るようなノリで
Avatar
Kishikawa Katsumi 9/29/2020 1:14 PM
あ、そういうのもあるんすね。JSXはFacebookの執念を感じるすばらしいものです。
Avatar
omochimetaru 9/29/2020 1:15 PM
TypeScriptでViewを作って
1:15 PM
最後にSwiftからパラメータを渡してアプリにつなぎこむ感じに作業が進められる。
1:16 PM
TypeScriptだとJSX中の式展開が型検査されるから変数名のtypoとか防げるのがいいっすね。
Avatar
Kishikawa Katsumi 9/29/2020 1:17 PM
それはいい体験だな。HTMLに変数をなんかするやつで出合う問題のほとんど解決されそう。
1:17 PM
TSXはすごいな。
Avatar
omochimetaru 9/29/2020 1:18 PM
そうなんですよね。
Avatar
Kishikawa Katsumi 9/29/2020 1:18 PM
ただちょっとSvelteも気になってるんすよね。
Avatar
omochimetaru 9/29/2020 1:19 PM
Svelte最近聞きますね、まだ学んでないからよくわからないけど
1:19 PM
<script> const persons = [ { name: 'Alice' }, { name: 'Bob'}, { name: 'Carol' } ]; </script> <main> {#each persons as p} <div>{p.name}</div> {/each} </main> <style> </style>
1:20 PM
xml風の文法でコードが埋め込みなのか。
1:21 PM
TSXだとvisual studio codeが常に構文チェックしてくれるのがいいんだけど、svelteはそういうツーリングはいけてるんだろうか?
Avatar
Kishikawa Katsumi 9/29/2020 1:22 PM
知り合いの人がめっちゃ気に入ってて2時間くらい教えてくれるYouTubeがあってそれを少しずつみてる。型チェックがあるかはまだわからない。 埋め込んだ変数がリアクティブなのは最初のほうで見た。
Avatar
omochimetaru 9/29/2020 1:23 PM
ほお~ 落ち着いたら調べてみようかな。
1:24 PM
どっちかというとVapor環境の開発環境にReactを直接統合したいんだよな、漠然としたイメージしかないけど・・・
Avatar
Kishikawa Katsumi 9/29/2020 1:25 PM
そういうことだと全部SwiftでSSRのほうがいいのかも?
Avatar
omochimetaru 9/29/2020 1:26 PM
そういうことになるよなあ
1:26 PM
でもpostしないでブラウザ上でロジック動かしたい場面は多少は出てくるので・・・
1:26 PM
Swift for WASMが必要になってくる。
Avatar
Blazorってやつがそういう体験を実現してくれそう?
1:28 PM
MSがツーリング周りも気合い入れて頑張ってるっぽい
Avatar
omochimetaru 9/29/2020 1:29 PM
へえ~  新しいザマリン
Avatar
Kishikawa Katsumi 9/29/2020 1:52 PM
いつの間にかめっちゃわかりやすくなってた。
Avatar
svelteはtypescript導入中だった気がする
2:27 PM
まだなので型はない
2:27 PM
priorityは高くやってた…気がする…
2:27 PM
と思ったら7月に対応してた (edited)
😆 1
Avatar
「ある型から自信の型への変換が可能である」を表現するプロトコルのネーミングをどうしようか悩んでいるんですが、良い例あったりしますか?具体的には「JavaScriptの値からSwiftの型へ変換可能である」を表現するプロトコルについて考えています。 今は JSValueConstructible という名前にしているんですが、JS value to Swift value なのかSwift value to JS valueなのかわかりにくくてリネームしたい。
3:52 AM
ExpressibleByXXX っていう案も出たんですが、標準ライブラリ内だとリテラル絡みでしか使われていないのでどうなのかな、と。 (edited)
Avatar
Kishikawa Katsumi 9/30/2020 3:54 AM
インターフェースはどうなってますか?
Avatar
Swift framework to interact with JavaScript through WebAssembly. - swiftwasm/JavaScriptKit
3:55 AM
static funcの代わりにinitに変更するほうが良いかなとも思ってます
Avatar
Kishikawa Katsumi 9/30/2020 3:56 AM
変換先のSwiftの型の方に実装するんすね。
Avatar
そうですね. JSValue -> Selfの変換をSelfの型に実装する形です (edited)
Avatar
Kishikawa Katsumi 9/30/2020 4:03 AM
〜ConvertibleかBridgeableを最初思いついたけど、既存の使われ方だとそれは変換元に実装する感じっぽいですよね。
4:03 AM
とするとJSValueAcceptableみたいな感じになりそうだけど、名前はもっと良いのがありそう
Avatar
CustomStringConvertible とかを考えるとConvertibleは Self -> Valueなのかなーと思って今の使い方になってますね
Avatar
Kishikawa Katsumi 9/30/2020 4:05 AM
SwiftTypeTransformable
Avatar
BridgableObjectiveCBridgeable を見るとSelf -> Value と Value -> Selfのペアになっていて微妙にマッチしない
4:06 AM
なるほど変換先の名前で記述する
Avatar
Kishikawa Katsumi 9/30/2020 4:06 AM
なんか違うな
4:07 AM
extension Bool: SwiftTypeTransformable ってみたときに違和感がある気がする
4:07 AM
いや、いけるか?難しいな。
Avatar
うーん、この違和感は何なんだろう
4:07 AM
SwiftコードにSwiftっていう名前があるのが気になるのかな
Avatar
Kishikawa Katsumi 9/30/2020 4:08 AM
extension Bool: JSValueTransformable こっちの方がわかる。とすると元の名前でも良さそうだけど。
4:10 AM
extension Bool: JSValueConvertible extension Bool: JSValueBridgeable これは明らかにto JSValueに見える。 SwiftConvertibleはSwift Type側につけるともう意味不明。だから却下でいいかな。
Avatar
あとはInとOutを明確にするためにConstructibleFromJSValueみたいな?
Avatar
Kishikawa Katsumi 9/30/2020 4:12 AM
それいいんじゃないですかね。
4:12 AM
extension Bool: ConstructibleFromJSValue わかりやすい。自然。
Avatar
Constructibleが引っかかる気もするんですが良い語が他にないな…
Avatar
Kishikawa Katsumi 9/30/2020 4:17 AM
https://github.com/swiftwasm/JavaScriptKit/issues/87 これっすね。 ここに挙げられているものとその他の案を実際に書いてみるとたぶんConstructibleFromJSValueは一番ベターっぽい。
I always forget which is which, maybe something like ConvertibleToJSValue and ConstructibleFromJSValue would be more explicit?
4:17 AM
私見です。
Avatar
そうそう、今ところ ConstructibleFromJSValue かなぁ
Avatar
Kishikawa Katsumi 9/30/2020 4:19 AM
extension Bool: ExpressibleByJSValue なんか使い方が違うっぽく見えるんですよね。リテラルを変換するやつに引きずられて。
Avatar
そうなんですよねー。ExpressibleByの意味的にはマッチするんですけどstdlibでの使われ方を考えるとリテラル感がでちゃうですよね。
4:22 AM
stdlibの使われ方を纏めるとこんな感じかな
  • XXXConvertible: Self -> Target
  • XXXBrigable: Self -> Target & Target -> Self
  • ExpressibleByXXX: Literal -> Self
Avatar
Kishikawa Katsumi 9/30/2020 4:31 AM
Frameworkの実装だけ見ると、このProtocolは利用者は意識することないのかな、と思ったけど、 extension Account: ConstructibleFromJSValue みたいな自分で作ったそこそこの規模のStructに実装するとかもある? (edited)
Avatar
その粒度のstructはCodableでJavaScriptオブジェクトにシリアライズされるので基本的にユーザーが一生懸命このプロトコルを実装しないといけないストーリはないはずですね。
4:36 AM
確かにユーザーが直接使う機会は少ないかもしれない
Avatar
Kishikawa Katsumi 9/30/2020 4:36 AM
そうするとまあいうほど重要な名前ではない、、、のでまあConstructibleFromJSValueでいいんじゃないかな。
Avatar
ユースサイトのリポジトリ横断してgrepしてみたんですが一回も使われてませんでした…w
4:37 AM
基本的にフレームワーク内で使われるだけならそこまで過敏に気にする必要もないですね
Avatar
これってイニシャライザじゃだめなんですか?それなら Initializable もありかなと。
Avatar
イニシャライザにするのはありです
4:46 AM
extension Bool: InitializableByJSValue {}
4:47 AM
あんまりSwiftのインターフェースとして見ない単語だったので躊躇していたんですけど、そこまで違和感ない?
Avatar
Initializer は Swift の用語だし、そっちの方がわかりやすいかも? Self を返す static funcinit と等価だと思いますし、 init の方が Swifty な気もします。
Avatar
Kishikawa Katsumi 9/30/2020 4:50 AM
私はインターフェースをinitにしてもConstructibleの方が自然に感じます。Initializableはなんというかちょっとプリミティブ/具体的すぎてちょっと合わない感じ。
4:50 AM
プロトコルがめっちゃ限定的・具体的なことを指示している、みたいな。
4:52 AM
もちろん使い方がわかりやすい、とは相反するのですが、実装が変わるとプロトコル名も変わる・あるいはその逆、っていうのはちょっと違和感があります。大きく変わった場合はいいんですけど。
Avatar
Initializableはなんというかちょっとプリミティブ/具体的すぎてちょっと合わない感じ。
これはそうですね。単語のニュアンスを正しく理解できているか自信ないんですが、「Constructする過程でInitializeする」という関係だと思っているので、Initializeをprotocol名に入れるのは珍しいかなとも思いました
(edited)
Avatar
言われてみれば違和感ある気も・・・。
Avatar
alloc+initなのはobjcからの流れで
Avatar
ちなみに今のインターフェースのJSValueConstructibleはYamsを参考にしています https://github.com/jpsim/Yams/blob/b9eba20519058266abf6d7e44e82d3d419ce520a/Sources/Yams/Constructor.swift#L105-L116
A Sweet and Swifty YAML parser. Contribute to jpsim/Yams development by creating an account on GitHub.
Avatar
他の言語はこの2つを合わせてconstructになってる感じ (edited)
Avatar
API 的に近いのは init(from:) を持つ Decodable
4:58 AM
XxxableFromJSValue は良いように思います。 Xxx に何を入れるか。
4:58 AM
ConvertibleFromJSValue でもいいのでは?
4:58 AM
From が入ればニュアンス変わるし。
4:59 AM
JSValueConvertibleConvertibleFromJSValue があっても混乱しなさそう(する?)。
Avatar
そうするとMaxが言うように ConvertibleToJSValueConvertibleFromJSValue にすると対応が取れてきれいな気がするけど、悩ましいな
5:05 AM
Decodable はインターフェース的には近いけど意味的にはもう少し小さい粒度の値の変換だからdecodeは微妙にマッチしないかなぁ
5:06 AM
Rustだとtrait From<T>trait Into<T> が用意されてて羨ましいな (edited)
👉 1
Avatar
Kishikawa Katsumi 9/30/2020 5:07 AM
DecodeEncodeはなんとなくSerialiseの要素が含まれる感がありますよね。
Avatar
CustomXXConvertibleを見る度に思う > rust裏山
Avatar
参考までにRustの FromInto のドキュメントみてみたんですが
5:10 AM
API documentation for the Rust From trait in crate std.
5:11 AM
Used to do value-to-value conversions while consuming the input value. It is the reciprocal of Into.
ここではconversionという言葉を使ってますね
5:11 AM
やはり ConvertibleFromJSValue かな
Avatar
omochimetaru 9/30/2020 5:35 AM
自分なら ConvertibleFromJS ConvertibleToJS かなあ〜
Avatar
Kishikawa Katsumi 9/30/2020 5:38 AM
今回の例でいうとJSValueに関してはEraseToJSValueかなああんまり対称性がなさそう
5:39 AM
いや、戻せるから大丈夫なのか。。。?
Avatar
あ、 Decodable は意味は違うけど Xxxable という形式の名前にするのがやはり良さそうという意味でした。で、今考えている init(from:) が( decode ではなく)何かと言うとやっぱり convert だよなと。そうすると ConvertibleFromJSValue かなと。 (edited)
Avatar
Convertibleだと、stdlibではCustomStringConvertibleがtoStringが生えますよね。逆にinit(from:String)が生えるprotocolがあればそこが対なので参考にできそう
Avatar
XxxConvertible は to なので、 from であることも明示するには ConvertibleFromXxx かなと。 (edited)
Avatar
JSValueConvertibleとJSValueXXXableが定義できると
5:45 AM
stdlibの命名に倣えて良いかなと
Avatar
でも from と to が両方存在するなら ConvertibleToJSValueConvertibleFromJSValue がわかりやすそうに思います。
Avatar
from toでわかりやすいのは非英語圏な気がする
5:46 AM
Convertibleは主格と合わさって意味をなしてるので
5:46 AM
fromtoは順番がごちゃった感じがします
Avatar
omochimetaru 9/30/2020 5:47 AM
CustomStringConvertibleって名前おかしいと思うんだよな Describable じゃないのか (edited)
Avatar
(個人の感想)
5:47 AM
それはそう
Avatar
omochimetaru 9/30/2020 5:47 AM
Custom がまず謎だし。
Avatar
そうするとMaxが言うように ConvertibleToJSValue と ConvertibleFromJSValue にすると対応が取れてきれいな気がするけど、悩ましいな
Max が言ってるし別にネイティブでも違和感はない? Max がネイティブかはわからないけど・・・。
Avatar
ableはどっちかっていうと最後の方についてる印象がある
Avatar
Xxxable 前置詞 名詞」自体は ExpressibleByStringLiteral とかでもあるし、いい気がします。
Avatar
たしかに
Avatar
omochimetaru 9/30/2020 5:51 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
インプットの一つとして、GenericsManifesto では ConstructibleFromValue ってのが出てきます https://github.com/apple/swift/blob/main/docs/GenericsManifesto.md#generic-protocols
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 9/30/2020 5:51 AM
_ObjectiveCBridgeable は両方向合わせたやつなんだな
Avatar
_ObjectiveCBridgeable
こんなのいましたねw
Avatar
omochimetaru 9/30/2020 5:52 AM
func _bridgeToObjectiveC() -> _ObjectiveCType static func _forceBridgeFromObjectiveC( _ source: _ObjectiveCType, result: inout Self? )
5:52 AM
fromのほうはforceとconditionally と unconditionally があって1:3だった・・・
Avatar
完全に相互変換できない場合はそういうインターフェースになると思います
Avatar
ConstructibleFromValue
これは完全にRustの trait From っぽい
6:01 AM
個人的には JSValue -> SelfConstructibleFromJSValue or ConvertibleFromJSValue のどちらかかなと思ってるですが、次の問題として、この場合にSelf -> JSValue をstdlibのXxxConvertibleに寄せるか FromJSValueと対応をとって ConvertibleToJSValue にするか。 (edited)
6:03 AM
決めの問題なのかなぁ…
Avatar
omochimetaru 9/30/2020 6:10 AM
stdlibの XxxConvertible は、 String と あと何があるんだっけ
6:10 AM
Stringの場合は 元の型と宛先の型のレベルが揃ってないから
6:11 AM
情報量を保って表現だけ変える今回の変換は
6:11 AM
別物と考えて名前を揃えなくても良い気がする。
Avatar
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
6:12 AM
XXXConvertibleは、復元不可能な一方通行の場合な気がしてきた
Avatar
omochimetaru 9/30/2020 6:12 AM
そうそう。
Avatar
CustomPlaygroundDisplayConvertible LosslessStringConvertible CustomDebugStringConvertible
Avatar
ReferenceConvertibleというのもありますね
Avatar
omochimetaru 9/30/2020 6:12 AM
復元可能な場合にわざわざ Lossless が付くことからも
6:13 AM
普通のConvertibleは情報の次元が異なってて、
6:13 AM
それもあって変換方向が名前から直感的にわかる。
Avatar
public protocol LosslessStringConvertible: CustomStringConvertible { init?(_ description: String) }
Avatar
omochimetaru 9/30/2020 6:13 AM
descriptionから戻せる太郎ね
Avatar
LosslessStringConvertibleはRawRepresentable where RawValue == String っぽい
Avatar
omochimetaru 9/30/2020 6:14 AM
一応 Int とかがそうなんじゃないっけ
Avatar
Representableが
6:14 AM
From相当なのかな
Avatar
omochimetaru 9/30/2020 6:14 AM
Representableは内部のデータの持ち方じゃない?
Avatar
conformしてるのはBoolとFixedWidthIntegerとString周りだけっぽいですね
6:16 AM
A type that can be converted to and from an associated raw value.
6:16 AM
RawRepresentableはfromとtoを提供する?
Avatar
たしかにtoもありますね
Avatar
内部の持ち方に関しては問わなそう
Avatar
omochimetaru 9/30/2020 6:17 AM
representationっていうとデータの表現のことを指すからその意味なのかと思ってる
Avatar
UIViewRepresentableもあったな
6:17 AM
SwiftUIに
Avatar
omochimetaru 9/30/2020 6:18 AM
UIViewRepresentableは互換性の方の意味っぽいな
Avatar
UIViewBridgableでも違和感ない
Avatar
当初の用途見てると、ObjCのenumのマッピングなのだから
6:19 AM
互換の意味もありさうだ
Avatar
omochimetaru 9/30/2020 6:21 AM
APIGuidelineにこういうのは無いんだっけ
6:21 AM
ありがちなプロトコル名の命名指針
6:24 AM
ありそうだな〜と思ってたんですけど見つからない
6:25 AM
よくよくありがちなインターフェースだと思うんですけどねー
Avatar
omochimetaru 9/30/2020 6:25 AM
だよね
6:26 AM
最近まさに C# <-> Java を書いてた
Avatar
その場合だとJNIで通信するんですか
Avatar
omochimetaru 9/30/2020 6:32 AM
そうね。 Java → C# の変換は、C#のコードとして、Javaのオブジェクトのフィールドを読んだりメソッドを呼んだ。JNIをラップしたマシなAPIがあってそれを使った。 https://docs.unity3d.com/ScriptReference/AndroidJavaObject.html
6:33 AM
C# → Java の変換はめんどくさかったので Java側にコンストラクタ作ってそれを↑経由で呼んだ。
6:34 AM
Java側からC#を触ろうとすると、 P/invoke経由になるけどC interfaceだから Java → JNI/C → C# になってめちゃだるそう
6:38 AM
これはC#的にはどういう型が返ってくるんだ?
Avatar
omochimetaru 9/30/2020 6:38 AM
それドキュメントがゴミで
6:38 AM
ほんとは Get<FieldType>()
6:38 AM
ジェネリックパラメータを一つ取るからユーザ側で明示的に指定する。
Avatar
なーるほどcallerがジェネリックパラメータ渡すのか
6:39 AM
そこに渡せるジェネリックパラメータに成約はないんですか? (edited)
Avatar
omochimetaru 9/30/2020 6:39 AM
ない
6:39 AM
多分変なもの書いたらクラッシュする
Avatar
プリミティブな型だけ渡す?
Avatar
omochimetaru 9/30/2020 6:39 AM
うん。あとプリミティブ配列はイケた。
Avatar
なるほどなぁ。世界観が違うなぁ
Avatar
omochimetaru 9/30/2020 6:40 AM
あ、あとは、 AndroidJavaObject が書けるよ。
Avatar
AnyObject的な
Avatar
omochimetaru 9/30/2020 6:40 AM
いや、ちがう
6:40 AM
プリミティブが帰ってくるときに AndroidJavaObject を指定するのは駄目
6:40 AM
java.lang.Object に対応してるってこと。
6:41 AM
javaの int とか booleanObject ではないので。
Avatar
なるほど
Avatar
とりあえずXxxConvertibleに無理に合わせる必要が無いは同意できるのでConstructibleFromJSValueとConvertibleToJSValueかな
👍 1
7:44 AM
ExpressibleByがリテラル以外でも使われてる例をMaxが教えてくれた
Avatar
I always forget which is which, maybe something like ConvertibleToJSValue and ConstructibleFromJSValue would be more explicit?
Avatar
omochimetaru 9/30/2020 8:10 AM
いいね。
Avatar
Kishikawa Katsumi 9/30/2020 8:16 AM
こういうのがリポジトリに残ってるといいですよね
😄 1
Avatar
norio_nomura 9/30/2020 9:25 AM
YamsのネーミングはPyYAML由来が多いです。
9:28 AM
PyYAML由来のRepresenter, Constructorがあっての*Representable,*Constructible
Avatar
なるほど、別言語に起源があったんですね
Avatar
PyYAMLはYAMLの仕様書で使われているrepresent, constructという単語をそのまま使っている印象です。英語として自然だから偶然揃っているだけかもしれませんが。
Avatar
omochimetaru 9/30/2020 3:07 PM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
3:08 PM
CodingUserInfoKey.init?(rawValue: String) なんですけど
3:08 PM
失敗することがないんで、 CodingUserInfoKey.init(rawValue: String) のほうが望ましくないですか?
3:08 PM
ちなみに、 init? じゃなくて init であっても、 RawRepresentable にはconformできます。
Avatar
将来的にFailableになることも無さそうだしinitで良さそう
Avatar
omochimetaru 9/30/2020 3:17 PM
実装当時には推論器がしょぼくて init? で conform できなかった事による名残じゃないかと予想してるんだけど
3:17 PM
source breaking changeになるし困ったな
Avatar
Kishikawa Katsumi 10/2/2020 2:36 PM
Raspberry PiにSwift一式を入れておいたらオフラインでもiPhoneでSwift書ける、みたいな話あった気がするな
Avatar
Playground.app on iPhoneだ
Avatar
Kishikawa Katsumi 10/2/2020 3:36 PM
電源の問題があるな。iPhoneから取れるといいんだけどな。。。
Avatar
別に審査にださないんだったら
8:25 PM
なんでもできるんじゃないですかね。Raspberry Piなしに。
8:25 PM
Sandboxだけど。
Avatar
Kishikawa Katsumi 10/2/2020 8:38 PM
SwiftツールチェーンをiOSで動くようにビルドするのは難しいかと思って。。
Avatar
Windowsだってうごくので、Swiftなんてかんたんに動くと思う!
Avatar
Kishikawa Katsumi 10/2/2020 8:40 PM
Appleシリコンのサポートもあるから意外といけるか?
Avatar
ios_system で LLVM は動くようにできている (かつ a-Shell というアプリで App Store にも通っている) ので、Swift ツールチェーンも行けるかもと思ったことはありますね。(実際にやってはいないですが) https://github.com/holzschu/ios_system https://github.com/holzschu/llvm (edited)
Drop-in replacement for system() in iOS programs. Contribute to holzschu/ios_system development by creating an account on GitHub.
Mirror of official llvm git repository located at http://llvm.org/git/llvm. Updated every five minutes. - holzschu/llvm
😮 2
Avatar
Kishikawa Katsumi 10/9/2020 10:59 AM
AST Explorerでどの文法要素がどれだけ使われてるかと、ポイントしたらどこに使われてるかわかる機能つけた。たぶん最初のとっかかりの学習に便利。
Avatar
これよさそうですね。
11:06 AM
僕みたいな( SwiftSyntax の?)初心者に。
Avatar
Kishikawa Katsumi 10/9/2020 11:12 AM
そうそう。そういう本当に最初のとっかかりで全体を俯瞰したりどういう構造が取れるかみたいなのがたぶんわかる。
🙂 1
Avatar
いつもお世話になってます。 これめちゃくちゃいいですね!参考にしたいアプリのサンプルコードとか、作ってるアプリのコード一気に復習したいときに便利そうです!
Avatar
Kishikawa Katsumi 10/18/2020 12:05 AM
https://swiftfiddle.com/ Swift PlaygroundをVaporで書き直してついでに全部Dockerで動く構成にしてセットアップが簡単になったから2.2とかの手に入る実行環境を全部入れてみた。 2.xで動かそうとするとFoundationがないとか最初の引数にラベルをつけたらダメとかまずコンパイルが全然通らなくて懐かしい気持ちになる。
SwiftFiddle is an online playground for creating, sharing and embedding Swift fiddles (little Swift programs that run directly in your browser).
Avatar
全部Dockerで動く構成にして
Swift のコードをコンパイルして実行する部分が Docker in Docker になっちゃいませんか?
Avatar
Kishikawa Katsumi 10/18/2020 1:56 PM
はい。Swiftの実行をサンドボックス化するためにDocker in Docker構成は必要ですね。 (edited)
Avatar
Docker in Docker ってやったことがなくて知見がないんですが、軽く調べたときは --privileged を付与しないといけないとかあって危険そうでやめちゃったんですが、特に問題ない感じですか? (edited)
Avatar
Kishikawa Katsumi 10/18/2020 2:18 PM
DinDとDooDという2つの手法があってDooDだとprivileged はいらないです。でもどちらにしてもコンテナで動かすのはコンテナの寿命も短いし、コンテナごとにリソース制限もできるからDinDでもはるかに安全だと思います。
Avatar
僕が作ったときは受け取ったコードを走らせる部分だけをコンテナで動かして、クライアントとやりとりするサーバーサイドプログラムはあきらめて Docker の外側で動かしてました。管理しやすいからそこも Docker にしたいんですが・・・。 DooD なら問題ないですかね?↓とかが気になってます・・・。
ホストマシンで動いてる他の Docker コンテナも見えちゃうので、例えば Jenkins コンテナ上で他の Jenkins コンテナを停止できてしまいます。
https://qiita.com/sugiyasu-qr/items/85a1bedb6458d4573407
Avatar
Kishikawa Katsumi 10/18/2020 2:37 PM
ホストマシンで動いてる他の Docker コンテナ〜
専門じゃないですけどこれが第三者に可能ならそれは別の大きな問題じゃないですかね。 確かにDood構成だとホストのDocker Daemonを共有するので子や孫のコンテナの中からdocker stopやrmは可能です。概念上は親子孫。。。とありますけど全部並列というのがたぶん正確。
2:39 PM
いずれにしてもコードを実行する部分はコンテナでやるのがベスト、ここは同意できる部分と思います。 あとはある意味構成が複雑になるので私も最初は避けてたんですけど、やっぱりセットアップが大変なので、Docker In Docker構成だとすごい楽ですね。
Avatar
DooDだと /var/run/docker.sock 触れる = それがあるなら --privileged な docker コンテナも作れるのでむしろ DinD のほうがちょっと安全…?
👀 1
Avatar
Kishikawa Katsumi 10/18/2020 2:40 PM
外の人がWebサービス越しにそれをやるのはだいぶ困難じゃないですかね。
Avatar
まあそれはそうだと思います
Avatar
Kishikawa Katsumi 10/18/2020 2:41 PM
コンテナでデプロイできるとOSも特殊なコンテナ用のOSが使えるのでそこも安全性に寄与する部分がありそう。
Avatar
いずれにしてもコードを実行する部分はコンテナでやるのがベスト、ここは同意できる部分と思います。
はい、これは必須だと考えています。
Avatar
Kishikawa Katsumi 10/18/2020 2:42 PM
SwiftFiddleはGCEのContainer Optimized OSにデプロイしてて、普通に入っても一般のUbuntuとかとはだいぶ勝手が違うので。
Avatar
外の人がWebサービス越しにそれをやるのはだいぶ困難じゃないですかね。
コードからコマンド実行したりできるから、結構色んなことできませんか?権限をうまく管理すれば良い?穴があると怖いから何されても大丈夫にしておきたくて、そうすると外側は Docker に載せない方がいいのかなぁとか考えてました。
Avatar
Kishikawa Katsumi 10/18/2020 2:52 PM
おっしゃる通り、自分のコードにバグがあってコマンドインジェクションとかが一番簡単な脆弱性ですね。。。 その場合はどうなのかなあ。 ユーザーを制限して普通にホストでサービスを動かす方がいいんだろうか。
2:53 PM
いい、というのはより安全、という意味です。構成は複雑になるけど管理は全部Dockerの方が楽なのはそうなので、どっちがどれくらい危険なのかなあ。
Avatar
そうなんですよねぇ。管理は Docker でできたら楽なので、できるならそうしたいです・・・。
Avatar
Kishikawa Katsumi 10/18/2020 2:56 PM
ある程度任意のコードが実行できて、SwiftFiddleはHTTP通信もできるようにしてるけど、他はコンテナに制限かけてるからまず外側の構成によらずそんなに簡単に何でもできない、気はしている。
Avatar
とりあえず、Dockerfile内で外向けアプリを実行する前にUSERでアカウントを変更した方が良いです。
Avatar
Kishikawa Katsumi 10/19/2020 1:37 AM
ホストのdocker.sockにアクセスできない問題が解決できなかったんですよね。通常ユーザーでどうしたら可能になるのでしょうか?
3:12 PM
3:13 PM
↑のツイートを見て考えてたんですけど、 Swift においてもこれがアンチパターンかって結構難しいテーマじゃないですか?
3:14 PM
正常系に例外を使うなっていう話って Java の事情の影響を相当受けてる気がして、実際 Effective Java の「例外的状態にだけ例外を使う」という項を読んでも、ほとんどパフォーマンスの話しかしていません。
3:16 PM
Swift の throws はより軽量だと思いますし、また、例外を throw するのは Either / Result に対する do 記法だという立場からすると、 treat が例外を throw するのと結果を return するのは同じことだとも言えます。
3:17 PM
一方で、 can_treat を使う方式だと、チェック忘れを静的に検査できず treat が実行時エラーを起こす可能性を排除できません。
3:18 PM
Effective Java では、 Iteratornextthrow して分岐するか、 hasNext でチェックするまたは nextOptional を返すかという話が載っていて後者が望ましいとあるんですけど、 OptionalResult の一種だと考えると、 throw するか Optionalreturn するのは同じことだとも言えます。 (edited)
Avatar
Kishikawa Katsumi 10/25/2020 3:47 PM
Javaの話を根拠にするのはSwiftには当てはまらないと思います。おっしゃる通り、例外のパフォーマンスが全然違うので。
Avatar
ただ、「正常系に例外を使うな」という話はパフォーマンスの話を越えてより普遍的なものとして広がっているような印象を持ってるんですけどどうでしょう?
Avatar
Kishikawa Katsumi 10/25/2020 3:58 PM
Javaからきているその話は(他の言語からの由来があるかもしれないけど置いておく)、多分にJavaの例外のパフォーマンスの問題(スタックトレースをキャプチャするコストが高い)と一部の標準ライブラリの設計の問題、からきているので、Javaの文脈を超えて「正常系で例外を使う」というのが一人歩きしていそうな場合は (edited)
3:59 PM
まあ何でダメと言ってるのか、というところからじゃないでしょうか。なのでおっしゃる通りSwiftの場合はOKなこともあるんじゃないか、というのには同意します。
Avatar
実践的には例外は異常系だけに使っておいたほうが嬉しいことは多いと思います。 ソフトがなんかバグってるけどとっかかりがない、みたいなときに、例外生成にブレークポイントを貼ると便利ですけど、正常系で使ってるとそこに止まりまくってそういう技ができなくなるとか、 異常系は正常系より低頻度なので、コンパイラが分岐予測ヒントを与える最適化ができるけど正常系で例外を使うとそれとアンチシナジーしちゃうとか。
Avatar
Kishikawa Katsumi 10/25/2020 3:59 PM
たぶんに言語ごとの実装による、気がしますね。
4:00 PM
例外生成にブレークポイントを貼ると便利ですけど、正常系で使ってるとそこに止まりまくってそういう技ができなくなるとか
これがツラいのは確かにありますね。
Avatar
Swiftで型安全な2択分岐をさせたいならenumを使えばよいというのもあって、わざわざ例外を正常系に使うテクがそこまで嬉しいことは少ない気がする。
Avatar
treat の戻り値の型が Void だったときに、 throws なら分岐を強制できるけど、 Bool か二値 enum だと警告止まりというのはどうでしょう?
Avatar
FYIなんですが、Sequence.firstの実装が正常系でthrowを使っていた過去がありますが、おもちさんが挙げているようなブレークポイントの問題を理由に書き換えられています。 https://github.com/apple/swift/pull/17387
This PR alters the Sequence.first(where:) function to remove the use of a thrown error for flow control. When called under Xcode with the &quot;Swift Error Breakpoint&quot; (swift_willThrow...
👀 3
Avatar
元の漫画の左のコードはcan_treatとtreatのペアの規約が難しいけど、右もpythonなら非検査例外だから、どちらもtreatの仕様書を読み込んでから使わなきゃいけないしどっちもつらい
Avatar
@Yuta Saito これおもしろい事例ですね。
4:13 PM
@omochimetaru Python においては右も辛いはそのとおりだね。
Avatar
@swift-5.3.3 var a: ArraySlice<Int> = [] for i in 0 ..< 100 { a.append(i) print(a.capacity) }
Avatar
1 3 3 7 7 7 7 17 17 17 17 17 17 17 17 17 17 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143
Avatar
おや?手元環境と違う。
2:15 PM
@swift-5.3.3 var a: ArraySlice<Int> = [] for i in 0 ..< 100 { a.append(i) print(a.capacity) _ = a.popFirst() }
Avatar
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Avatar
↑これすごく意外でした。 capacity を超えそうのなったときに前に詰めてる?
2:19 PM
@swift-5.3.3 var a: ArraySlice<Int> = [] a.reserveCapacity(10) for i in 0 ..< 20 { a.append(i) print(a.capacity) _ = a.popFirst() }
Avatar
11 10 9 8 7 6 5 4 3 2 1 1 1 1 1 1 1 1 1 1
Avatar
これ一つずつ減っていくのどういうこと?
Avatar
スライスのcapacityは (Arrayのend - スライスのstart) になってそう。
2:21 PM
popFirstはスライスのstartを1増やしてる。
Avatar
うーん、そうなのか。そうすると capacity からバッファのサイズはわからないな。
Avatar
スライスの要素数が0個になったあとまたappendしたときは
2:23 PM
0個になった時点で実体のArrayを手放してるんじゃないかなあ?
2:24 PM
それでまた要素数1のArrayというかバッファーを新規作成している?
Avatar
あふれて allocate するときもそうだと思う。
Avatar
そのときは既存部分のクローニングが要りますね。
Avatar
そうですね。
2:25 PM
それは Array でもそうかと。 < 既存部分 (edited)
Avatar
そうですね。
Avatar
appendpopFirst を繰り返した場合、 endIndexcapacity を超えたときにどうなると思う?前に詰める? N 倍のバッファを確保して index に基づいた場所に格納される?
2:28 PM
capacity からわかるかと思ったけど、この capacity の挙動だと実装みないとわからないかな・・・。
Avatar
expandされると思ってたけど、この結果からすると0になったときに捨てて1のバッファを作ってそう
2:35 PM
要素1の配列はヒープ退避されない最適化実装があった気がする
2:35 PM
CollectionOfOneだったかなんか。 (edited)
Avatar
ただそれだとオフセットがいるからすべての操作にたし算が入って若干遅くなるよね。
2:41 PM
ポインタだけオフセット分前にずらしておけば大丈夫? (edited)
Avatar
ズラしておいてメタデータはマイナスとか後ろに持つというのもあるけど、小さな定数のオフセットって1命令に焼けるから実質コスト無いとかもありそう
Avatar
この「定数」は実行時定数?それともコンパイル時?あと、「小さな」が、 ArraySlice をキューとして使っていたとすると大きなオフセットになることはありえそう。
Avatar
対象読者 アセンブリに触れてみたい!という初心者の方 メモリ、アドレスといった専門用語、C言語の簡単な文法(intやprintf)がわかる(ググって調べることができる) 目標 ソースコード, .sファイル, 実行可能ファイ...
3:29 AM
mov eax, [ebx+8]
この形式の事を言ってました
👀 1
3:30 AM
ここの8がオフセット定数 命令における定数なので実行時ですね
3:31 AM
小さな、というのはここのオフセット定数に使えるビット幅が小さいのでそれに収まるという意味
3:32 AM
CollectionOfOneの先頭から値へのオフセットのことを考えてました
3:32 AM
CollectionOfOneはバッファを間接化しないので。
Avatar
a ... bb == a - 1 のときに、実行時エラーじゃなくて空の ClosedRange になってほしい・・・。
Avatar
Kishikawa Katsumi 11/5/2020 2:47 PM
実行時エラーがツラいっすよねえ。
Avatar
a ..< b だと空の Range 作れるんですよね。
Avatar
@swift-5.3.3 print(Array(0 ..< 0))
Avatar
[]
Avatar
@swift-5.3.3 print(Array(1 ... 0))
Avatar
exit status: 4 with stderr:Fatal error: Can't form Range with upperBound < lowerBound: file Swift/ClosedRange.swift, line 335 Current stack trace: 0 libswiftCore.so 0x00007f0b11e99d50 swift_reportError + 50 1 libswiftCore.so 0x00007f0b11f0d0c0 _swift_stdlib_reportFatalErrorInFile + 115 2 libswiftCore.so 0x00007f0b11bf27de <unavailable> + 1398750 3 libswiftCore.so 0x00007f0b11bf2337 <unavailable> + 1397559 4 libswiftCore.so 0x00007f0b11bf2013 <unavailable> + 1396755 5 libswiftCore.so 0x00007f0b11bf1a80 _assertionFailure(_:_:file:line:flags:) + 511 7 swift 0x00000000005b4501 <unavailable> + 1787137 8 swift 0x00000000005a1d04 <unavailable> + 1711364 9 swift 0x0000000000587e88 <unavailable> + 1605256 10 swift 0x000000000057b322 <unavailable> + 1553186 11 swift 0x00000000005780ef <unavailable> + 1540335 12 swift 0x0000000000501c2c <unavailable> + 1055788 13 libc.so.6 0x00007f0b13f68740 __libc_start_main + 240 14 swift 0x00000000005017a9 <unavailable> + 1054633 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/CNIOWindows/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIODarwin/include -I
Avatar
@swift-5.3.3 print(Array(0 ... 0))
Avatar
[0]
Avatar
https://github.com/apple/swift/blob/e8151ee2b27776f684464af8b26fe33767d966b5/stdlib/public/core/ClosedRange.swift#L90-L95 /// Because a closed range cannot represent an empty range, this property is /// always `false`. @inlinable public var isEmpty: Bool { return false } なんで、無理ですね
Avatar
そうなんですが、結構不便なんですよねぇ・・・。
3:40 AM
たとえば nPr を計算する関数なんかは↓のように実装したくなると思うんですが、 r0 だとクラッシュしてしまいます。 func npr(_ n: Int, _ r: Int) -> Int { (n - r + 1 ... n).reduce(into: 1) { $0 *= $1 } }
3:41 AM
仕方なく↓みたいに書くんですが、 ..< の右の n + 1 が不格好なんですよね・・・。 func npr(_ n: Int, _ r: Int) -> Int { (n - r + 1 ..< n + 1).reduce(into: 1) { $0 *= $1 } }
3:42 AM
競プロで ... 使うと実行時エラーを踏みまくるので、 ..< ばかり使うようにしています。
Avatar
lowerBound > upperBound のものをすべて空として扱うのは乱暴な気がするし、Strideable じゃないものだと空として扱うupperBoundが決められないし、仕方ない気もします。
Avatar
lowerBound == upperBound + 1 の場合だけ空だと、実用上はちょうど良いように思います。ただ、表現として微妙なのはわかります。
3:47 AM
Strideable じゃない場合との整合性を考えると微妙ですね・・・。 (edited)
Avatar
Kishikawa Katsumi 11/16/2020 5:00 AM
https://twitter.com/twolivesleft/status/1328178489258692608 これはアリだと思うんですよね。オーバーロードでやるんじゃなくてフォントがそういう風に表示したらいいと思うけど。。。
Reading some library code … found this Not sure what to think
Likes
311
Avatar
これは確かにアリだ
Avatar
Kishikawa Katsumi 11/16/2020 5:21 AM
リガチャで見た目変えるフォントを使っても != を≠にするのはあるけど否定のビックリをみやすくしてくれるのはなかった気がする。
Avatar
!!! にすればいいんですよ
5:22 AM
奇数個強調したい分だけ繰り返せばよい
Avatar
Kishikawa Katsumi 11/16/2020 5:23 AM
なんと。確かにそれでいい気もするなあ。
Avatar
個人的には not みたいなキーワードがほしいですねえ (edited)
Avatar
error: cannot find operator '!!!' In scope カスタムオペレーターの弊害とはいえ、悲しい。
Avatar
うっかり4個書いたらバグるやんけ > niw
😂 1
Avatar
それはどの記号でも同じだから...
7:01 AM
数は重要
Avatar
単項演算子を2回重ねることがまずない
Avatar
JavaScriptでは当たり前にように使う
Avatar
bool castするやつですよね
Avatar
てか !!! だめなのかー
7:03 AM
bool への cast で !! なのは C とかでもあるはず
Avatar
Cならそのままでよくないですか?
7:04 AM
JSだと後続の処理に渡る値の型を固定させたいことがあるけどCは静的型だから。
Avatar
なんかあったはず
7:05 AM
macroがらみだったかなあ
7:05 AM
あんま覚えてない
Avatar
マクロならなんかありそう。 そういうマクロはよくない。
Avatar
あー、bitflagか
Avatar
!の視認性の悪さが問題なのに!!!にしたら数を数えないといけないという地獄度が増してる気がする
7:14 AM
乱視なので!は基本的に2本以上見えてる
Avatar
それは困りそう>乱視
Avatar
そもそもなんで ! が否定なんだろう
Avatar
もともと 数学の を表したくて、 縦棒っぽい記号が欲しかっただけと思ってた !=
Avatar
≠ → != → !
Avatar
で、そこから +=+ の関係を考えると、 != から ! が取り出せる
Avatar
ほう。。
7:19 AM
数学の not は ¬
Avatar
bang pで!が...
Avatar
それはプログラミング言語由来として載ってる感じだった
Avatar
なるほど輸入されたのか
7:22 AM
The exclamation mark "!" signifies logical NOT in B, C, and languages with a C-inspired syntax such as C++, Java, JavaScript, Perl, and PHP. "NOT" is the operator used in ALGOL 60, BASIC, and languages with an ALGOL- or BASIC-inspired syntax such as Pascal, Ada, Eiffel and Seed7. Some languages (C++, Perl, etc.) provide more than one operator for negation. A few languages like PL/I and Ratfor use ¬ for negation. Some modern computers and operating systems will display ¬ as ! on files encoded in ASCII.
7:24 AM
B由来っぽい
Avatar
ネタとしてはこうですよね。 extension Bool { var isFalse: Bool { !self } }
7:30 AM
リガチャで読みやすく(?)するフォントはgithubにあります
7:30 AM
Free monospaced font with programming ligatures. Contribute to tonsky/FiraCode development by creating an account on GitHub.
Avatar
1文字の ! はないっぽい?
Avatar
Kishikawa Katsumi 11/16/2020 7:55 AM
はー、トリプルビックリはダメなのか😯
7:58 AM
そもそもダブルビックリもだめなのか。
7:58 AM
juxtaposeって英単語エラーメッセージで初めて知った。近すぎる、らしい。 (edited)
Avatar
ci.swift.orgにApple Siliconなノードはまだ入らないのかな。 (edited)
9:58 AM
こうした外部要因だけでなく、内部的にも「Swift派」と「Objective-C派」に派閥の分裂が生じていたとのこと。Swift派はSwiftに執着して問題を否定し、Objective-C派は解決策を提示せず不平のみ発するようになり、社内は緊張状態になっていたとStanley氏は語っています
😭 2
Avatar
どちらももと同僚なんだよなあ。なつい。
6:28 PM
TwitterはSwiftこれ系はうまく乗り切ったと思う。
Avatar
ウーバーからniwさんのところに転職したってことですか?
Avatar
彼は元Twitter
Avatar
あ、ウーバーに行ったのか。
Avatar
Lorenも。
Avatar
ああ、記事に名前出てくる二人
Avatar
標準ライブラリが入ってたとしても100M超えるのは違和感がある
Avatar
今にして思えば同時のiOSチームリードの判断と割とコンサバティブな弊社の決断は正しかった
Avatar
めっちゃたくさんライブラリ入れてたんだろうか
Avatar
特に前者
6:30 PM
いろいろリンクしてたんだろうなあ。
6:32 PM
Principal か、めっちゃ出世してるやん
Avatar
UberはRxSwiftを基盤にしたFramework作ってませんでしたっけ
Avatar
Swift の protocol 作るときに、型ではなく制約としての利用を前提とするなら、基本的に FooProtocol の命名の方が良い気がするんですがどうでしょう? protocol Foo {} struct Bar<???: Foo> {} // ??? に何と付ける? protocol FooProtocol {} struct Bar<Foo: FooProtocol> {} // 型パラメータ名を Foo にすれば良い (edited)
4:57 AM
Numeric みたいな汎用的なプロトコルの場合は struct Bar<Length: Numeric> みたいに命名できるけど、もっと用途の幅が狭いものの場合。 (edited)
Avatar
omochimetaru 1/6/2021 4:58 AM
Barの中でFooをどう使うかで名前が付きません? var value: Value とか。
Avatar
そういう名付けができるケースだといいけど、もっと用途が限定されてる場合とか。今は VideoSource というプロトコルを作ってたんだけど、 struct PlayerView<VideoSource: VideoSourceProtocol>: View { ... } にしたくなった。
Avatar
omochimetaru 1/6/2021 5:01 AM
そのケースは確かに・・・
Avatar
VideoSource_ (edited)
Avatar
VideoSourceType
Avatar
TypeOfVideoSource
Avatar
omochimetaru 1/6/2021 5:02 AM
たしかにassociatedtypeだと Type suffix 結構使うな。 (edited)
5:03 AM
パラメータ名は別に大事じゃない気がしてて V: VideoSource で良い気もするんだけど主流じゃなさそうだ。
Avatar
T, U, V...
Avatar
制約としてのプロトコルって書く場所があまりないけど、 associatedtype や型パラメータって何度も繰り返し使われるから、 associatedtype Iterator: IteratorProtocol 的にプロトコル名を長くした方がよくないですか?
Avatar
associatedtype はそうかも。 (edited)
Avatar
omochimetaru 1/6/2021 5:04 AM
Protocol suffixはなんか負けた気がするんですよね
5:04 AM
結構使うけど・・
Avatar
Avatar
omochimetaru
Protocol suffixはなんか負けた気がするんですよね
わかる。。
Avatar
Avatar
Yuta Saito
わかる。。
わかる
Avatar
omochimetaru 1/6/2021 5:05 AM
ハンガリアンっぽいというか。 (edited)
Avatar
(ハンガリアンてハンガリー関係あるんだっけ)
Avatar
Avatar
niw
T, U, V...
関数やメソッドではなくジェネリック型の型パラメータの場合は T などではないフルの名前がメジャーかと思います。
Avatar
Avatar
koher
関数やメソッドではなくジェネリック型の型パラメータの場合は T などではないフルの名前がメジャーかと思います。
たしかに!
5:06 AM
(考案者がハンガリー出身...)
Avatar
Avatar
omochimetaru
Protocol suffixはなんか負けた気がするんですよね
そうなんだけど、 IteratorProtocol があるからもう天下り的にいいかなと・・・。
5:07 AM
プロトコルを型として使わないんだったら、 C# 的な I prefix は賢い気がする。
Avatar
語尾を変えてキャラクターを持たせるのは日本語あるあるなので
5:07 AM
ジャパニーズ記法としよう
😂 2
Avatar
ハンガリアン記法ってかっこいいけどジャパニーズ記法ってクソダサですね💧
Avatar
omochimetaru 1/6/2021 5:48 AM
異なる2つのものが同じ名前を持っているときに、ユーザーがprefixやsuffixをつけるのではなくて、
5:48 AM
文法的になんの名前なのかを修飾できる言語機能をもたせる方向性のほうが好きです
5:49 AM
C++だと typename キーワードでそういう事をする場面があって
5:49 AM
C++でtypenameキーワードを使うケースは以下の2つがある. テンプレートパラメータを宣言するとき テンプレート内にあるネストされた依存型名を指定するとき(例外あり) テンプレートパラメータの宣言時 ひとつはテンプレートパラメータを宣言するとき. template void f(T t); これは,以下のようにtypenameの代わりにclassを使った場合でも同じ意味となる. template void f(T t); この場合,typenameとclassのどちらのキーワードを使うかは好みの問題となる. テンプレートにネストされた型の指定時 …
5:50 AM
どうしても無理ならこういう方向にいって、ユーザーの命名で固定のsuffixをいつもつけるとかは避けられるようになってほしい
Avatar
2. 知らなかった...!
Avatar
省略形にしたくないときはモジュール名つけるのをよくやっています struct Bar<Foo: MyModule.Foo> {}
Avatar
Avatar
nanasi
省略形にしたくないときはモジュール名つけるのをよくやっています struct Bar<Foo: MyModule.Foo> {}
これコード読んでるときにややこしいかなぁと思ってたんですが、 Opaque Result Type を考えると型名としてプロトコル名が現れることもあるなという気持ちになって、結局この方法を採用しました。
Avatar
norio_nomura 1/9/2021 1:30 AM
https://github.com/MaxDesiatov/SwiftConcurrencyExample これ試したけど、/usr/lib/swift/libswift_Concurrency.dylibが絶対パスでリンクされて、SIP有効だとDYLD_LIBRARY_PATHも渡せないから、
dyld: Library not loaded: /usr/lib/swift/libswift_Concurrency.dylib
で実行出来なかった。 (リポジトリ名が変わっていたので修正した)
(edited)
Experiments with Swift async/await and structured concurrency - MaxDesiatov/SwiftConcurrencyExample
Avatar
なぜかはちゃんと分かってないんですが、XcodeのRun経由だとdylibが正しく読み込めて実行できるですよねこれ。
Avatar
norio_nomura 1/11/2021 4:51 AM
ああ、DYLD_LIBRARY_PATH=… swift runはダメだけど、DYLD_LIBRARY_PATH=… .build/x86_64-apple-macosx/debug/ConcurrencyExampleとして直接実行するのはイケた。SIP関係ないのかな?
Avatar
norio_nomura 1/11/2021 5:20 AM
インストーラを介してインストールされた実行ファイルに、SIPは環境変数DYLD_LIBRARY_PATHを渡さないようにしてるのかな? 何か条件があるぽい。 $ env DYLD_LIBRARY_PATH=hoge /usr/bin/python3 -c "import os;print('DYLD_LIBRARY_PATH' in os.environ)" False $ env DYLD_LIBRARY_PATH=hoge /usr/local/bin/python3 -c "import os;print('DYLD_LIBRARY_PATH' in os.environ)" True (edited)
Avatar
/usr/bin/* のバイナリにDYLD系envが使えないっぽいんですよね (適当なところにcpすると動く)。SIPで制限されてるフォルダにあるバイナリはだめとかなのかな
Avatar
あー、だめそう
6:43 AM
iTunesとかもだめそう
6:44 AM
debuggerがアッタッチできなければSIPの影響下だと思う
Avatar
norio_nomura 1/11/2021 7:27 AM
PATH$HOME/Library/Developer/Toolchains以下にインストールしたSwiftツールチェインの/usr/binを通してDYLD_LIBRARY_PATH=… swift runしてもダメなんですよね。なので「インストーラで入れた」が条件なのかな?と。
Avatar
なにか xattr ついてないですか? (edited)
Avatar
norio_nomura 1/11/2021 9:58 AM
何もついてないですね。
Avatar
親ディレクトリから辿っても、怪しいのは無さげ。 $ xattr -rv ~/Library/Developer/Toolchains/|grep -v -E "com.apple.(cs.Code(Directory|Requirements|Requirements-1|Signature)|metadata:com_apple_backup_excludeItem|FinderInfo)"|wc -l 0 (edited)
Avatar
署名されてるとダメとか…?
Avatar
試しに.build/x86_64-apple-macosx/debug/ConcurrencyExampleをDeveloper ID Applicationで署名してみましたが、DYLD_LIBRARY_PATHは通りました。 $ swiftnightly build [1/1] Planning build [3/3] Linking ConcurrencyExample * Build Completed! $ codesign -s "Developer ID Application: Norio Nomura (PK9GMQ772L)" .build/debug/ConcurrencyExample $ codesign -vv .build/debug/ConcurrencyExample .build/debug/ConcurrencyExample: valid on disk .build/debug/ConcurrencyExample: satisfies its Designated Requirement $ DYLD_LIBRARY_PATH=~/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2021-01-09-a.xctoolchain/usr/lib/swift/macosx .build/debug/ConcurrencyExample task started { "uuid": "32cf6d86-bb2d-4089-8262-9ecfcf9d7418" } end of main
Avatar
mealHandle() の間に .get が抜けてる? func eat(mealHandle: Task.Handle<Meal, Error>) { let meal = try await mealHandle() meal.eat() // yum } https://github.com/DougGregor/swift-evolution/blob/structured-concurrency/proposals/nnnn-structured-concurrency.md
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - DougGregor/swift-evolution
Avatar
@swift-5.4.3 @swift-5.3.3 let a: [String?:String] = ["Foo":"Bar"] let b = a as [AnyHashable:String] print(b["Foo"] == "Bar") print(b["Foo" as String?] == "Bar")
Avatar
swift54 BOT 2/3/2021 6:21 AM
false true
Avatar
swift53 BOT 2/3/2021 6:21 AM
true false
Avatar
dynamic castのリファクタリングでOptionalからAnyHashableへのキャストが直感的な挙動になったけど、結局これが暗黙に変わるのは流石にマズいので5.3以前の挙動に戻りました https://github.com/apple/swift/pull/35650 (edited)
As part of making casting more consistent, the behavior of Optional -&gt; AnyHashable casts was changed in some cases. This PR provides a hook for re-enabling the old behavior in certain conte...
6:24 AM
いや、どっちもおかしいのか。本当はどっちもtrueになってほしいや。
Avatar
omochimetaru 2/3/2021 7:13 AM
なんだこれw
7:15 AM
どっちのバージョンも
7:15 AM
"foo".some("foo")
7:15 AM
AnyHashable としてみると違う値なのか?
7:16 AM
@swift-5.3.3 print(AnyHashable("foo") == AnyHashable(Optional<String>("foo"))) (edited)
Avatar
swift53 BOT 2/3/2021 7:16 AM
false (edited)
Avatar
omochimetaru 2/3/2021 7:16 AM
@swift-5.4.3 print(AnyHashable("foo") == AnyHashable(Optional<String>("foo")))
Avatar
swift54 BOT 2/3/2021 7:16 AM
false
Avatar
omochimetaru 2/3/2021 7:17 AM
違う値であるという挙動は同じで、辞書のキーになるときの挙動が違うのか?
Avatar
いや、String?からAnyHashableへの動的なキャストのタイミングで外側のオプショナルが外れるかどうかでAnyHashableの中に詰められる型が変わるんだと思います
Avatar
omochimetaru 2/3/2021 7:18 AM
あーつまりこういうことか
7:19 AM
@swift-5.3.3 @swift-5.4.3 let str = "foo" let ostr: String? = str let hstr: AnyHashable = ostr as AnyHashable print(hstr == AnyHashable(str)) print(hstr == AnyHashable(ostr)) (edited)
Avatar
swift54 BOT 2/3/2021 7:19 AM
false true (edited)
Avatar
swift53 BOT 2/3/2021 7:19 AM
false true (edited)
Avatar
omochimetaru 2/3/2021 7:19 AM
違った・・・
Avatar
それだと静的なcoerceになるんじゃないですかね
Avatar
omochimetaru 2/3/2021 7:21 AM
@swift-5.3.3 @swift-5.4.3 let str = "foo" let ostr: String? = str let tempAny: Any = ostr let hstr: AnyHashable = tempAny as! AnyHashable print(hstr == AnyHashable(str)) print(hstr == AnyHashable(ostr))
Avatar
swift54 BOT 2/3/2021 7:21 AM
false truestderr:<stdin>:3:20: warning: expression implicitly coerced from 'String?' to 'Any' let tempAny: Any = ostr ^~~~ <stdin>:3:20: note: provide a default value to avoid this warning let tempAny: Any = ostr ^~~~ ?? <#default value#> <stdin>:3:20: note: force-unwrap the value to avoid this warning let tempAny: Any = ostr ^~~~ ! <stdin>:3:20: note: explicitly cast to 'Any' with 'as Any' to silence this warning let tempAny: Any = ostr ^~~~ as Any
Avatar
swift53 BOT 2/3/2021 7:21 AM
true falsestderr:<stdin>:3:20: warning: expression implicitly coerced from 'String?' to 'Any' let tempAny: Any = ostr ^~~~ <stdin>:3:20: note: provide a default value to avoid this warning let tempAny: Any = ostr ^~~~ ?? <#default value#> <stdin>:3:20: note: force-unwrap the value to avoid this warning let tempAny: Any = ostr ^~~~ ! <stdin>:3:20: note: explicitly cast to 'Any' with 'as Any' to silence this warning let tempAny: Any = ostr ^~~~ as Any
Avatar
omochimetaru 2/3/2021 7:22 AM
お。できた。
Avatar
おー
Avatar
omochimetaru 2/3/2021 7:23 AM
5.4だと動的なキャストだとAnyHashableにStringとして入っていくと
7:23 AM
静的なコードと挙動が違うのもバグっぽいしrevertで良さそう
Avatar
dynamic castもう複雑すぎてわけわからん…
Avatar
omochimetaru 2/3/2021 7:25 AM
んーなんか
7:26 AM
他の言語だとそこまでややこしいことになってない印象があるんだけどな。
Avatar
悪いところ大体Optionalが挟まってる印象はある
Avatar
omochimetaru 2/3/2021 7:27 AM
Optionalへの暗黙変換がある事と
7:28 AM
しかし、TとT?が異なるものとして扱う場合と
7:28 AM
混在してるせいでややこしいことになっている気がするね
Avatar
根本はT is-a T?かつT?をtagged unionにした設計が誤りでしたねに尽きるんだが
Avatar
omochimetaru 2/3/2021 7:29 AM
T?? における .some(.none).none の区別とかもあるしなあ
Avatar
それのせいで、T?をAnyにキャストする時にT?として型情報を保持したままなのか、暗黙的にアンラップするのかが重なった状態になっていて(文脈によって正しい方が違う)
7:30 AM
それのせいで破綻している
7:31 AM
これがuntagged unionならアンラップしてからが正解で、is-aが存在しなければ型情報を保持するが正解 (edited)
Avatar
omochimetaru 2/3/2021 7:36 AM
@swift-5.3.3 @swift-5.4.3 func toAny<X>(_ x: X) -> Any { x as Any } let s = "foo" let os = Optional(s) let a1 = toAny(s) as! AnyHashable let a2 = toAny(os) as! AnyHashable print(a1 == a2) (edited)
Avatar
swift53 BOT 2/3/2021 7:36 AM
true (edited)
Avatar
swift54 BOT 2/3/2021 7:37 AM
false
Avatar
omochimetaru 2/3/2021 7:39 AM
5.3までの挙動は、動的な型に入れた時点では保持しているけど、比較するときに内部でis-aを考慮してるのかな。
7:40 AM
@swift-5.3.3 @swift-5.4.3 func toAny<X>(_ x: X) -> Any { x as Any } let s = "foo" let os = Optional(s) let a1 = toAny(s) as! AnyHashable let a2 = toAny(os) as! AnyHashable print(a1.hashValue, a2.hashValue, a1 == a2) (edited)
Avatar
swift53 BOT 2/3/2021 7:40 AM
4198645417467545150 4198645417467545150 true (edited)
Avatar
omochimetaru 2/3/2021 7:40 AM
いや、同じものなのか・・・?
Avatar
というかhashValue自体が型を考慮してるはず
7:40 AM
あれ、それおなじになるのか
Avatar
omochimetaru 2/3/2021 7:40 AM
hashValue同じになったんだよなあ
Avatar
@swift-5.3.3 let a = Optional.some(1) let b = 1 print(a.hashValue) print(b.hashValue)
Avatar
swift53 BOT 2/3/2021 7:40 AM
5998755465171700993 3246083455761462081
Avatar
swift54 BOT 2/3/2021 7:40 AM
4555010388509318116 7560537639487603476 false
Avatar
omochimetaru 2/3/2021 7:41 AM
5.4だと型を維持しているな
Avatar
@swift-5.3.3 @swift-5.4.3 let s = "s" let os=Optional(s) print(type(of: s), type(of: os), type(of: s as Any), type(of: os as Any)) (edited)
Avatar
swift53 BOT 2/3/2021 7:41 AM
String Optional<String> String Optional<String> (edited)
Avatar
swift54 BOT 2/3/2021 7:41 AM
String Optional<String> String Optional<String> (edited)
Avatar
5.3.3で消えてたのはAnyHashableの実装の中だね (edited)
Avatar
omochimetaru 2/3/2021 7:42 AM
そうか、typeofってそういう中身の型が出るんだっけか
Avatar
AnyHashableの実装が、値しか見ない実装になってるなら5.3.3だし、型情報も焼き込むなら、5.4devになると思う
Avatar
omochimetaru 2/3/2021 7:43 AM
@swift-5.3.3 @swift-5.4.3 let s = "s" let os = Optional(s) print(type(of: s), type(of: os), type(of: s as AnyHashable), type(of: os as AnyHashable)) (edited)
Avatar
swift53 BOT 2/3/2021 7:43 AM
String Optional<String> AnyHashable AnyHashable (edited)
Avatar
swift54 BOT 2/3/2021 7:43 AM
String Optional<String> AnyHashable AnyHashable (edited)
Avatar
ヒェッ
7:44 AM
AnyHashableへのas、値が変わるのかw
Avatar
omochimetaru 2/3/2021 7:44 AM
静的なキャストじゃだめだな・・・
7:44 AM
@swift-5.3.3 @swift-5.4.3 func toAH<X>(_ x: X) -> AnyHashable { x as! AnyHashable } let s = "foo" let os = Optional(s) print(type(of: toAH(s)), type(of: toAH(os)), type(of: toAH(s) as Any), type(of: toAH(os) as Any)) (edited)
Avatar
swift53 BOT 2/3/2021 7:44 AM
AnyHashable AnyHashable AnyHashable AnyHashable (edited)
Avatar
@swift-5.3.3 print("s" as AnyHashable as? String)
Avatar
swift53 BOT 2/3/2021 7:44 AM
Optional("s")stderr:<stdin>:1:7: warning: expression implicitly coerced from 'String?' to 'Any' print("s" as AnyHashable as? String) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <stdin>:1:26: note: provide a default value to avoid this warning print("s" as AnyHashable as? String) ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ ?? <#default value#> <stdin>:1:26: note: force-unwrap the value to avoid this warning print("s" as AnyHashable as? String) ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ ! <stdin>:1:26: note: explicitly cast to 'Any' with 'as Any' to silence this warning print("s" as AnyHashable as? String) ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ as Any
Avatar
なるほどなー
7:45 AM
@frozen struct AnyHashable
7:45 AM
まあそもそも値だったからそうか
Avatar
swift54 BOT 2/3/2021 7:45 AM
AnyHashable AnyHashable AnyHashable AnyHashable
Avatar
omochimetaru 2/3/2021 7:46 AM
typeofで中身が出るのはAnyとT特有か
Avatar
AnyというかExistentialというか
Avatar
Existentialだからですね
Avatar
omochimetaru 2/3/2021 7:49 AM
@swift-5.3.3 @swift-5.4.3 func toAH<X>(_ x: X) -> AnyHashable { x as! AnyHashable } let s = "foo" let os = Optional(s) let a1 = toAH(s) let a2 = toAH(os) print(a1 == a2, a1.hashValue, a2.hashValue)
Avatar
swift54 BOT 2/3/2021 7:49 AM
false 7411312793998186712 -1838519281677881482
Avatar
swift53 BOT 2/3/2021 7:49 AM
true -7218179261913021143 -7218179261913021143
Avatar
omochimetaru 2/3/2021 7:50 AM
5.4は String? を動的に AnyHashable にするときに String? を包んだものとしてキャストしていて
7:50 AM
5.3は アンラップして String をキャストしたものになる
Avatar
うむ
Avatar
omochimetaru 2/3/2021 7:51 AM
5.3でおかしいのは
7:52 AM
辞書のキーとして比較するときに
7:52 AM
その挙動が生じていないことかな?
7:54 AM
@swift-5.3.3 func toAH<X>(_ x: X) -> AnyHashable { x as! AnyHashable } let s = "foo" let os = Optional(s) let a1 = toAH(s) let a2 = toAH(os) let d1: [AnyHashable: Int] = [s: 1] let d2: [AnyHashable: Int] = [a1: 1] print(d1[s] ?? 99, d1[os] ?? 99, d1[a1] ?? 99, d1[a2] ?? 99) print(d2[s] ?? 99, d2[os] ?? 99, d2[a1] ?? 99, d2[a2] ?? 99) (edited)
Avatar
swift53 BOT 2/3/2021 7:54 AM
1 99 1 1 1 99 1 1 (edited)
Avatar
omochimetaru 2/3/2021 7:57 AM
これはバグだろう!
7:58 AM
あ、 d1[os] のときにやってるのは静的な方か?
Avatar
5.3でおかしいのはOptional<T>とT where T: HashableをAnyHashableで静的にキャストするときにOptionalのunwrapが行われないことだと思います
7:58 AM
そうそう
7:58 AM
As part of making casting more consistent, the behavior of Optional -&gt; AnyHashable casts was changed in some cases. This PR provides a hook for re-enabling the old behavior in certain conte...
Avatar
omochimetaru 2/3/2021 7:59 AM
静的な T? as AnyHashable のとき、アンラップしなかった方のAH が生成されるんだね
Avatar
静的なキャストか動的なキャストになるかは見分けるのが凄く難しい…
Avatar
omochimetaru 2/3/2021 8:02 AM
それで挙動違うのだめだよなあ
Avatar
こういうのがあると最適化で動的なキャストを静的にするとかがやりにくくなりそう
8:04 AM
例えばスペシャライズされてジェネリック型変数Tが具体型に固定された場合とか
Avatar
omochimetaru 2/3/2021 8:05 AM
スペシャライズするかどうかで結果が変わるコード作れそうな気が
8:06 AM
動的キャストのコード生成が先だから大丈夫なのかも?
8:06 AM
スペシャライズされた結果、静的な型を動的キャストに渡すコードが残る・・・
Avatar
norio_nomura 2/8/2021 5:24 AM
macOS Big Sur 11.2 & Xcode 12.4環境で、macOS版OSS ToolchainのSwift REPLを起動出来ない。エラーメッセージ的にはこれ https://bugs.swift.org/browse/SR-14098 手元ではswift-5.0.3-RELEASEは起動できるけど、それ以降の5.1.5, 5.2.5, 5.3.3リリースおよび5.4, mainスナップショット全部起動出来ない。
Avatar
omochimetaru 2/12/2021 2:25 AM
Hi everyone, Swift is applying to participate in Google Summer of Code this year again. We had some great projects last year (4 out of 4 completed successfully), and this year we wanted to give the community a little bit of a heads up, so you can also come up with your own ideas in case you have some you would like to propose and find a mentor...
2:25 AM
GSoC 2021のアナウンスだ
2:25 AM
We had some great projects last year (4 out of 4 completed successfully),
2:25 AM
マージされていない家庭くんの成果も成功したことになっている
🙃 1
😂 3
2:26 AM
Scripting in Swift
おおお、テーマ候補に良いのがある
(edited)
2:27 AM
Increase differentiable programming’s language coverage
微分のやつもある。最近話題がなかったけど息してた
Avatar
今回から 18 hours a week のコミットメントなので、日本の学生も参加しやすくなっていると思います。
2:30 AM
(前回までは 30 hours a week)
Avatar
omochimetaru 2/12/2021 2:31 AM
ああ〜 家庭くんめっちゃ忙しそうだったやつ
Avatar
Kishikawa Katsumi 2/12/2021 12:53 PM
XcodeのSwitch文でCaseを生成してくれるやつ、caseのbodyのところ、<#code#>じゃなくてbreakを入れてくれた方がリズムよく書ける気がする。
12:54 PM
switch rpcMessageType { case .playAnimation: <#code#> case .completeTask: <#code#> case .syncSettings: <#code#> case .setInfected: <#code#> ... 今はこんな感じに生成されるけど、<#code#> のところbreakがいい、気がする。
Avatar
あーなんかそれがあるとTAB押したときに次の code に行っちゃうのが不便なときはある
12:57 PM
まだ .playAnimation: の本文を書いてるからインデントしたいのに .completeTAskのプレースホルダに行ってしまう・・・という挙動だった気がする?
Avatar
Kishikawa Katsumi 2/12/2021 12:59 PM
引数とかの部分はキレイに展開してくれたりするからプレースホルダはすごく便利だけど、こういうただ消すだけのプレースホルダはあまり嬉しくない。。。とりあえずコンパイルが通るコードが生成されてほしい。。。
Avatar
これ↓めっちゃ便利じゃないですか? infix operator ..<?: RangeFormationPrecedence func ..<?<T>(lhs: T, rhs: T) -> Range<T>? where T: Comparable { guard lhs <= rhs else { return nil } return lhs ..< rhs } infix operator ...?: RangeFormationPrecedence func ...?<T>(lhs: T, rhs: T) -> ClosedRange<T>? where T: Comparable { guard lhs <= rhs else { return nil } return lhs ... rhs }
👀 1
Avatar
https://forums.swift.org/t/swift-panel-at-the-community-o-summit/45041 LLVM財団のオンラインイベントです。LLVM Developers Meeting よりはもっと軽い感じだと思います。Swiftの開発者も参加するので、興味があったら是非参加してみてください。
Hi Everyone, We're happy to announce the Community.o Summit, which is held virtually March 8-10, 2021 by the LLVM Foundation. This 3-day virtual event is an inclusive space for underrepresented groups and newcomers, anywhere in their career, interested in learning and contributing to compilers, tools, and programming languages. We’ll highlight ...
👀 1
Avatar
今年のLLVM Developers Meeting 結局理解できたのkeynote だけだった。。。
Avatar
今回のイベントはコンパイラ技術云々とかより、開発コミュニティにフォーカスしていて、皆がどんな感じでコンパイラ開発の世界に入っていったのかとか、そのあたりの雰囲気がつかめるのかなと思います。
Avatar
よさそう
Avatar
"zatsu" じゃないけど "1" も "2" も会話が続いてそうなのでここに。 Actors の Proposal が Evolution に追加されたようです! SE-0306: Actors https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
omochimetaru 3/12/2021 2:59 AM
いまピッチ6になってますね そろそろ来るのかな
Avatar
Evolutionに3時間前に追加されてて、SE-0306のナンバーも振られて、レビューの日程も入ってるので来るんじゃないでしょうか。
Avatar
omochimetaru 3/12/2021 3:00 AM
Thanks Doug, I'm glad to see nonisolated(unsafe) get subsetted out of this round of the proposal. Much of my feedback from the 5th draft last night stands, including: Actor protocol should be named AnyActor for consistency with AnyClass and other type erased things in Swift. isolated self doesn't really work for the same reason we don't use...
3:01 AM
ラトナーが、寝て起きて思ったんだけど、ってめっちゃ書き込んでたりする
Avatar
Joe_Groff 3h I have merged this pitch as proposal SE-0306 21, and scheduled it for review starting next Monday.
Avatar
omochimetaru 3/12/2021 3:01 AM
お、予告だ
Avatar
Proposal の方にも
Status: Scheduled for Review (March 15...29, 2021)
って書かれてる。
Avatar
omochimetaru 3/12/2021 6:23 AM
This is a full proposal for the Swift Forums pitch Allow interchangeable use of CGFloat and Double types
6:23 AM
CGFloat暗黙変換も Scheduling for next Monday. されとる (edited)
Avatar
CGFloat が Double じゃない環境はもうどこにもないんだっけ
Avatar
omochimetaru 3/12/2021 6:24 AM
armv7が動くAndroid環境があるって書き込みを見た
6:24 AM
Pitch: Allow interchangeable use of CGFloat and Double types Implementation: PR [DNM][TypeChecker] Implement Double <-> CGFloat implicit conversion by xedin · Pull Request #34401 · apple/swift · GitHub based on the main branch. Toolchains are available for macOS and Linux. Motivation When Swift was first released, the type of CGFloat presented ...
Avatar
これを機会に Scala的な implicit が導入されると黒魔術が使えて嬉しい
Avatar
omochimetaru 3/12/2021 6:26 AM
それはやばい・・・ この話はコンパイラの特別対応っぽいですね
Avatar
楽しいと思うんだけどなあ...
6:27 AM
使うとcode reviewでめっちゃえーーーって言われるimplicit
Avatar
omochimetaru 3/12/2021 6:27 AM
ww
6:28 AM
でもまあSwiftにはextensionもあるし、protocolの型クラス的振る舞いもあるので
6:28 AM
Scalaのimplicitの主要なユースケースはカバーできてませんか?
Avatar
できてると思う。
Avatar
omochimetaru 3/12/2021 6:29 AM
もしちょっとぐらい微妙に残ってても、そこだけ言語機能を提供すれば良さそう
Avatar
Double を CGFloat にしたいなんて、それなんて JavaConverters っていう感じ
Avatar
omochimetaru 3/12/2021 6:30 AM
なるほど
Avatar
omochimetaru 3/22/2021 6:44 PM
Hello! My name is Tomoaki Kobayashi and I am an undergraduate student in Japan. I am interested in the project and started to read the related codes like TypeCheckConstraints, ConstraintSystem, and CSSolver a little bit. @hborla @xedin Do you have a typical example where a confusing type is inferred? If we also consider type errors in that c...
6:45 PM
GSoCに日本人がエントリーしてる
👀 1
Avatar
suffix(while:) ってなんでないんですっけ?普通にほしい気が。
2:59 AM
英語として suffix の場合 while のニュアンスが変?
Avatar
omochimetaru 3/30/2021 3:03 AM
Swift Algorithms is an open-source package of sequence and collection algorithms, along with their related types. - apple/swift-algorithms
👀 1
3:03 AM
ここにはあった
3:06 AM
単に どこまで入れればいいかわからんからとりあえずなしで になっていたんじゃなかろうか
3:07 AM
prefix while と suffix length がある以上、計算量的な問題とかで入れなかったわけではなさそう。
Avatar
@swift-5.3.3 let a: Int if Bool.random() { a = 2 } else { a = 3 } print(a)
Avatar
swift53 BOT 4/5/2021 8:34 AM
3
Avatar
@swift-5.3.3 let a: Int? if Bool.random() { a = 2 } else { a = nil } print(a)
Avatar
swift53 BOT 4/5/2021 8:35 AM
nilstderr:<stdin>:7:7: warning: expression implicitly coerced from 'Int?' to 'Any' print(a) ^ <stdin>:7:7: note: provide a default value to avoid this warning print(a) ^ ?? <#default value#> <stdin>:7:7: note: force-unwrap the value to avoid this warning print(a) ^ ! <stdin>:7:7: note: explicitly cast to 'Any' with 'as Any' to silence this warning print(a) ^ as Any
Avatar
Optional って遅延初期化できないの?
Avatar
omochimetaru 4/5/2021 8:35 AM
できてませんか?
Avatar
できてません?これはprintにoptional渡したときの警告 (edited)
Avatar
あれ?警告か。
8:36 AM
なんで手元ではエラーになってるんだ・・・。
8:36 AM
あ、ミスってた。手元のより複雑なコードでは if let でシャドーイングされてた・・・。すみません。
Avatar
Avatar
omochimetaru
prefix while と suffix length がある以上、計算量的な問題とかで入れなかったわけではなさそう。
suffixまわりが弱い理由ってそうじゃないんだ... (edited)
5:52 PM
なんか対称性が崩れててきもいって思ってた&いろいろ実装でめんどうだった
Avatar
BidirectionalCollection は逆順に数え上げられるCollectionなのでここに生やせば問題ないです
Avatar
Avatar
masakihori
BidirectionalCollection は逆順に数え上げられるCollectionなのでここに生やせば問題ないです
omochimetaru 4/6/2021 7:07 AM
そもそもSequenceにsuffixがあるんですよ https://developer.apple.com/documentation/swift/sequence/3128822-suffix
7:13 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
7:13 AM
普通に全要素吸い出してる
Avatar
まじか! 無限に長いSequenceに注意が必要
7:47 AM
じゃなくて、無限に長くなくても計算量がヒドイ
Avatar
omochimetaru 4/6/2021 7:48 AM
Complexity: O(n), where n is the length of the sequence.
O(n)明示されてますね。
Avatar
なんか基準が謎だなぁ。 O(n) 許すなら Sequence に subscript(index: Int) が生えててもいい気も。さすがに subscript は勘違いしそうかもしれないけど。
Avatar
変数(subscriptおよびcomputed propertyを含む)はO(1)必須で、関数はO(n)でもオッケーという基準だと思う (edited)
Avatar
それだとプロパティの firstSequence に生えてても良さそう?
Avatar
omochimetaru 4/6/2021 9:52 AM
Sequenceってfirst whereしかなかったのか・・・
9:53 AM
first whereのwhereが { true } の場合と等価だから
9:53 AM
そもそもあって良さそうですね。
Avatar
first(where:) は一応最悪O(N)では (edited)
Avatar
extension Sequence { var first: Element? { var iterator = makeIterator() return iterator.next() } }
9:59 AM
↑で O(1)
Avatar
@swift-5.3.3 let a: [Int] = [2, 3, 5] let i: [Int].Iterator = a.makeIterator()
Avatar
swift53 BOT 4/9/2021 4:51 AM
exit status: 1 with stderr:<stdin>:2:13: error: consecutive statements on a line must be separated by ';' let i: [Int].Iterator = a.makeIterator() ^ ; <stdin>:2:14: error: member 'Iterator' in 'IndexingIterator<[Int]>' produces result of type 'IndexingIterator<[Int]>.Iterator.Type' (aka 'IndexingIterator<Array<Int>>.Type'), but context expects 'IndexingIterator<[Int]>' let i: [Int].Iterator = a.makeIterator() ^
Avatar
@swift-5.3.3 let a: [Int] = [2, 3, 5] let i: Array<Int>.Iterator = a.makeIterator()
Avatar
swift53 BOT 4/9/2021 4:51 AM
no output
Avatar
そういうものなんですっけ?
Avatar
いちおうそういう物なんですよね。. でつなぐメンバータイプは文法上 type identifier のみに設定されているのです。
4:56 AM
@swift-5.3.3 let a = [Int].Element() print(a) ただこれは動いちゃうのです。なぜならこれは文法上 type じゃなくて expression としてパースされるから。
Avatar
swift53 BOT 4/9/2021 4:56 AM
0
Avatar
仕様バグといえばその通り。
Avatar
type には array-type が含まれてるけど、 type-name には array-type は含まれないってことですね。 https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type
👍 1
Avatar
Kishikawa Katsumi 4/10/2021 5:26 PM
SwiftFiddle is an online playground for creating, sharing and embedding Swift fiddles (little Swift programs that run directly in your browser).
5:26 PM
5.3以上の環境でいくつかライブラリを利用できるようにしてみた。
🙌 5
Avatar
yutailang0119 4/11/2021 8:57 AM
すごい、遊びやすい
Avatar
Kishikawa Katsumi 4/11/2021 10:43 AM
これが入ってたら良い、、、っていうの教えてくれたら入れられそうなもの(SPMですっとビルドできる、Linuxで動く、など)はとりあえず入れます。
Avatar
OrderedDictionaryいいね
💃 1
Avatar
Optionalの記事書きつつちょいとサーベイしてたら見つけてしまったw @swift-5.3.3 let s: String? = .none let t: String?? = s let u: String?? = .none let x = (s as AnyHashable).hashValue let y = (t as AnyHashable).hashValue let z = (u as AnyHashable).hashValue print(s == t, x == y) print(s == u, x == z)
Avatar
true false false true
Avatar
ほんまめちゃくちゃやで
Avatar
これはひどいww
Avatar
これって間違ってるんですかね? ハッシュはa == b -> a.hashValue == b.hashValueのはずですが、 ここでは型が一致していないので、xy,zを並べて良いものか怪しい気がします。 s == ts==uは暗黙的にOptional`に包まれるのもありますし。
Avatar
THashable, ∀a,bT, a == b -> a.hashValue == b.hashValue 定義がこんな感じだとすると、String?String??で型が一致していない場合は前提が崩れるのでhashValueについては何も言えないはずです。
Avatar
上の方で話題になった https://discord.com/channels/291054398077927425/375206337937801216/806409093417533462 に関連して何ですけど、Optionalのラップでハッシュ値がズレるのは良いと思うんですよ
1:12 AM
どっちかと言えば.noneが型に関わらず同じハッシュ値を示すのが気持ち悪いな、と言うところです
Avatar
定義的には反してないので実装次第ですね。
1:19 AM
@swift-5.3.3 var s1 = "Foo" var s2 = Optional("Foo") print(s1.hashValue, s2.hashValue) print((s1 as AnyHashable).hashValue, (s2 as AnyHashable).hashValue) print((s1 as! AnyHashable).hashValue, (s2 as! AnyHashable).hashValue)
Avatar
-4610515456940335649 5550570105904624955 -4610515456940335649 5550570105904624955 -4610515456940335649 -4610515456940335649stderr:<stdin>:5:11: warning: forced cast from 'String' to 'AnyHashable' always succeeds; did you mean to use 'as'? print((s1 as! AnyHashable).hashValue, (s2 as! AnyHashable).hashValue) ^~~ as <stdin>:5:43: warning: forced cast from 'String?' to 'AnyHashable' always succeeds; did you mean to use 'as'? print((s1 as! AnyHashable).hashValue, (s2 as! AnyHashable).hashValue) ^~~ as
Avatar
asas! で変わるのか🤔
Avatar
親切なwarning出てるけど挙動違うから罠だ
Avatar
何が悪いって暗黙の型変換が悪くて、暗黙の型変換をサブタイピングのように振る舞わせてるからこういうところに歪みが出てくる。
Avatar
記事書きつつここの議論を踏まえた上で、私の中に 1. 暗黙の型変換(auto boxingもしくはそれ相当)をサブタイピングとして扱うことはやるべきではない(あくまで型変換に留まらせるべきである) 2. もし暗黙の型変換をサブタイピングとして扱うことを許容したとしても、逆向きの暗黙のアンラップは許容するべきではない と言う仮設が構築されつつある
1:34 PM
おそらくですが、swiftのサブタイピングにおいてTとT?が特にヤバくて、T?とU?は許容できる可能性がありそう(ちゃんと考えてない)
4:12 AM
3,000個のプロパティがあると遅くなるらしい
Avatar
Kishikawa Katsumi 4/27/2021 4:12 AM
自動生成したモデルとかでぶつかったりしそう
Avatar
自動生成でも3,000もひとつのクラスに状態があるのやばそう (edited)
Avatar
Kishikawa Katsumi 4/27/2021 4:14 AM
そうですねえ。コンパイルエラーでもいい気はするけどそういう分野のプログラミングもきっとありそう。
4:14 AM
バグレポートが出てるということはそういうことなんだろうな。
Avatar
Compiling one of our generated classes takes nearly 10x longer with Swift 5.4 than the last few releases - and this class already took a minute or two to compile 😬 pretty big regression https://t.co/5wVllUx1W8
4:15 AM
Square...
4:15 AM
ひょっとすると AppState みたいなクラスがあって、アプリケーションの状態を全部もってるのかも。
Avatar
Kishikawa Katsumi 4/27/2021 4:16 AM
ありそう。
Avatar
あるいは、UIの自動テストとかでそういうクラスつくってるのかなあ。
Avatar
Kishikawa Katsumi 4/27/2021 4:17 AM
Reduxで、でかいStructが問題になることはなんか結構前にみました。リリースビルドでしか動かない、だったかな。
4:17 AM
ありそう
Avatar
omochimetaru 4/27/2021 4:17 AM
スタックが吹っ飛びそう
Avatar
なんというか ractive系のそれはいろいろ見るたびにめっちゃ富豪...って思う昨今
Avatar
omochimetaru 4/27/2021 4:19 AM
コンパイラ実装の中にうっかりプロパティ数に対して O(n^2) な部分が隠れてるとか
4:19 AM
そういう原因な気がする
Avatar
そんな感じでしょうね...
Avatar
@simjp It’s a file of generated constants for our design system. The constants are shared across iOS, web and android, and there’s constants for styling every aspect of many different components, so it adds up.
4:52 PM
意外すぎる理由
Avatar
omochimetaru 4/27/2021 5:09 PM
グループごととかに型切ってわけられそう
Avatar
Kishikawa Katsumi 5/18/2021 12:31 AM
Swift Systemが謎のタグ名のルール変更してる。v付きだとSwift Package Managerに怒られるんだけどな。 (edited)
Avatar
issue立てても良いのでは
Avatar
Avatar
tarunon
issue立てても良いのでは
Kishikawa Katsumi 5/18/2021 1:45 AM
そうかも。ちょっと触ってみて問題ありそうだったらやってみます。 Renovateがこのタグで自動的にVer UpのPRを出してそれで"v0.0.2"が正しくない、って出てたんですよね。
1:49 AM
0.0.2と書けばいけるしXcodeは自動的にvを省いてくれるっぽいな。 Renovateが壊れるだけだけどそのことを一応報告しておくことにします。
Avatar
Kishikawa Katsumi 5/18/2021 2:16 AM
The tag for version 0.0.2 now has a prefix of v, unlike the previous tag, which is now v0.0.2. This will affect automatic updates of Renovate (https://github.com/apps/renovate). Renovate will autom...
👍 2
Avatar
Kishikawa Katsumi 5/18/2021 3:20 AM
直してくれた☺️(新しく0.0.2のタグがついた)
👍 5
Avatar
vつきは消さないのかな…
Avatar
yutailang0119 5/18/2021 4:04 AM
What Renovate type, platform and version are you using? Renovate for GitHub Describe the bug If tags rule of the target repository has a prefix, Renovate will insert it as a version. In this case, ...
Avatar
Kishikawa Katsumi 5/18/2021 4:04 AM
互換性の問題があるんじゃないですか。いや、vはXcodeとかが勝手に削除するから実はないのか。。。?
Avatar
GitHubがおすすめしてきたからつけちゃったてきな…
4:07 AM
vつける作法のパッケージもあるからなあ
4:08 AM
人類にsemverタグはまだ早かった
Avatar
Kishikawa Katsumi 5/18/2021 4:09 AM
まあv付けると検索のところでとりあえずvって入れるとタグだけになる、からちょっと便利、と思っています。メリットはそれくらい。
Avatar
数字だけだと不安になる気持ちもわかる
Avatar
Avatar
yutailang0119
prefix、renovateで困ってる https://github.com/renovatebot/renovate/issues/9077
Kishikawa Katsumi 5/18/2021 4:15 AM
同じ問題の人がいてよかった。Renovateの方で吸収してくれるのが一番丸く収まりそう。
Avatar
Avatar
Kishikawa Katsumi
同じ問題の人がいてよかった。Renovateの方で吸収してくれるのが一番丸く収まりそう。
yutailang0119 5/18/2021 4:17 AM
renovateのコード読んで、なんとなくはわかったけど、自信ないからコアチーム頼む!って気持ちでした!
4:18 AM
世間だと困ってる人少なくて、本当に?って思ってる
Avatar
Kishikawa Katsumi 5/18/2021 4:19 AM
Renovateをもっと布教していかなかければ。 ただまあ別に解説が必要だったりは全然ないんですよね。ボタンポチッと押してリポジトリ選ぶだけ。。。
Avatar
A new tool that blends your everyday work apps into one. It's the all-in-one workspace for you and your team
Avatar
Kishikawa Katsumi 5/18/2021 7:25 PM
この辺りもう少し厳密な表現がありそう。
7:26 PM
ModuleはAppバンドル(実行形式)やFramework、Libraryを含む、で
7:27 PM
概念としてはこういう包含関係で、
7:28 PM
ModuleならばImportできる、はきっと正しい
Avatar
内容以外では、swiftと、Swift、コンパイルとLinkとか、表記の揺れが気になった
🙏 1
Avatar
Kishikawa Katsumi 5/18/2021 7:30 PM
「アプリに追加するためには」は要するに「Linkできる」が厳密だと思うので
7:30 PM
こう。
7:31 PM
StaticかDynamicという分類はたぶん自明だからいいとして、LibraryかFrameworkか、というのは少なくともApple Platformでは
7:33 PM
Bundleの有無という切り口がある
7:33 PM
めっちゃ機械的に整理するとこうかなあ。見落としとかはありそう。
7:35 PM
すごく広義の意味のコンパイラの生成物の単位をモジュールと呼んでいて、モジュールにはAppバンドルやフレームワークバンドル、ライブラリなどがある。
Avatar
Kishikawa Katsumi 5/18/2021 7:43 PM
上で書いたLinkできるというのもだいぶいい加減だな。 実行形式のモジュールにリンクできるモジュール、でいいのか?
Avatar
Swiftモジュールとバンドル形式(.framework、.bundle)とライブラリの動的静的はそれぞれ直交する概念じゃないですか? (edited)
Avatar
SwiftモジュールはSwiftの言語上の概念で、大雑把にimportできるインターフェイスの単位と言ってあっていると思います。ただ、モジュール自体はリンクの方法やパッケージング方式には関与しません。 ライブラリ(.a, .dylib)はリンカによってリンクされる単位で、Swiftの文化では基本的にモジュールと1対1に対応していますが、絶対にそうでないといけないというわけでもないです。 バンドル形式(.app, .bundle, .framework)はAppleプラットフォームで使える取り回しのしやすいリソースのパッケージング形式で、プログラム(ライブラリや実行形式)とヘッダファイル(.hやSwiftのモジュールファイル)とリソースをまとめるモノという理解です。 https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html
Explains how to use bundle objects to organize resources.
12:38 AM
3. それぞれの.oを一つにまとめてそのモジュールの .o (Object Code) を生成する(これをLinkという)
おそらく、これは.oをarでまとめて.aを生成するアーカイブだとおもいます(多分…) 手元で試してみたんですが、生成されているのはちゃんと再配置可能なオブジェクトファイルでした。🙇 アーカイブにすると使われないシンボルがリンクされなくて困るからなのかな?ライブラリを使う側でオブジェクトファイルを列挙すればいい気がするけど…(SwiftPMはそうなってる)
(edited)
Avatar
起きたらコメントがついててうれしい ビルドのログみながら挙動を見つめたせいで概念的なところの理解が怪しいので整理いただいてありがたいです🙇 FrameworkとLibraryの関係がまだいまいちわかってないかも。 Frameworkの中にar archiveがアーキテクチャごとに入っているので、Apple platformで使いやすくしたというのはなんとなくそうなのかもと思った
Avatar
Avatar
Yuta Saito
Swiftモジュールとバンドル形式(.framework、.bundle)とライブラリの動的静的はそれぞれ直交する概念じゃないですか? (edited)
Kishikawa Katsumi 5/19/2021 3:21 AM
それぞれ直交する概念
そう思います。 で、で、ModuleとFrameworkの違い、って問いの答えとして、 FrameworkはModuleの1つだけど、こういう特徴を持つものは(Apple Platformで)Frameworkという、ということでリンク可能とかバンドルを持つ、とかいくつかの視点よって分類される、というのが私の論点です。
Avatar
Avatar
Kishikawa Katsumi
それぞれ直交する概念
そう思います。 で、で、ModuleとFrameworkの違い、って問いの答えとして、 FrameworkはModuleの1つだけど、こういう特徴を持つものは(Apple Platformで)Frameworkという、ということでリンク可能とかバンドルを持つ、とかいくつかの視点よって分類される、というのが私の論点です。
FrameworkはModuleの1つだけど
FrameworkはModuleを内部に持つ、ですかね?僕の言うModuleは.swiftmoduleかmodule.mapなんですが認識一致してますか?
いくつかの視点よって分類される
これには同意できます👍
(edited)
Avatar
Kishikawa Katsumi 5/19/2021 4:21 AM
FrameworkはModuleを内部に持つ、ですかね?僕の言うModuleは.swiftmoduleなんですが認識一致してますか?
あってます。確かに「FrameworkはModuleを内部に持つ」の方が厳密ですね。 ただ「Moduleは.swiftmodule」なんですけどモジュールとフレームワークの違い、という問いに具体例を挙げていくなら とりあえずモジュールとフレームワークが1対1で対応する場合、みたいな前提を一旦おいた方がわかりやすい、と思います。
4:22 AM
で、それを理解していると、複数のモジュールから1つのフレームワークが構成されることもある、 ライブラリのモジュールはライブラリのもつInterfaceの一部だけを公開していることもある、 みたいな説明も理解できると思います。 (edited)
4:27 AM
いや、さっきの図で言うと最初からswiftmoduleかmodule.mapを出して説明した方がいいかなあ?
Avatar
なるほど。僕がモジュールとフレームワークの違いについて答えるとしたらこうなりますね↓ 「モジュールはライブラリから提供されるSwift APIを記したモノで、フレームワークはモジュールとライブラリとリソースアセットを一纏めにしたもの。ライブラリを配布するときは構成要素がバラバラだと使う側が大変なのでフレームワークとして提供することが多い。」
💯 2
Avatar
Kishikawa Katsumi 5/19/2021 4:28 AM
^ これは端的で過不足ないカンペキな説明だと思います。
Avatar
もともとmoduleは#includeやばいってclangで作られたのだけど、swiftmoduleも同じかんじかな? (edited)
Avatar
ただ、万人にとって理解しやすいかと言われると自信がないので、岸川さんの一旦1対1対応を前提においた説明もありだと思います。 😅
Avatar
Avatar
niw
もともとmoduleは#includeやばいってclangで作られたのだけど、swiftmoduleも同じかんじかな? (edited)
そうですね、module.mapとそれに付随するヘッダ郡がSwiftだとswiftmoduleに対応してます (edited)
Avatar
Avatar
Yuta Saito
そうですね、module.mapとそれに付随するヘッダ郡がSwiftだとswiftmoduleに対応してます (edited)
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
Avatar
Yuta Saito
そうですね、module.mapとそれに付随するヘッダ郡がSwiftだとswiftmoduleに対応してます (edited)
ややこしくして申し訳ないけど、現 Swift では module.modulemap + ヘッダ群にあたるのは .swiftinterface ですね。
Avatar
Avatar
rintaro
ややこしくして申し訳ないけど、現 Swift では module.modulemap + ヘッダ群にあたるのは .swiftinterface ですね。
むむっ...
Avatar
.swiftmodule.swiftinteface のバイナリ表現(キャッシュ)で clang でいうところの .pcm (edited)
Avatar
あー、たしかに.swiftmoduleはprecompiled moduleですね。
Avatar
なるほど
Avatar
Kishikawa Katsumi 5/19/2021 4:37 AM
swiftinterfaceはライブラリエボリューションを有効にしないと出ないんじゃないですか?
4:37 AM
出るんでしたっけ?
Avatar
手元では出てない
Avatar
.swiftinterface は後方互換性あるけど、 .swiftmodule は生成したコンパイラバージョンでしか読めない。で、配布しないモジュールは後方互換性を確保する必要が無いので、.swiftinterface を出す必要がないので出してないノだと思います。
4:42 AM
で、framework に .swiftmodule を入れられて、それが import できる、つまり .swiftinterface の代わりに(コンパイラのバージョンが一致していれば) .swiftmodule を使うことができる状態になっている。
😯 1
🆒 1
👍 1
Avatar
.swiftinterface.swiftmodule のどっちが「正」かっていうのは議論あるかも。 https://forums.swift.org/t/explicit-module-builds-the-new-swift-driver-and-swiftpm/36990 ここでは "there are four forms of module"
Hi all, In the llbuild2 announcement, @ddunbar mentioned the goal of supporting "explicit modules" in the build system. I wanted to describe what explicit modules are, why they are important, and the developer work we're doing to bring the benefits of explicit module builds to SwiftPM. Modules in Swift Swift programs are composed of a number o...
Avatar
omochimetaru 5/19/2021 6:56 AM
swiftinterfaceが正だと思うなあ
6:57 AM
swiftmoduleは最適化されたバイナリ版なので。 デフォルトでどっちが吐かれるかという事はどっちが正かということとは関係ないし。
Avatar
@swift-5.3.3 @swift-5.4.3 protocol P {} struct S: P {} func check(_ maybeS: S?) { print("maybeS = \(maybeS)") print("maybeS is P = \(maybeS is P)") print("maybeS as Any is P = \(maybeS as Any is P)") print("------------------------------------------") } check(S()) check(nil)
Avatar
maybeS = Optional(main.S()) maybeS is P = true maybeS as Any is P = true ------------------------------------------ maybeS = nil maybeS is P = false maybeS as Any is P = false ------------------------------------------stderr:<stdin>:6:23: warning: string interpolation produces a debug description for an optional value; did you mean to make this explicit? print("maybeS = \(maybeS)") ^~~~~~ <stdin>:6:23: note: use 'String(describing:)' to silence this warning print("maybeS = \(maybeS)") ^~~~~~ String(describing: ) <stdin>:6:23: note: provide a default value to avoid this warning print("maybeS = \(maybeS)") ^~~~~~ ?? <#default value#> <stdin>:7:35: warning: checking a value with optional type 'S?' against dynamic type 'P' succeeds whenever the value is non-nil; did you mean to use '!= nil'? print("maybeS is P = \(maybeS is P)") ~~~~~~ ^~~~ != nil
Avatar
maybeS = Optional(main.S()) maybeS is P = true maybeS as Any is P = false ------------------------------------------ maybeS = nil maybeS is P = false maybeS as Any is P = false ------------------------------------------stderr:<stdin>:6:23: warning: string interpolation produces a debug description for an optional value; did you mean to make this explicit? print("maybeS = \(maybeS)") ^~~~~~ <stdin>:6:23: note: use 'String(describing:)' to silence this warning print("maybeS = \(maybeS)") ^~~~~~ String(describing: ) <stdin>:6:23: note: provide a default value to avoid this warning print("maybeS = \(maybeS)") ^~~~~~ ?? <#default value#> <stdin>:7:35: warning: checking a value with optional type 'S?' against dynamic type 'P' succeeds whenever the value is non-nil; did you mean to use '!= nil'? print("maybeS is P = \(maybeS is P)") ~~~~~~ ^~~~ != nil
Avatar
T is Pのとき、5.3だとT?をAnyに包むとPにキャストできなかったんですが、5.4の新しいキャストロジックではキャストできるようになってるんですよね (edited)
9:12 AM
バグチケットはこれだ SR-1999 https://bugs.swift.org/browse/SR-1999
9:15 AM
で、IBLinterに5.3の挙動に依存した実装があって、macOS11.3に同梱されてる5.4のランタイムだとバグる事故が発生しました。
9:17 AM
キャストロジック難しすぎる
Avatar
omochimetaru 6/5/2021 6:21 AM
うーん、Xcodeのテスト実行からだと Foundation.Process/usr/bin/swiftc を実行しようとすると、 2021-06-05 15:20:12.963749+0900 swiftc[99910:13408271] Failed to open macho file at /Applications/Xcode12.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links
Avatar
ループしてる?
Avatar
omochimetaru 6/7/2021 2:14 AM
そう思ったんですけど、 /Applications/Xcode12.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc が -> swift-frontend にリンクしてるだけで終わりなんですよね。 (edited)
2:14 AM
もしかしたら swiftc じゃなくて、そこから開こうとしてるdylibがループしているとかかもしれないんですが
2:14 AM
調べ方がわからず。
Avatar
dyldのエラーなら環境変数いれればログ出せる
Avatar
omochimetaru 6/7/2021 2:15 AM
man dyld 見たけど多すぎてよくわからなかった・・・
Avatar
PRINTなんとかってやつだったかな、、
Avatar
DYLD_PRINT_LIBRARIES
Avatar
omochimetaru 6/7/2021 2:16 AM
Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' started. generate: Command-SE0295.gen.swift 2021-06-07 11:16:01.228423+0900 swiftc[77103:15204344] Failed to open macho file at /Applications/Xcode12.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' passed (1.409 seconds).
2:16 AM
しかもなんかエラーが出てるのにコンパイルできて?うごくんだよな
Avatar
なんじゃそりゃw
Avatar
omochimetaru 6/7/2021 2:16 AM
あいや、これ空のテストになっちゃってるのかな?
2:17 AM
エラーが素通りしてるかも。
Avatar
Avatar
omochimetaru
うーん、Xcodeのテスト実行からだと Foundation.Process/usr/bin/swiftc を実行しようとすると、 2021-06-05 15:20:12.963749+0900 swiftc[99910:13408271] Failed to open macho file at /Applications/Xcode12.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links
そもそもこのエラーは誰が出してるんだろう
Avatar
machoがひらけねーよって言ってるからlibcかdylib?
Avatar
omochimetaru 6/7/2021 2:19 AM
ちょっと打ち合わせなので後で確認しますね
2:19 AM
You can generate Swift source code of enum with associated values which complies with SE-0295. - omochi/SE0295Polyfill
👀 1
2:19 AM
これクローンしてXcodeで開いてテストするだけ。
Avatar
手元にあったdyldのソースにはToo many levels... の文字列はなかった
Avatar
Foundation.Processつかってるのはどのファイルだろ
Avatar
omochimetaru 6/7/2021 2:20 AM
JSONCodingTests.swift
Avatar
$ cat main.swift import Foundation let p = Process() p.executableURL = URL(fileURLWithPath: "/usr/bin/env") p.arguments = ["swiftc", "-o", "out", "main.swift"] try p.run() p.waitUntilExit()
2:22 AM
これでできたmainを実行するとoutが問題なくできる
2:22 AM
testがあやしい?
Avatar
swift test で実行すると再現しないっぽい… テストランナーの問題なのかな
Avatar
omochimetaru 6/7/2021 2:23 AM
そうなんすよ。
2:23 AM
xcode上のテストランナーだけ。
Avatar
swift package initで作られるファイルのインデントがひどいw
Avatar
omochimetaru 6/7/2021 2:24 AM
なんかいまテストが一弾ずれてますよね
2:24 AM
無駄に。
Avatar
swift test ではいいのかー
2:25 AM
xcode だとダメ?
Avatar
omochimetaru 6/7/2021 2:25 AM
はい。
2:25 AM
xcodeでPackage.swiftを開いてCmd+Uだと駄目
2:26 AM
それが俺だけなのかも知りたいです。
Avatar
ダメですね
2:27 AM
generate-xcodeprojで作ったxcodeprojでもダメ
Avatar
omochimetaru 6/7/2021 2:27 AM
再現した?
Avatar
しました
2:28 AM
Xcodeのテストランナーと swift test のテストランナーは完全に同じっぽいしわけわからん
Avatar
なにごともなくテストできた
2:28 AM
もしかして: 日本語
Avatar
omochimetaru 6/7/2021 2:28 AM
マジ?
2:29 AM
ロケールか?
Avatar
過去の記憶が蘇る
Avatar
僕はあれからjaプライマリーやめました…
2:29 AM
generate-xcodeproj は問題なかった
2:29 AM
Package.swift開いてみよう
2:30 AM
違うエラーがでた
2:31 AM
Library not loaded: @rpath/lib_InternalSwiftSyntaxParser.dylib
Avatar
omochimetaru 6/7/2021 2:31 AM
あ、それは、
Avatar
bundleがどーとかいう別の問題? (edited)
2:32 AM
これ設定してください
2:33 AM
SwiftSyntaxのコンパイラ同梱のランタイムライブラリがXcodeからだと見つからないというバグ?がある
Avatar
問題ないですね
2:34 AM
少なくともsymlinkがループしてるとはならない
2:34 AM
ちなみに、/Applications/Xcode.app に僕の Xcode 12.5 はいる
Avatar
Contribute to kateinoigakukun/SwiftcTooManySymlink development by creating an account on GitHub.
Avatar
Xcode.12.5.app ではない
2:35 AM
にたようなミニマムケースつくったけど問題なかったなあ
Avatar
あー、僕はバージョンサフィックス付きのXcodeですね。
Avatar
あやしい
Avatar
omochimetaru 6/7/2021 2:36 AM
マジか
Avatar
ありえる
2:37 AM
enとか、/Applications/Xcode.appとか、行儀良くデフォルトで生きることにしている
Avatar
うーん、でもXcodeのパスはxcode-selectかDEVELOPER_DIRで決定されると思うんだけどなぁ
Avatar
omochimetaru 6/7/2021 2:37 AM
えっとね、
Avatar
??? 「え、Xcodeって /Applications/Xcode.app にいつもインストールされるんじゃないの??」
😇 1
2:38 AM
RPATH探索に Xcode.app が焼き込まれてるファイルを見つけた
Avatar
あー、ありうる
Avatar
omochimetaru 6/7/2021 2:39 AM
Referenced from: /Library/Developer/Toolchains/swift-5.5-DEVELOPMENT-SNAPSHOT-2021-06-02-a.xctoolchain/System/Library/PrivateFrameworks/LLDB.framework/Versions/A/LLDB
Avatar
ww 行儀悪いな
Avatar
omochimetaru 6/7/2021 2:39 AM
でもそれは↑これだから、
Avatar
デフォルトの人生が平和
Avatar
omochimetaru 6/7/2021 2:39 AM
今の話は関係ない
2:39 AM
ただまあ他にもあるのかも。
Avatar
独自とかカスタマイズとか悪
2:39 AM
日本語とかもってのほか
Avatar
omochimetaru 6/7/2021 2:39 AM
Avatar
それはさておき名前変えてみよう
Avatar
omochimetaru 6/7/2021 2:39 AM
Xcodeたくさん必要なんですよ
Avatar
Appple「Macいっぱい買ってください」
Avatar
名前変えるとすべてのキャッシュ壊れそうで怖いなぁw
2:40 AM
やってみよう
2:41 AM
ダメだ、まだエラー出る
2:41 AM
同じエラー
Avatar
xcode-select?
Avatar
omochimetaru 6/7/2021 2:42 AM
あーいけたー
2:42 AM
a
2:42 AM
いけてないわ
2:42 AM
Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' started. generate: Command-SE0295.gen.swift 2021-06-07 11:42:14.894107+0900 swiftc[77512:15232794] Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links
Avatar
同じ↑
Avatar
xcodebuild test ではどうですか? (edited)
Avatar
なるほど確かに
Avatar
2021-06-06 19:44:33.440695-0700 swiftc[12611:1786858] Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links (edited)
2:45 AM
Avatar
再現した
Avatar
あれかも、メッセージみてなかっただけかも?
2:45 AM
テスト失敗はしないというか。
Avatar
omochimetaru 6/7/2021 2:46 AM
テスト失敗にならないバグがありそうです。
Avatar
xcodebuild -scheme Example-Package -derivedDataPath build test で試してる
2:47 AM
@Yuta Saito さんの再現のほうを。
2:48 AM
2021-06-06 19:47:34.100871-0700 swiftc[12779:1790755] Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links Apple Swift version 5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55) でますね
Avatar
xcodebuild経由だとこのあたりの環境変数が追加されてることが確認できました DYLD_FALLBACK_FRAMEWORK_PATH=/Applications/Xcode-12.5.app/Contents/SharedFrameworks:/Applications/Xcode-12.5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks DYLD_FALLBACK_LIBRARY_PATH=/Applications/Xcode-12.5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib DYLD_FRAMEWORK_PATH=/Users/kateinoigakukun/Library/Developer/Xcode/DerivedData/Example-dcyedciowpcsqebafcorbracmhpk/Build/Products/Debug DYLD_LIBRARY_PATH=/Users/kateinoigakukun/Library/Developer/Xcode/DerivedData/Example-dcyedciowpcsqebafcorbracmhpk/Build/Products/Debug
Avatar
xcodeの場所関係ないかあ...
Avatar
omochimetaru 6/7/2021 2:53 AM
xcodebuildは、swift package generate-xcodeprojしてから?
Avatar
あ、そうです
2:55 AM
dtraceが気楽に使えない昨今
Avatar
omochimetaru 6/7/2021 2:56 AM
$ xcodebuild -project SE0295Polyfill.xcodeproj -scheme SE0295Polyfill-Package test
2:58 AM
Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' started. generate: Command-SE0295.gen.swift 2021-06-07 11:57:01.005930+0900 swiftc[78065:15248887] Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' passed (2.926 seconds).
Avatar
なにがちがうんだろう
3:03 AM
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc を swiftc の代わりに実行するとエラーがでない
3:04 AM
つまり... /usr/bin/swiftc を Xcode から実行することに問題がある...?
Avatar
/usr/lib/libxcselect.dylibかな
Avatar
/usr/bin/*のshimはこのライブラリ経由でxcode-selectとDEVELOPER_DIRを見て実体のパスを解決してexecするんですよね
Avatar
omochimetaru 6/7/2021 3:08 AM
ほお
Avatar
$ ls -al /usr/lib/libxcselect.dylib ls: /usr/lib/libxcselect.dylib: No such file or directory
3:09 AM
🤔
Avatar
名前忘れちゃったんですけど、一個のdylibに固めてプリロードする技術が使われてて、ローダが特別扱いして対象のパスにファイルが無くても動くんですよ
Avatar
あー、あれか、キャッシュか。
3:11 AM
あれの中身みるのしんどい...
Avatar
まず分解するところから…
Avatar
xcselect_invoke_xcrun 実行してるだけだなあ
Avatar
そうそう
Avatar
それは闇の中...
Avatar
デバッガアタッチする方が楽かも
Avatar
許されるのかなあ
3:15 AM
Avatar
許された?
Avatar
swiftc -vlldb swiftc に置き換えてみた
Avatar
なるほど、それでいけるんですね
Avatar
interactiveがないからきつい...
3:20 AM
Not allowed to attach to process.
Avatar
ww 許されなかったか… (edited)
Avatar
だめだった
3:20 AM
なぞい
3:20 AM
sip止めるのはいやだなあ
3:22 AM
libxcselect がなにかすごいことをしてるような気がする
Avatar
アタッチ出来た!
3:26 AM
xpc...
Avatar
Attach to Process or Name...でDebug Process Asをrootにしてデバッガ待機させて、横でテスト実行すると捕まえられました
Avatar
rootいるのw
Avatar
root無いと捕まらないですw
3:30 AM
そしてcontinueすると途中でEXC_BAD_ACCESSで死ぬ…
Avatar
うーん...
3:31 AM
インターネットにばらした libxcselect.dylib ないかな
3:33 AM
libxcselect.dylib がなんらかのチェックをしていそう
Avatar
Modifications to Apple&#39;s dyld project to fix Objective-C information when extracting dyld_shared_cache from macOS Big Sur to help Hopper generate readable pseudocode. - antons/dyld-shared-c...
Avatar
それがなんかバグってそう...
3:34 AM
ばらしたの置いてないかなあ...
Avatar
思い出した。Shared CacheになったのはBig Surからなのでそれ以前のOSにはバラで入ってたんだ
Avatar
iOSでは結構前からそんななんですよね
3:37 AM
Big Surからなのか
3:40 AM
とりだせた
👏 1
3:40 AM
悲報: M1なのでARM64
3:41 AM
あれ?
3:41 AM
これx64だな
3:41 AM
不思議
Avatar
Universalになっててよかった!
3:42 AM
はい
Avatar
_xcselect_invoke_xcrun_via_libraryが実は本質?
Avatar
libxcrunを使ってる
Avatar
libxcrunはDEVELOPER_DIRの配下にバラで置いてありますね
Avatar
したのほうに_xcselect_invoke_xcrun_via_libraryのpsudo コード追加した
Avatar
xcrun_main
Avatar
めっちゃでかい
Avatar
普通にxcrunコマンド本体ですねw
Avatar
追加した
3:51 AM
あった!!
3:51 AM
_parse_macho_iterate_slices
Avatar
お!
3:51 AM
ヤッタ~ 🙌
Avatar
_parse_macho_iterate_slices_fd がエラーだなぁ
3:52 AM
fstat してるからそれがなんかおかしなことになってしまってる?
3:53 AM
あ、ちがうか、_parse_macho_iterate_slicesopen ですでにダメなのか
3:54 AM
_parse_macho_iterate_slices にブレイクポイントいれらたら
3:54 AM
$arg0 ($rdi) をみればパスがわかるはず (edited)
3:55 AM
(intel macなら)
Avatar
少々お待ち
3:56 AM
Avatar
えー、それopenするとエラー??
Avatar
というかr15はエラーメッセージに出てましたねw
3:57 AM
なんでopen出来ないんだろう
Avatar
わたしてるフラグは 0b100000000
Avatar
let ret = open("/Applications/Xcode-12.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc", 0x100) print(ret) これは-1が返ってくる
3:59 AM
swift testでもxcodebuildでも両方同じ値が返ってくる
4:00 AM
print(String(cString: strerror(errno))) するとToo many levels of symbolic linksだ
4:00 AM
swift testはxcrunつかわない疑惑 (edited)
Avatar
なるほど?xcodeのランナーのほうが実は自然でswift-testのハックでxcrun経由にならずエラーが握りつぶされてる説? (edited)
Avatar
#define O_NOFOLLOW 0x00000100 /* don't follow symlinks */
4:03 AM
😂
Avatar
Avatar
これは、、、
4:03 AM
バグですね
4:03 AM
つまり、xcrunのバグかな。 (edited)
4:04 AM
libxcrun的にはなんか実行するまえにmachoを読んでなんかチェックしたいんだけど (目的は読まないとわからない) (edited)
4:04 AM
symlink追いたくない
4:04 AM
でも、xcrunでswiftcを呼ぶとそれはsymlinkされてる
4:04 AM
まあなんだろう、バグっていうか仕様の行き違い
Avatar
うーん、でもそうするとエラー出さずに正常に動くケースがよくわからないですね
Avatar
_parse_macho_iterate_slices 呼ばないケースがあるんだと思う
Avatar
あと、_parse_macho_iterate_slicesが0を返すケース追っていくとその後で普通にexecvされてるっぽいですよ
Avatar
syslog$DARWIN_EXTSN(0x3, "Failed to open macho file at %s for reading: %s", r15, strerror(*(int32_t *)__error())); rax = 0x0;
4:06 AM
だからまあ気にしないのかな...
Avatar
つまりswift-testでもxcodeでもこのsyslogの行には到達してるけど、環境変数か何かしらでログを出力するか制御されてるってことかな
Avatar
open できた場合の _parse_macho_iterate_slices_fd はMach-Oを検証してる感じかなあ
4:08 AM
そうかも
4:08 AM
あるいは _parse_macho_iterate_slices 呼ばれてない?
4:08 AM
呼ばれてる?
Avatar
たしかに。そこは確かめたい
4:09 AM
swift-testで実行してる/usr/bin/swiftcをデバッガで捕まえれば良いのか
4:10 AM
呼ばれてましたね
Avatar
なるほど...
4:10 AM
syslogか
Avatar
OS_ACTIVITY_DT_MODE=YES これだ!
4:14 AM
これセットするとswift-testでもエラーログ出るようになります (edited)
4:15 AM
完全に理解してしまった…
Avatar
やった
4:17 AM
すごい時間かかった...
Avatar
そして何も問題は無かった‥
4:18 AM
いや、どうだろう
Avatar
なんか昔Xcodeが異常にログを出すようになったときこの環境変数セットすると抑えられていいよ!みたいなTipsありましたね
Avatar
xcrunがsymlink追わずにexecvするのどうなのとは思う
4:19 AM
そうじゃない場合はmach-oのヘッダーとか確認してるわけだし...
Avatar
omochimetaru 6/7/2021 4:19 AM
めちゃくちゃ解析が進んでる
Avatar
確かに。symlink経由だとその検証をバイパスできるってことですもんね
Avatar
TL; DR: 何も問題がなかった
Avatar
omochimetaru 6/7/2021 4:20 AM
ええ
Avatar
少なくとも、開発環境という意味では...
Avatar
気になる場合はOS_ACTIVITY_DT_MODE=NOを実行時に環境変数にセットしよう (edited)
Avatar
omochimetaru 6/7/2021 4:21 AM
Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' started. generate: Command-SE0295.gen.swift Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' passed (1.140 seconds). Test Case '-[SE0295PolyfillTests.JSONCodingTests test02]' started. generate: Command-SE0295.gen.swift Test Case '-[SE0295PolyfillTests.JSONCodingTests test02]' passed (0.935 seconds). Test Case '-[SE0295PolyfillTests.JSONCodingTests test03]' started. generate: Command-SE0295.gen.swift Test Case '-[SE0295PolyfillTests.JSONCodingTests test03]' passed (0.933
Avatar
あるいはシェルのどこかに OS_ACTIVITY_DT_MODE=YES しておけば、いつでも Xcode と同じ気持ちになれる (edited)
Avatar
omochimetaru 6/7/2021 4:21 AM
なおった!
Avatar
すごい学びはあったけど、実用性に乏しいw
Avatar
ww
4:23 AM
対戦ありがとうございました
Avatar
FBにセキュリティでsymlinkだと無視されるほーんって書いておこう
Avatar
Kishikawa Katsumi 6/7/2021 4:24 AM
おもしろい。けっきょくどっちでも同じ挙動をしていてログのVerboseモードが有効になってるかどうか、ってこと?
Avatar
まそんな感じです
Avatar
Kishikawa Katsumi 6/7/2021 4:25 AM
おつかれさまです。
Avatar
omochimetaru 6/7/2021 4:25 AM
ログのVerboseモードが有効になってるかどうか
ん、じゃあ、動いてたの?
4:25 AM
エラーメッセージが出るだけで。
Avatar
そうなんです
Avatar
ですです
Avatar
omochimetaru 6/7/2021 4:26 AM
なるほど・・・・・・・
4:26 AM
この else 側を通ってます
4:27 AM
ただ、このエラーメッセージ、syslog経由なので普通にはstderrにでません
4:30 AM
FB9129541った
Avatar
env OS_ACTIVITY_DT_MODE=1 swiftc がminimum reproです
Avatar
omochimetaru 6/7/2021 5:08 AM
打ち合わせ終わったので読み直してきた レベルたけー
Avatar
Hopper Disassembler さまさま
Avatar
生のディスアセンブル結果とは比べ物にならないくらい読みやすかったので、今度買おうと思いました
Avatar
まあ今回は読みやすいコードだったと思う
5:24 AM
そんなに高くないし気楽につかえるし持ってて損はないと思う
💸 1
Avatar
新しいランタイムをアプリに埋めて、古いOSに出荷する、みたいなことができない理由にshared cacheが関わってるカモという話が出てた https://twitter.com/uint_min/status/1402050350249504772?s=21 (edited)
@zhuowei The Swift stdlib is part of the OS and specifically part of the dyld shared cache; you can't replace it for just one app.
🥺 1
Avatar
omochimetaru 6/8/2021 12:44 AM
Concurrencyモジュールは普通に埋めて出荷できるもんだと期待していたのに
Avatar
iOS はキャッシュしてるから...
12:45 AM
そしてbig surも
Avatar
Avatar
omochimetaru
Concurrencyモジュールは普通に埋めて出荷できるもんだと期待していたのに
その可能性はまだちょっと期待してる
Avatar
(記憶に新しい)
Avatar
(記憶に新しい)
12:46 AM
Concurrencyモジュールが古いlibswiftCoreと一緒に動くかどうかが問題ですね
Avatar
omochimetaru 6/8/2021 12:47 AM
stdlib自体はcompatibility hookの仕組みもあるじゃない。
Avatar
apple「みんなあたらしいiOSが乗ったiPhoneかったらいいよね」
Avatar
omochimetaru 6/8/2021 12:48 AM
流石に端末切り捨てはしないからアプデいれてもろて
Avatar
まあでも、iOS13/14/15でハードの切り捨てがないから
12:48 AM
iOSのアプデ拒否れないようにすればいい
12:49 AM
なんかもう10回くらい
Avatar
omochimetaru 6/8/2021 12:49 AM
拒否れないはアツいな。
Avatar
いいえっていって設定の10階層めくらいにそういうトグルいれておけばいい
Avatar
束の間の平和、数年ぐらいでEU辺りに法で破壊されそう
12:52 AM
GDPR...
12:52 AM
Cookie地獄
Avatar
The release notes imply that this is an "issue" that just needs to be fixed. It's not.
https://forums.swift.org/t/swift-concurrency-feedback-wanted/49336/6
(edited)
Concurrency requires runtime support that does not backward deploy. The release notes imply that this is an "issue" that just needs to be fixed. It's not. It's a feature that would need to be implemented. At this time, folks should assume that concurrency does not backward deploy. That said, everyone is aware of the value of it doing so, an...
😂 1
2:27 AM
Avatar
omochimetaru 6/8/2021 2:31 AM
That said, everyone is aware of the value of it doing so, and is something that is being explored/considered.
今の所やらんけど技術的には可能ってこと?
Avatar
どうなんだろう。まあ頑張ればどうにでもなりそうだけど…
Avatar
yutailang0119 6/8/2021 3:35 AM
https://twitter.com/rjonesy/status/1401978873944944644 で、今後OSメジャーアップデート渋るユーザーが増えるか
iOS 15: Ruh row, users may adopt iOS updates slower.
Avatar
Majorバージョンをユーザー主導で選べるのかぁ 15にあげたら14に戻すことはできないだろうから、慎重にはなりそう
Avatar
えー。
3:37 AM
これはちょっと。
Avatar
15でバグだらけだと正式リリースしてもbeta版じゃんと言われて渋られるのでOSの出来次第か?
3:39 AM
アプリもどうせ2Majorバージョンサポートって考えると問題なさそうにも見える
Avatar
どうだろうなあ。
3:42 AM
やっぱりasync/awaitは1年育てる方向か
Avatar
omochimetaru 6/8/2021 3:43 AM
サーバーサイドで先走りしちゃお
Avatar
サーバーは他の言語が...
3:45 AM
実際のところ、同じだと嬉しいかな。
Avatar
自分用で iOS 15 required にしても問題ない小さいアプリを google/promises の疑似async/awaitから Swift 5.5 の async/await に移行したんですが、めっちゃ普通に動いて感心してしまった
Avatar
omochimetaru 6/8/2021 4:26 AM
イイネイイネ
Avatar
欲を言うと URLSession.shared.data(for:) が名前付きタプルになるといいな…という感じがした
Avatar
omochimetaru 6/8/2021 4:27 AM
(URLResponse, Data) ?
Avatar
それですそれです
4:28 AM
let hogeRes = try await URLSession.shared.data(for: hogeReq) // いろいろ let hogeData = hogeRes.0 ってなるのはちょっとダサさがあり…
Avatar
Kishikawa Katsumi 6/8/2021 4:28 AM
Result返さないのか
Avatar
omochimetaru 6/8/2021 4:28 AM
エラーは throws なので。
Avatar
Kishikawa Katsumi 6/8/2021 4:29 AM
throwsなのか!
Avatar
omochimetaru 6/8/2021 4:29 AM
let (res, data) = try await URLSession... で受けると良いかも?
Avatar
とりあえずそうしたんですが、res と data 一緒に持って行きたいときに引数2つ持たないといけないのがアレかなあという気がしています
Avatar
omochimetaru 6/8/2021 4:30 AM
まあそうですね。
Avatar
(data: Data, response: URLResponse) とかになってくれるとうれしい
4:30 AM
feedback書いてみようかな
Avatar
omochimetaru 6/8/2021 4:31 AM
struct DataTaskResult とかで nominal type でも良い気がするけど(自分はそうラップしている) (edited)
Avatar
Kishikawa Katsumi 6/8/2021 4:31 AM
手元で使う場合はAPIClientクラスか何かでラップしてそんなのを返すのがよさそうですねえ。
Avatar
omochimetaru 6/8/2021 4:33 AM
4:33 AM
手元
Avatar
Kishikawa Katsumi 6/8/2021 4:33 AM
https://developer.apple.com/documentation/foundation/urlsession/3767353-data?changes=latest_minor このへんか。 でもResponseとDataがOptionalじゃなくなったのはとてもいい。
Avatar
omochimetaru 6/8/2021 4:34 AM
オプショナルトリオでよくわかんなかったですもんね
Avatar
Kishikawa Katsumi 6/8/2021 4:35 AM
ResultかErrorをthrowsで分離できなかったからしょうがないのかな。 コールバックを分けるという手はあったと思うけどたぶん使いにくいな。 (edited)
Avatar
ラベル付きタプル、Objective-C Interop の機能で async 化されてるんだとしたら、https://github.com/apple/swift-evolution/blob/main/proposals/0297-concurrency-objc.md#asynchronous-completion-handler-methods で議論されなかったのかな。
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
omochimetaru 6/8/2021 4:38 AM
Objective-C Interop
あ〜それがあるのか!
4:38 AM
すっかり忘れてた。
Avatar
https://developer.apple.com/documentation/foundation/urlsession/3767352-data?changes=latest_minor は素の Objective-C Interop ではないと思います (そもそも元の dataTask(...) は URLSessionDataTask が帰ってくるはずなので The method itself has a void result type, because all results are delivered by the completion handler block. に引っかかりそう)
Avatar
omochimetaru 6/8/2021 4:43 AM
なるほど。
Avatar
なるほど、そしたら overlay モジュールか。 とはいえ SE-0297 の変換に寄せたのかもしれませんね。
Avatar
omochimetaru 6/8/2021 4:43 AM
同期返り値があるやつはたしかにそれの行き先がないもんな。
4:44 AM
自動変換だとそもそもクロージャの引数のラベルはシグネチャの中に無いからタプルになっちゃうなあ。
Avatar
omochimetaru 6/8/2021 4:45 AM
ほんまや。
Avatar
あ、API間違えた
Avatar
Kishikawa Katsumi 6/8/2021 4:46 AM
あれ、そういえばクロージャじゃなくてDelegateで非同期処理のコールバックを受けるものはどうやってasync/awaitに変換するんでしたっけ?
Avatar
そうか、ObjCの定義には引数名載っててもSwiftの定義には引数名乗らないんですね
Avatar
Kishikawa Katsumi 6/8/2021 4:46 AM
Delegateの部分を自分でクロージャのコールバックにするようにラップするのか。。。?
Avatar
ObjCの定義には引数名載っててもSwiftの定義には引数名乗らない
型システム的には無視されるけど、 (_ data: Data?, _ response: URLResponse?, _ error: Error?) -> Void というシンタックスはあるので、引数名乗るようにインポートすることは可能なはずです。
Avatar
Avatar
Kishikawa Katsumi
Delegateの部分を自分でクロージャのコールバックにするようにラップするのか。。。?
omochimetaru 6/8/2021 4:49 AM
Delegateオブジェクトはretainされないから、 グローバル変数のSetに入れるか、Unmanaged越しにmanual retainして、 コールバック完了時かキャンセル時に解放を書く
4:50 AM
というのが一番汎用的な書き方になるはず。 もうちょっとサボるなら、メソッドを持ってるオブジェクト自体に objc_setAssociatedObject でデリゲートオブジェクトをぶら下げる手もあります。(この場合、2回呼び出しの対応が面倒)
Avatar
Kishikawa Katsumi 6/8/2021 4:51 AM
URLSessionでいうとURLSessionを拡張してうまくやろうとするとそんな感じで大変だけど、それを保持しているラップするオブジェクトを作ってそれ自身をデリゲートにしたら生存期間の問題は解決しません?
Avatar
omochimetaru 6/8/2021 4:52 AM
ラップするならそれでもいいです。
4:52 AM
あと、複数回呼び戻されるタイプのデリゲートの場合は、AsyncSequenceへの変換が良いですね。
Avatar
Kishikawa Katsumi 6/8/2021 4:53 AM
ということですよね。 まとめると、具体的にラップするかそのものを拡張するかは置いておいて、 いったんDelegateモデルを変換するというステップが必要で、そのあとはクロージャのコールバックとかと同じようにAsync/Awaitに変換すれば良い?
Avatar
omochimetaru 6/8/2021 4:53 AM
あ、そうですね。 従来と同じで、デリゲートスタイルをクロージャスタイルに変換する事をまず考えて、 その後クロージャスタイルをasyncにするのが良いと思います。
Avatar
Kishikawa Katsumi 6/8/2021 4:54 AM
どうもどうも。ありがとうございます。
4:55 AM
まあDelegateの非同期処理ってもうないよな多分。 Bluetoothとかそうだったっけ?
Avatar
omochimetaru 6/8/2021 4:57 AM
UITextFieldDelegateとかよく使う
4:57 AM
ので、ラップしている。 (edited)
Avatar
https://github.com/apple/swift-evolution/blob/main/proposals/0314-async-stream.md delegate はAsyncSequenceよりAsyncStreamのほうが使い易くなるはず (edited)
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
omochimetaru 6/8/2021 5:00 AM
AsyncSequenceにするための変換器がAsyncStreamですよね?
Avatar
Avatar
rinsuki
(data: Data, response: URLResponse) とかになってくれるとうれしい
この feedback どこに書くと良いんだろう? Feedback Assistant の Developer Tools トピックでいいのかな
👍 1
Avatar
omochimetaru 6/8/2021 5:00 AM
asyncにするためのContinuationの関係と同じ。
👍 1
Avatar
あー、そういう関係か
Avatar
omochimetaru 6/8/2021 5:01 AM
バッファリングとかあるから生の変換器ではないですが。
Avatar
Kishikawa Katsumi 6/8/2021 5:03 AM
なるほど。UITextFieldとかのイベントも非同期処理と捉えるのか。
5:03 AM
RxCocoaがやってくれるやつね。
Avatar
UIViewController.h見てたらpresentViewControllerに NS_SWIFT_DISABLE_ASYNC というのが追加されているのでこれがあるやつはasyncに自動変換されないって感じなんですかね。 // 14.5 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion API_AVAILABLE(ios(5.0)); // 15.0 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion NS_SWIFT_DISABLE_ASYNC API_AVAILABLE(ios(5.0));
Avatar
Kishikawa Katsumi 6/8/2021 5:51 AM
なるほど。同期的に呼ばれるものかそうじゃないのかはシグネチャだけだと区別できないからそれをつける必要があるんですね。
5:52 AM
同期的に呼ばれるものかそうじゃないのか、っておかしいな。上のAPIも非同期的に呼ばれることには変わりない。
Avatar
asyncのapiとして提供するべきでは無いものにアトリビュートしてる感じですね
Avatar
Kishikawa Katsumi 6/10/2021 12:58 PM
On performance. I have a 4500-lines enum for emojis in Unicode, so I can order them and move them around. In the functions I declared (such as one providing the group, or subgroup), I'm damned either way: if I don't put a default: fatalError() at then end of it, I have a compiler too slow error. If I put it, I have a Default will never be executed. Best of all, I cannot disable the warning in the package, so I'm left with 4 warnings at all times. Anything I can do?
Dev Loungeから。 やっぱりそれくらいメンバの多いEnumとかStructを使うケースってあるんだなあと興味深い。
Avatar
4500もあったらどうせコードとしてメンテナンスできないのでは・・・
12:59 PM
switch文ひとつすらレビュー不可能ですよ
Avatar
Kishikawa Katsumi 6/10/2021 1:00 PM
まあでもUnicodeの絵文字は規格が先にあるから扱えるんじゃないかな。
Avatar
omochimetaru 6/10/2021 1:00 PM
規格書から作った定義表みたいなデータドリブンで実装するべきで (edited)
1:00 PM
コードとして分岐を作るのはナンセンスに思えます
1:01 PM
まあコンパイルが遅くならないに越した事はないですけど。。。 (edited)
Avatar
Kishikawa Katsumi 6/10/2021 1:02 PM
回答としてはテストケース的な小さいプロジェクトにしてバグレポートを出してくれたら改善できるかも、ということでした。
1:03 PM
遅くなるのが4500件なのかもっと早く訪れるのかわからないけど、コンパイラ側としてはそれが後になってればその方がいいんじゃないかな。
Avatar
omochimetaru 6/10/2021 1:03 PM
そうですね。
Avatar
Kishikawa Katsumi 6/10/2021 1:03 PM
何件からナンセンスかは場合によりそう。
Avatar
omochimetaru 6/10/2021 1:03 PM
一つ一つのケースで異なるロジックが必要になるかどうかですね。
1:04 PM
対応するプロパティを引っ張るだけとかだったら、データ定義に移して一つのコードにまとめられる。
Avatar
Kishikawa Katsumi 6/10/2021 1:05 PM
なるほど。
Avatar
omochimetaru 6/10/2021 1:06 PM
同じようなもののバリエーション違いってenumにしてもあまり恩恵がなくて、structとstatic funcの方がうまくまとまる事がありがちに思います
1:07 PM
enumがメリットが大きいのってcaseごとに全然違うものが現れる場合です OptionalとかResultは良い例 (edited)
Avatar
Kishikawa Katsumi 6/10/2021 1:08 PM
そうですねえ。補完もほぼ同じように働いて、見た目も一緒になることが多いですしね。
Avatar
omochimetaru 6/10/2021 1:08 PM
例えば麻雀牌136種とかポケモン898種とかをenumにするのってあんまり意味ないと思ってます。
Avatar
Kishikawa Katsumi 6/10/2021 1:09 PM
なるほど?麻雀牌はなんとなく意味があるケースもありそうな気がするのでちょっと考えてみよう。
1:09 PM
うーん、でもEnumにはしないかなあ。
Avatar
omochimetaru 6/10/2021 1:10 PM
むしろ赤牌とかが出てきて困ったりする。 「字牌か、数字か」みたいな属性を表す部分ではenumを使うとうまくいきますね
Avatar
Kishikawa Katsumi 6/10/2021 1:10 PM
なるほど。
Avatar
Kishikawa Katsumi 6/10/2021 1:23 PM
昨日クイズ大会とかDev Loungeであったっぽい。見逃した。
Avatar
Kishikawa Katsumi 6/10/2021 1:33 PM
Might the upcoming Playgrounds release include support for find & replace, or refactoring? Renaming variables, or indeed any declaration, can be quite painful without it. Or if you can't comment - are there any good workarounds for this currently?
この質問とかいいな。確かにリファクタリング機能があるかどうかは仕事でも使えるかっていう点では大きい。
Avatar
Avatar
Kishikawa Katsumi
遅くなるのが4500件なのかもっと早く訪れるのかわからないけど、コンパイラ側としてはそれが後になってればその方がいいんじゃないかな。
https://twitter.com/codafi_/status/1402424392156471296?s=21 実際テストケース提供いただいて修正入っております。
Report bugs to us during WWDC. They get fixed. https://t.co/mJInJJOmDN
👏🏼 1
Avatar
Kishikawa Katsumi 6/10/2021 2:08 PM
私もそれ見ました。確かに時間かかるなあと。
Avatar
This was a great conversation, thanks John! Swift’s concurrency model was the work of a fantastic group of brilliant engineers. @pathofshrines architected the feature, from its expression in the language down to the lowest-level runtime and compiler details. https://t.co/UjvPXTVeRj
Likes
158
12:21 AM
スタッフロール ちょいちょい名前覚えてるから壮観
Avatar
こんなの見かけたんですが、わかる人いますか? https://twitter.com/__KameKun__/status/1403397797378809861
これ原因わかる方いますか? 無意味なprint文をコメントアウトするだけで配列の中身が変わってしまうんですが、、、 手元だと動くからSwift5.2.1のバグなのかなと思いつつも分からず
12:55 AM
↓書き写してみたコード。 func readInts() -> [Int] { return readLine()!.split(separator: " ").map {Int(String($0))!} } func main() { let K = Int(readLine()!)! if !K.isMultiple(of: 9) { print(0) return } var dp: [Int] = Array(repeating: 0, count: K+1) dp[0] = 1 for i in 1...K { for j in max(0, i-9)..<i { dp[i] = (dp[i] + dp[j]) % (Int(1e9) + 7) //print(terminator: "") } } print(dp[K]) } main()
12:56 AM
AtCoder環境は -Ounchecked 付きでコンパイルされます。(追記) Linux です。 (edited)
Avatar
256と1っていうのが16bit整数とその上位8bitっぽい
7:34 AM
けど全く意味が分からんな
Avatar
readInts() は使ってない?
Avatar
let K = [9].randomElement()!にしてここのSwift-5.2.5君に -Ounchecked で食わせても1にならない
Avatar
readInts() は使ってなさそうですね。
Avatar
Avatar
masakihori
let K = [9].randomElement()!にしてここのSwift-5.2.5君に -Ounchecked で食わせても1にならない
Linux ですか?あと、 5.2.1 じゃないと発生しないのかもですね。
Avatar
swift-5.2.5-RELEASE for ubuntu 16.04で再現しますね。-Ouncheckedを外すと起きない。 $ pbpaste func main() { let K = Int(readLine()!)! if !K.isMultiple(of: 9) { print(0) return } var dp: [Int] = Array(repeating: 0, count: K+1) dp[0] = 1 for i in 1...K { for j in max(0, i-9)..<i { dp[i] = (dp[i] + dp[j]) % (Int(1e9) + 7) //print(terminator: "") } } print(dp[K]) } main() $ pbpaste|docker run -i norionomura/swift:5.2 sh -c 'swiftc -Ounchecked -; echo 9|./main' 1 $ pbpaste|docker run -i norionomura/swift:5.2 sh -c 'swiftc -; echo 9|./main' 256 $ pbpaste|docker run -i norionomura/swift:5.3 sh -c 'swiftc -Ounchecked -; echo 9|./main' 256 $ pbpaste|docker run -i norionomura/swift:5.3 sh -c 'swiftc -; echo 9|./main' 256 (edited)
11:34 AM
swift-5.3.3-RELEASEでは起きない。
Avatar
Kishikawa Katsumi 6/20/2021 1:50 AM
#20 1.569 [2215/2636] Compiling _NumericsShims _NumericsShims.c #20 1.623 [2216/2637] Compiling _AtomicsShims.c #20 1.623 [2217/2637] Compiling CSystem shims.c #20 3.014 [2218/2637] Compiling RealModule AlgebraicField.swift #20 4.016 [2219/2640] Compiling DequeModule Compatibility.swift #20 6.883 SIL memory lifetime failure in @$s13ComplexModule0A0V3logyACyxGAEFZ: memory is not initialized, but should #20 6.883 memory location: %98 = alloc_stack $RealType, let, name "θ" // users: %392, %390, %234, %235, %406, %247, %100 #20 6.883 at instruction: copy_addr %98 to [initialization] %391 : $*RealType // id: %392 #20 6.883 #20 6.883 in function: #20 6.883 // static Complex.log(_:) #20 6.883 sil [serialized] [ossa] @$s13ComplexModule0A0V3logyACyxGAEFZ : $@convention(method) <RealType where RealType : Real> (@in_guaranteed Complex<RealType>, @thin Complex<RealType>.Type) -> @out Complex<RealType> { swift-numericsがこんな感じのエラーでDocker上でだけビルドできないっていうのにずっと悩んでたけど、Dockerに割り当てるリソースを増やしたら解決した。 CIでもちょっと内容は違うけど似たようなところで失敗していてそれは -j 1 を指定したらビルドできるようになった。 SIL memory lifetime failure ってなんだろうってずっと悩んでいた。
1:52 AM
Swift 5.3の場合は問題なくて5.4以上のときだけこの問題が起こって、Ubuntuのバージョンを16に下げた場合も微妙に直るみたいな挙動をしていたので原因を見落とした。
Avatar
Kishikawa Katsumi 6/21/2021 1:53 AM
SourceKit-LSPをWebSocketでつないでめちゃめちゃコード補完できるようにした。 (edited)
👏 5
Avatar
omochimetaru 6/21/2021 1:53 AM
すげえ
Avatar
Kishikawa Katsumi 6/21/2021 1:53 AM
ホバーしたらヒントも出る。
Avatar
omochimetaru 6/21/2021 1:53 AM
LSP使ってIDE作れちゃうやつを実際にやったってことですね
Avatar
1セッションごとにlspサーバーが起動するのかな... (edited)
Avatar
Kishikawa Katsumi 6/21/2021 1:54 AM
まあLSPはSwiftのBindingあるし、表示やポップアップのトリガーはMonaco Editorにおまかせだからホント繋いだだけ。
1:55 AM
1セッションごとに1プロセスですね。
Avatar
実はwasmでローカルで動いてるのかな (edited)
1:55 AM
なるほど
Avatar
Kishikawa Katsumi 6/21/2021 1:55 AM
なんかワークスペースは1つで複数のファイルを開いている、という状態にしたかったんですけど、なんかLSPがクラッシュしてうまくいかないんですよね。
1:56 AM
苦肉の策。打開策はありそう。
Avatar
ワークスペース共有しちゃうと、他の人のドキュメント見れちゃってマズそう
Avatar
むしろそれが楽しそう
1:57 AM
誰かがextension書くと自分がつかえる
Avatar
omochimetaru 6/21/2021 1:58 AM
Avatar
Kishikawa Katsumi 6/21/2021 1:58 AM
確かにそう実装すると他の人が書いたメソッドが補完に出てくるのか!
Avatar
ww
Avatar
Kishikawa Katsumi 6/21/2021 1:59 AM
AIによるコード補完という製品をみたけどそれのめっちゃ低レベル版って感じだ。
Avatar
AI (他人)
Avatar
人工じゃない知能だ
Avatar
@swift-5.4.3 func foo(completion: @escaping () -> Void) {} final class C { var a: Int = 0 func bar() { foo { [self] in a += 1 } } }
Avatar
no output
Avatar
@swift-5.4.3 func foo(completion: @escaping () -> Void) {} final class C { var a: Int = 0 func bar() { foo { [weak self] in guard let self = self else { return } foo { [self] in a += 1 } } } }
Avatar
exit status: 1 with stderr:<stdin>:8:17: error: reference to property 'a' in closure requires explicit use of 'self' to make capture semantics explicit a += 1 ^ <stdin>:7:20: note: variable other than 'self' captured here under the name 'self' does not enable implicit 'self' foo { [self] in ^ <stdin>:7:20: warning: capture 'self' was never used foo { [self] in ^
Avatar
一度 weak self を介すると [self] は使えないのか。
Avatar
↓みたいな本来 preconditionFailure だけど万が一のプロダクションでのクラッシュを避けるために assertionFailure & return してたパターン(このパターン自体に賛否はあるけど)、 async になったら値を返さないといけないので preconditionFailure にするしかない?インスタンス生成が簡単なら適当な値を返して握りつぶすことはできなくはないけど。 func foo(completion: @escaping (Foo) -> Void) { guard checkState(self.state) else { assertionFailure() return } ... } (edited)
Avatar
このコードだとasyncにしても値を返す必要ないような…… completionに引数がないので
Avatar
asyncはvoid返り値でも関数作れるような?
1:26 AM
普通にreturn書いたら良いと思います
Avatar
Avatar
t.ae
このコードだとasyncにしても値を返す必要ないような…… completionに引数がないので
あ、逆だ。引数に Foo 入れないと。
1:32 AM
修正しました。
Avatar
その場合はfoo() async -> Foo? にしてnilが返ってたらスルーとかにはできそうですね。 本来ありえないケースのためにOptionalにするのはちょっと微妙そうですが。
Avatar
今まではcompletionを呼ばないという裏技が使えたけど、asyncだと使えなくなったということですかね?
Avatar
裏ワザというか脱法行為に近い
Avatar
Avatar
Iceman
今まではcompletionを呼ばないという裏技が使えたけど、asyncだと使えなくなったということですかね?
そうです。
1:35 AM
エラーの握りつぶしだからよくないけど、本番でクラッシュよりはマシという判断があり得た。
Avatar
completeしてないからcompletionが呼ばれないのは自然という解釈も…
Avatar
completionを呼ばない場合っていうのは永遠にresumeしないwithContinuationで表現できると思います。まあ、その後ろのタスクが永遠に詰まっちゃいますが… (edited)
Avatar
今まではError返すべきのところをサボってただけなので
1:36 AM
ちゃんとしたコードに治すべきだと思います
1:36 AM
throwsに寄せるかOptionalに寄せるかは用途次第ですが
1:37 AM
あとcompletionみたいに呼ばなくてもまあイイやみたいなのはasync関数だと表現が難しいので避けるべきデザインになると思いますね
1:37 AM
死んだら帰らないからawait letで呼んでね!みたいなのは初見殺しすぎる (edited)
Avatar
脱法行為w
Avatar
「ObjectiveCでErrorポインタに2回書き込んでたらswiftブリッジで壊れるんだけど」 が同等の話題と思います
Avatar
どうせ crash するなら後は野となれ山となれだけど
1:40 AM
assert とかだと死ねないんだなあ (edited)
1:40 AM
ゾンビに。
Avatar
まあなんか、fatalErrorを詰めて任意のTを返す関数と同じように
1:41 AM
withContinuationを呼んでTを返す終わらない関数は定義できる
Avatar
while trueって打ったら出てきた
1:42 AM
感覚的にはwhile trueがTに出来るみたいな感じ
Avatar
あー、前提としては事前条件の不正で Logic Failure だから preconditionFailure にするのが正しいんだけど、絶対にクラッシュさせたくないから assertionFailure にしておいて Release ビルドでは握りつぶしたいというテクニックを使っているケースの話ですね。まあ Optional にして呼び出し側で握りつぶす実装になるのかな。気持ち悪いけど。
Avatar
事前条件の不正が起き得ない箇所ならpreconditionFailureにするべきで、起き得るならthrowableにするべき、その間にはグラデーションは存在しないという立場です
1:56 AM
保証できないならエラーを吐くべきかしら
Avatar
Kishikawa Katsumi 7/2/2021 2:10 AM
私はthrowsにしますね。 でiOSアプリなら単純なクラッシュはメリットがないので、呼び出し元か簡単なものなら呼び出したところでクラッシュしない表現に変換して終わり。
Avatar
一応シチュエーションとしては、例えばデータベースに不正な値書き込まれるくらいならクラッシュした方がマシ、みたいなのは有り得る
Avatar
Kishikawa Katsumi 7/2/2021 2:16 AM
そういう場合はありますね。
Avatar
omochimetaru 7/2/2021 2:22 AM
CancelErrorが良さそう
Avatar
CancelError なるほど。
Avatar
omochimetaru 7/2/2021 2:41 AM
まあthrowsにはなりますが。
Avatar
throws でいいケースなら↓は良さそうだな。 assertionFailure() throw CancellationError()
Avatar
Avatar
tarunon
事前条件の不正が起き得ない箇所ならpreconditionFailureにするべきで、起き得るならthrowableにするべき、その間にはグラデーションは存在しないという立場です
事前条件の不正が起き得ない箇所なら
これは「 Logic Failure 以外でのエラーが起きなければ」という意味ですよね?それとも Logic Failure によって起こりうる場合も?
Avatar
LogicFailureが起きないことを保証するべきって話ですね 型で保証できない範囲はテストで保証するなり
Avatar
型で保証できない範囲はどこまでいってもグレーじゃないですか?
Avatar
例えばバンドルファイルからjson読み込んで〜みたいなシナリオだと、白に倒せると思うんですよね。しかもこのケースは失敗したら再起不能だ。
Avatar
そういうケースは僕もクラッシュでいいと思いますし、それをテストで防ごうとすることもできますが、テストは書き忘れることがあるし 100% ではないかなという意味でのグレーでした。多分判断基準自体は同じっぽいですね。 (edited)
Avatar
@swift-5.4.3 struct APIResponse<Value>: Decodable where Value: Decodable { var value: Value? var error: APIResponseError? func result() -> Result<Value, Error> { print("result") switch (value, error) { case (let value?, nil): return .success(value) case (nil, let error?): return .failure(error) case (_, _): return .failure(APIResponseError(code: -1)) } } func result<Wrapped>() -> Result<Value, Error> where Value == Wrapped? { print("result optional") switch (value, error) { case (let value?, nil): return .success(value) case (nil, let error?): return .failure(error) case (nil, nil): return .success(nil) case (_, _): return .failure(APIResponseError(code: -1)) } } } struct APIResponseError: Error, Decodable { var code: Int } struct User: Codable {} let r1: APIResponse<User> = .init(value: nil, error: nil) print(r1.result()) let r2: APIResponse<User?> = .init(value: nil, error: nil) print(r2.result())
Avatar
swift54 BOT 7/4/2021 1:29 AM
result failure(main.APIResponseError(code: -1)) result failure(main.APIResponseError(code: -1))
Avatar
これって r2 の場合 "result optional" の方が優先度高くならないんですっけ?非ジェネリックとジェネリックだから?
Avatar
nilだと基本最外の.noneが優先されたと思います
Avatar
パターンマッチのところじゃなくてオーバーロードの解決のところですね。
2:51 AM
result が表示されるか result optional が表示されるか。
Avatar
Type<A>.method<B>におけるoverloadの優先順位って、Bに関しては働くけどAに関しては特に働かなかった気がします
Avatar
なるほど。 Parameterized Extension が導入されればちゃんと選択されそうなんですけどねぇ。
3:21 AM
みんな大好き @_disfavoredOverload の出番か・・・。
Avatar
優先順位、数字で付けたいんですよねぇ
3:25 AM
アンスコ取れたらそうならないかな
Avatar
-debug-constraint みてみたんですが、スコア自体は両方同じで、constraintの数で勝敗が付いたっぽいですね
👀 1
Avatar
Optionalのprotocolを作って、extension APIResponse where Value: OptionalProtocol {...} にしたら優先順位として評価されるかも
Avatar
Avatar
tarunon
Optionalのprotocolを作って、extension APIResponse where Value: OptionalProtocol {...} にしたら優先順位として評価されるかも
なるほど。
Avatar
@swift-5.4.3 protocol OptionalProtocol: ExpressibleByNilLiteral { associatedtype Wrapped static func some(_ value: Wrapped) -> Self static var none: Self { get } } extension OptionalProtocol { init(nilLiteral: Void) { self = .none } } extension Optional: OptionalProtocol {} struct APIResponse<Value>: Decodable where Value: Decodable { var value: Value? var error: APIResponseError? } extension APIResponse { func result() -> Result<Value, Error> { print("result") switch (value, error) { case (let value?, nil): return .success(value) case (nil, let error?): return .failure(error) case (_, _): return .failure(APIResponseError(code: -1)) } } } extension APIResponse where Value: OptionalProtocol { func result() -> Result<Value, Error> { print("result optional") switch (value, error) { case (let value?, nil): return .success(value) case (nil, let error?): return .failure(error) case (nil, nil): return .success(nil) case (_, _): return .failure(APIResponseError(code: -1)) } } } struct APIResponseError: Error, Decodable { var code: Int } struct User: Codable {} let r1: APIResponse<User> = .init(value: nil, error: nil) print(r1.result()) let r2: APIResponse<User?> = .init(value: nil, error: nil) print(r2.result())
Avatar
swift54 BOT 7/4/2021 2:43 PM
result failure(main.APIResponseError(code: -1)) result optional success(nil)
Avatar
いけた。
Avatar
Kishikawa Katsumi 7/6/2021 2:39 AM
https://swift-ast-explorer.com/ と 前に書いたコード補完用のSouceKit-LSPのWebアプリをCloud Runに移行した。 https://discord.com/channels/291054398077927425/375206337937801216/856351027774881802 固定費の削減、になるかはまだわからないけどVMインスタンスをメンテナンスしなくていいのはやはりすごい楽だ。
Swift AST Explorer - AST visualizer for Swift source code
👏 1
Avatar
omochimetaru 7/8/2021 4:45 AM
4:46 AM
self を shadow しても 暗黙の self は shadow されないのむずい
Avatar
@swift-5.4.3 import Foundation print(atan2(1.0, 0.0))
Avatar
1.5707963267948966
Avatar
@swift-5.4.3 import Foundation print(atan2(1, 0))
Avatar
exit status: 1 with stderr:<stdin>:2:7: error: ambiguous use of 'atan2' print(atan2(1, 0)) ^ Foundation.atan2:1:13: note: found this candidate public func atan2(_ lhs: CGFloat, _ rhs: CGFloat) -> CGFloat ^ Glibc.atan2:1:13: note: found this candidate public func atan2(_ lhs: Float, _ rhs: Float) -> Float ^ Glibc.atan2:1:13: note: found this candidate public func atan2(_ lhs: Float80, _ rhs: Float80) -> Float80 ^ SwiftGlibc.atan2:1:13: note: found this candidate public func atan2(_ __y: Double, _ __x: Double) -> Double ^
Avatar
1.0 なら ExpressibleByFloatLiteral の優先順位で Double が優先されるけど、 1 だと他の浮動小数点数に対して Double が優先されずに ambiguous になるっぽい。
Avatar
omochimetaru 7/16/2021 6:27 AM
ですね!
6:28 AM
リテラル型の推論があって 1f とかやらなくていいSwiftでも .0 を明示的に書く意味はちょっとある。 (edited)
Avatar
.0を書かない人多い…
Avatar
Kishikawa Katsumi 7/19/2021 8:30 AM
https://swiftfiddle.com/ をGKEに移した。安いインスタンスが使えるからたぶん固定費の削減になるはず。 ただそれよりもVMを維持しなくて良くなったのと待機リソースの無駄がなくなるのがいい。 Kubernetesはめっちゃ難しかった。でもk8sの仕組み作った人は本当にすごいね。
Avatar
Avatar
Kishikawa Katsumi
https://swiftfiddle.com/ をGKEに移した。安いインスタンスが使えるからたぶん固定費の削減になるはず。 ただそれよりもVMを維持しなくて良くなったのと待機リソースの無駄がなくなるのがいい。 Kubernetesはめっちゃ難しかった。でもk8sの仕組み作った人は本当にすごいね。
Playgroundはプログラミング言語を学ぶ上で非常に役に立つツールです。SwiftはXcodeとiPad・Macアプリとして動くとても高品質なPlaygroundを提供しています。公式のSwift Playgroundsはプログラムをインタラクティブに実行し、結果を途中経過も含めてわかりやすく表示してくれます。 Swift以外の言語に目を向けると、最近のプログラミング言語はどれもPlaygroundのような仕組みを提供しています。しかもほとんどのプログラミング言語にはWebで動作するPlaygroundが提供されています。 Webで動くPlaygroundはさらに強力です。Xcodeやアプリをダウンロードすることなく使え、頭に浮かんだことをiPhoneでサッと書いて実行すること...
9:00 AM
毎年のように岸川さんと枠がかぶってるので今年はかぶらなきゃいいですが・・・。 (edited)
Avatar
Kishikawa Katsumi 7/19/2021 9:02 AM
^ これは原稿なので原稿に書きますが、 k8sの話はない予定です。k8sの話になってしまうので。
Avatar
あれ?これ原稿だったのか。
Avatar
Kishikawa Katsumi 7/20/2021 5:56 PM
GCPの料金推移
5:56 PM
CloudFlareのアクセス解析
5:56 PM
アクセスは増えてるけど料金はめっちゃ下がってる、
5:57 PM
と考えていいのかな。クラウド初心者だからよくわかってない
Avatar
7/21にはまだなってないのでは?
5:57 PM
7/20, 21は反映されていなさそう
Avatar
Kishikawa Katsumi 7/20/2021 5:58 PM
あー、そういうことなんですね。日本時間で考えたらダメ、みたいな?
Avatar
たぶんJSTではないでしょうねえ
Avatar
Kishikawa Katsumi 7/20/2021 5:59 PM
確かによくみたら一番右は9AMって書いてありますね。CloudFlare
Avatar
UTCベースなんでしょうね。
Avatar
Kishikawa Katsumi 7/20/2021 6:58 PM
ひとまずトータルのスペックは余裕みて作ったけど安いインスタンスが使えてるのかコストが増えることはたぶんなさそうなのかな??
6:59 PM
いや、昨日のぶんが記録されないとわかんないか。
Avatar
Kishikawa Katsumi 8/1/2021 11:55 AM
クラウド費用のデータ、だいぶわかった。
11:57 AM
最初のツノの部分がだいたいGKEに切り替えたところで結局のところ費用の面ではスケールアップでがんばってたときと変わらない。 スケールアウトできるようになったこととそこがある程度Googleに任せられること、サービスごとにデプロイできるようになったこととか要するに費用以外のGKEに変えたこととマイクロサービスで運用するようになったことのメリットが残る感じかな。
Avatar
Kishikawa Katsumi 8/2/2021 3:43 PM
GCPのリソース割り当ての上限にすぐひっかかるのが難しいな。 割り当てのうちBackend servicesだけ全然あげてくれなくて問い合わせたりいろいろしないといけないっぽい。
Avatar
Kishikawa Katsumi 8/2/2021 4:10 PM
クラスタを構成するVMの数がいつの間にか3から2に減ってるしちょっとずつ安くなっていけばいいなあ、と楽観視しています。 あと割り当ての上限回避のためにほぼ使われないであろう古いバージョンの実行を1つのコンテナにまとめたりしました。
Avatar
Kishikawa Katsumi 8/4/2021 2:38 PM
割り当て、セールスへコンタクトしたところ法人じゃなければダメとのことでしょうがないから少しずつ増やす方針に変えたらちょっとだけ増やせた。
Avatar
Avatar
Kishikawa Katsumi
クラウド費用のデータ、だいぶわかった。
Swift Playgrounds 、どれくらいのアクセスがあってこの値段になるんですか?
Avatar
Kishikawa Katsumi 8/5/2021 1:48 AM
CloudFlareの情報しかないけどこんな感じです。
Avatar
なるほど。月25万リクエストということは平均10秒に1回のリクエストくらいでしょうか?
1:52 AM
それで$500はけっこうしますね・・・。
Avatar
Kishikawa Katsumi 8/5/2021 2:12 AM
GKEにしたのはちょっと失敗かもしれないんですよねえ。まだよくわかってないから、というのもあるんですけどイマイチ安定しないし。。。
Avatar
前に試したときは、Compute Engineの安めのインスタンス(下から2番目とか)でも、 Nginx + Node(Express) + Docker で Swift のソースコードをリクエストで受け付けて実行して結果を返すところまでクライアントサイドから見て 1 秒くらいで捌けてたんで、単純に実行するだけなら 10 秒に 1 回のリクエストならそれくらいでも十分できそうな気がします。ただ、多分コードの保存とか色々やってるんですよね?
Avatar
Kishikawa Katsumi 8/5/2021 2:22 AM
コードの保存はFireStoreなんですけど、実際の負荷はどうなのかなあ。1つのVMでがんばってたときはGoogleからの提案でどんどんスペックアップしていったのでそろそろスケールアウトかなあと思ったんですよね。
Avatar
そもそもどんな構成になってるのかわからないと難しい
Avatar
コードの保存はFireStoreなんですけど
これはクライアントサイドですか?それともサーバーサイドから Admin SDK で?
Avatar
Kishikawa Katsumi 8/5/2021 2:48 AM
クライアントが現在のコードをPOSTしてそこからはサーバーサイドでFireStoreのAPIを使います。サーバーサイドSwiftはAdmin SDKがないのでREST APIです。
2:49 AM
2:49 AM
Webフロントエンドとコードをコンパイルして実行するランナーがいて、ランナーはSwiftのバージョンごとにいます。
2:50 AM
(リソース割り当ての上限があるので古いバージョンはまとめている)
2:51 AM
それをIngress(L7ロードバランサ)で - http: paths: - backend: serviceName: runner-vnightly-main servicePort: 80 path: /runner/nightly-main/* pathType: ImplementationSpecific - backend: serviceName: runner-vnightly-55 servicePort: 80 path: /runner/nightly-55/* pathType: ImplementationSpecific - backend: serviceName: runner-vnightly-54 servicePort: 80 path: /runner/nightly-54/* pathType: ImplementationSpecific - backend: serviceName: runner-vnightly-53 servicePort: 80 path: /runner/nightly-53/* pathType: ImplementationSpecific - backend: serviceName: runner-v542 servicePort: 80 path: /runner/5.4.2/* pathType: ImplementationSpecific - backend: serviceName: runner-v541 servicePort: 80 path: /runner/5.4.1/* こんなルーティングで振り分けています。
2:51 AM
でマイクロサービス群をGKEのクラスタにデプロイしています。 (edited)
2:52 AM
Podsは2つで、CPU4のメモリ16GBだったかな?
Avatar
クライアントが現在のコードをPOSTしてそこからはサーバーサイドでFireStoreのAPIを使います。
Firestore への書き込みをクライアントサイドに持っていくなど、サーバーサイドは本当にコードを受け取って実行して結果を返すだけにすれば処理負荷が大分軽くなったりしないでしょうか? SSR とかもやってるんですっけ?
3:11 AM
ランナーはSwiftのバージョンごとにいます。
あー、これ大変そうですね・・・。
3:12 AM
まあでもリクエストの総数が増えるわけじゃないから、(Dockerイメージ分だけ肥大化するけど)捌けないわけじゃないかなぁ。
Avatar
Kishikawa Katsumi 8/5/2021 3:15 AM
FireStoreへのリクエストはShareのボタンを押したときだけだけなので(測ってないけど)おそらく影響は少ないと思います。 SSRはシェアされたコードの復元のために最初にエディタに入ってるコードをテンプレートで置換していますね。それがない場合は初期表示は毎回同じです。
Avatar
1つのVMで頑張ってた時代があったということは、1つのVMで複数Swiftバージョン切り分けれるということですよね?
3:19 AM
どのバージョンでも動かせれるインスタンスを複数台用意するほうが綺麗そうだなとは思いました
Avatar
Kishikawa Katsumi 8/5/2021 3:21 AM
確かに実行は5.4.2に集中するからそのほうが合理的かも。
3:22 AM
デプロイが大変なんですよね。1つが巨大になると。 まあ大きいけどやってることは各種バージョンのDockerイメージをPullするだけだから簡単にできるか。
Avatar
なるほど1つあたりのイメージが巨大になるですね
3:27 AM
コンテナの中でさらにSwiftバージョン別のコンテナを起動してもいいけど、自前でコンテナ実行環境世話しないといけなくてディスクパンクとかトラブりそうでそれはそれで面倒そうだ
Avatar
Kishikawa Katsumi 8/5/2021 3:31 AM
コンテナの中でコンテナを起動しています。が、Docker outside of Dockerなので並列にWebフロントエンドと各種ランタイムバージョンのSwiftイメージ(コンテナ)がいる、という構成ですね。旧バージョンは。 services: app: image: kishikawakatsumi/swift-playground:latest ... carbonara: image: petersolopov/carbonara ... nginx-proxy: image: nginxproxy/nginx-proxy ... acme-companion: image: nginxproxy/acme-companion ... swift-nightly-main: image: swiftlang/swift:nightly-main container_name: swift-nightly-main swift-nightly-5.5: image: swiftlang/swift:nightly-5.5 container_name: swift-nightly-5.5 swift-nightly-5.4: image: swiftlang/swift:nightly-5.4 container_name: swift-nightly-5.4 swift-nightly-5.3: image: swiftlang/swift:nightly-5.3 container_name: swift-nightly-5.3 swift-5.4.1: image: kishikawakatsumi/swift:5.4.1 container_name: swift-5.4.1 swift-5.4: image: kishikawakatsumi/swift:5.4 container_name: swift-5.4 ... こんなdocker-compose.ymlでした。 (edited)
3:32 AM
VMの面倒を見ればいいんだけど、こういう構成をパッと使い捨てでデプロイできるのはk8sしかない感じがあります。
3:33 AM
それもGKEに移行した理由かな。
3:33 AM
docker-composeで頑張るのがなかなかしんどい。
Avatar
ああなるほど。元々docker-composeで1つのVMに横並びにいたインスタンス郡をk8sに展開した形にしたけど、そしたらGCPのリソース制限にかかったと。
Avatar
Kishikawa Katsumi 8/5/2021 3:47 AM
クラスタを作ったりサービスをデプロイすると関連するリソースが自動的に作られるんですよね。IPアドレスやエンドポイント、バックエンドサービス(よくわからない)など。 で、最初のリソース割り当てはかなり少ないから何か操作をするたびになんらかのリソース上限にかかる。 まあそれはだいたい簡単にあげてもらえるからやり直したらいいんだけど私の場合はバックエンドサービスが全然初期値から上がらなくて難しかった(今は少し上がった)
Avatar
ですね。サービス間の接続が自動で行われるのでとても相性がいいと思いました
Avatar
Kishikawa Katsumi 8/5/2021 3:50 AM
リソース効率はアイスマンさんの言ってる構成の方が良さそう。 ソフトウェア的にはSwiftの各バージョンのランナーはベースイメージとちょっとエントリーポイントのパラメータを変えただけで同じものをデプロイできるから楽。いや、全部入りでもそんなにコードは変わらないんだけど。
Avatar
リソース効率についてなんですが、ちょっと調べたらサービスがたくさんいようが結局はホストインスタンスに対するコストになるので、各サービスが呼び出されていなくて実質休眠しているのならすでに最適な状態なのではないかと思いました
3:53 AM
常に各バージョンごとに最低1コンテナ起動していて、メモリだけ食ってる、とかならその分はかかってるかもしれないです (edited)
Avatar
Kishikawa Katsumi 8/5/2021 3:57 AM
確かに論理的には存在するけど物理的な2つか3つのマシンに同居しているわけですもんね。 VMとコンテナの関係は1つのマシンにdocker-composeでコンテナを管理してたのと一緒なのかな。。。?
Avatar
前も書いた気がするけど extension private なアクセスレベルがほしい。ある private メソッドからだけ呼ばれるメソッド群(処理に名前を付けるだけ)が他のメソッドから可視なのが気持ち悪い。それらを extension にまとめた上で extension private にして、そのメソッドからだけ可視にしたい。
Avatar
Kishikawa Katsumi 8/11/2021 1:22 AM
swift-format https://github.com/apple/swift-format をいろいろ試せるツール作った。 https://swift-format.com/
🎉 2
Avatar
カーソルがなぜかぴこぴこする...
Avatar
Kishikawa Katsumi 8/11/2021 8:12 PM
そこは直しかたがまったくわからない。。。😥 Tooltipを出すためにボタンをspanで囲ってtooltipの情報を設定しているからその辺かなあ。。。
8:13 PM
display-blockとかで直るかな。
Avatar
Kishikawa Katsumi 8/11/2021 8:28 PM
外側と内側でTooltipとボタンの役割を入れ替えて多少マシになったと思います。 どうもありがとうございます。
8:28 PM
まだ怪しいけど。
Avatar
Tooltip かも
8:29 PM
したからcursorを合わせるとぴこぴこするのはそこにtooltipが出ようとして
8:30 PM
自身のhoverイベントが消えてを繰り返してる感じ
8:30 PM
上からcursorを合わせるぶんにはぴこぴこしない
8:31 PM
tooltipにmouse hoverのイベントを食われないようにしないといけない感じ
Avatar
Kishikawa Katsumi 8/11/2021 8:32 PM
本当ですね。上からなら問題ない。
Avatar
ボタン上にあるからカーソルはしたからくるのがほとんどなので、ぴこぴこしちゃう
Avatar
Kishikawa Katsumi 8/11/2021 8:34 PM
ですよね。「?」ボタンも一緒の問題がありますね。。
Avatar
Kishikawa Katsumi 8/11/2021 9:29 PM
カーソルは下から来るからTooltipを上か横に出したらさらにマシになるか。なんとなく下に出るのが自然な気がして下向きにしたけど
Avatar
上に出したら体感は減りそう
Avatar
Kishikawa Katsumi 8/11/2021 10:10 PM
WebでTooltipをいい感じに出すっていうのはすごい高度な技術っぽいすね。
10:11 PM
横にすると吹き出しの三角の位置が微妙におかしい😥
Avatar
厳しいw
10:12 PM
tooltip ちゃんと出すのは iOS とかでも高度な技術だと思う
Avatar
Kishikawa Katsumi 8/11/2021 10:35 PM
確かに。ビューの外側に出したりスクロールして画面外にいったとき(さらに戻ったとき)の挙動とか難しいですね。
10:36 PM
data-bs-container っていうオプションを発見してそれでボタンを指定すれば安定するようになりました。
10:42 PM
bootstrap なのかあ。
10:44 PM
あれ?設定でspace 3にしたのに3にならない
10:44 PM
Runすると戻っちゃう感じが。
Avatar
Kishikawa Katsumi 8/11/2021 10:46 PM
むむ、調べます。
Avatar
変えた直後は3でフォーマットされるんだけど、Runすると2になっちゃう感じ
Avatar
Kishikawa Katsumi 8/11/2021 10:47 PM
Runボタンだけなんか違う処理通ってそうな感じですね。
10:51 PM
直せそうです。見えてない状態の値が取れなくなる、だと思います。 innerTextで値を取ってたところがあって、それをtextContentに変えたら大丈夫そう。どうもありがとうございます。
👍 1
Avatar
Kishikawa Katsumi 8/12/2021 2:59 AM
swift-formatはライブラリとして利用することもできて、最初はそうやってたんだけどCLIとしての利用が前提なのかいろんなところですぐfatalError()を呼んでるので結局コマンドラインから呼んでいるのであった。
3:00 AM
そうしないとちょっと構文エラーのある入力を与えるだけでサーバプロセスごとfatalError()で死んでしまうので。。。
Avatar
Kishikawa Katsumi 8/12/2021 4:46 AM
おおお、こんなのがあったんですね。 プロセスを分離するようなことができる可能性があったのか。 サードパーティの行儀の悪いライブラリなんかも隔離して実行したいとかサーバーサイドじゃなくてもiOSアプリでもあるんですよねえ。 (edited)
Avatar
そうなんですよ。これ期待してたんですけどね・・・。 Erlang だとこれに近いのがあるみたいで、 Actor ごとのプロセスだけクラッシュさせられるので、 Actor をエラーハンドリングの単位として使うみたいなことを聞いたことがあります。 (edited)
Avatar
便利...
Avatar
Kishikawa Katsumi 8/12/2021 4:10 PM
Swift 7あたりで入ってこないかな?
Avatar
ただ、今の actor を考えると、 Fault Isolation の単位が actor であるべきかは微妙な気がするんですよね。別の仕組みとして入った方が使い勝手が良さそうな。 Erlang みたいに何でも Actor でやる言語ならともかく。 (edited)
Avatar
子プロセス作るのをactorとして抽象化できるなら、アリだなという感じがしますね
Avatar
omochimetaru 8/13/2021 7:23 AM
Distributed Actorも
7:23 AM
相手先のfatalErrorはこっちがわに伝搬しなそう
Avatar
子プロセス作るのをactorとして抽象化できるなら
Erlang のプロセスは OS のプロセスとはまた別なんですよね。 Swift だと何が近いんだろ? Task かな?
8:57 AM
Task ごとに Fault Isolation があるといいかも?
Avatar
omochimetaru 8/23/2021 7:04 AM
protocolの extension で書く init の中だと self.initSelf.init の両方がほぼ同じ意味で書けるけど、意味が違うことを今日知った (edited)
7:06 AM
extension CodableFromLosslessStringConvertible { public init(from decoder: Decoder) throws { let c = try decoder.singleValueContainer() let string = try c.decode(String.self) // ここが self.init だと怒られる guard let value = Self.init(string) else { throw DecodingError.dataCorruptedError( in: c, debugDescription: "invalid string: \(string)" ) } self = value } } (edited)
Avatar
self.init は戻り値がないからかな?
Avatar
なるほど。
Avatar
omochimetaru 8/23/2021 7:13 AM
そうですね。 self.init は 別のinitへの転送という意味なので。 しかもこの場合、throwsなinitから optional なinitを呼んでてそこの不一致もある。
Avatar
classでself.init呼ぶ場合はconvenience initにしないといけないんじゃなかったっけ
Avatar
omochimetaru 8/23/2021 7:14 AM
そうだね。
Avatar
あとOptionalとfailureableは結構制約がある
Avatar
omochimetaru 8/23/2021 7:15 AM
細かい規則がいろいろあって結構むずいよね。
Avatar
クラスの init むずい。
7:16 AM
クラスの継承ってほとんど使わないし、継承使いがちな UIView とか UIViewController はパターン決まってるし、たまにクラスを継承して init 書くことあると戸惑う。 (edited)
Avatar
omochimetaru 8/23/2021 7:24 AM
クラスのinitはrequired init もありますからね。
Avatar
designated, required, convenience, override 😂
😵‍💫 1
Avatar
omochimetaru 8/25/2021 3:44 AM
😵‍💫 1
Avatar
NSErrorに化けるヤツかな
Avatar
omochimetaru 8/25/2021 3:45 AM
switch + is と if + as のとき、always succeeds って警告出すけど、実行してみると、失敗していて、警告が嘘。 (edited)
Avatar
ErrorとNSErrorの暗黙変換が悪さをしていて、diagnoseが壊れているのだと思います
Avatar
omochimetaru 8/25/2021 3:46 AM
これ長期的にどっちが正になるかわからんので怖いな。
3:47 AM
一応実挙動が維持されると思っていいか。
Avatar
NSErrorのせいでErrorを直で使うのは危ないので
3:48 AM
1層包むジェネリックなErrorを作ってその中に任意の構造を入れると安全になる
Avatar
omochimetaru 8/25/2021 3:48 AM
error as Any as? CustomStringConvertible で警告は消せた。 (edited)
Avatar
関連するバグを3.1の時に報告したけど未解決のままだな、今どうなってるんだろ https://bugs.swift.org/browse/SR-4414?filter=-2
3:51 AM
実際このときはalways trueになってたんだよね。だからおもちさんのそのコードも全部警告通りになってた
Avatar
omochimetaru 8/25/2021 3:52 AM
マジか。挙動変わってるのか。 (edited)
Avatar
だから今は治ってるのかな。まああんまり信頼できないんで1層ラップするのが良いと思うよ
Avatar
omochimetaru 8/25/2021 3:52 AM
いや、ルートのログレポートのロジックだから、Swift.Error で受けたいんだよね
Avatar
それは難しいなぁ
3:54 AM
"\(err)"にして薙ぎ払うとか?w (edited)
Avatar
omochimetaru 8/25/2021 3:54 AM
それは、CustomStringConvertible すら取れなかったときの最後の手段になってる
3:54 AM
swift-log を使うと、 Logger.Metadata ってのがあって
3:54 AM
なるべく構造を保ってログシステムに流そうとしている
Avatar
ふむー
Avatar
https://discord.com/channels/291054398077927425/306995750418513920/882003927468486707 で話してて、↓みたいな run 関数が標準ライブラリにあるとうれしい気がしてきた。 func run<T>(_ body: () -> T) -> T { body() } よくあるプロパティの初期化が var foo: Foo = { ... return Foo(...) }() みたいなのも var foo: Foo = run { ... return Foo(...) } と書ける。 () でクロージャ式即実行の気持ち悪さが緩和されそう。 非同期版の func run<T>(_ body: () async -> T) async -> T { await body() } もあれば、 MainActor に戻す処理も await { @MainActor in self.foo = foo }() じゃなくて await run { @MainActor in self.foo = foo } と書ける。
Avatar
MainActorの場合はMainActor.runが使えないですかね?(すいません何か勘違いしてるかもしれないです) https://github.com/apple/swift/blob/main/stdlib/public/Concurrency/MainActor.swift#L46 (edited)
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
Avatar
shiz
MainActorの場合はMainActor.runが使えないですかね?(すいません何か勘違いしてるかもしれないです) https://github.com/apple/swift/blob/main/stdlib/public/Concurrency/MainActor.swift#L46 (edited)
ありがとうございます!何か手段があった気がしてたんですが、これかもしれないです。 MainActor に戻す手段をどこかで見たなぁと思って WWDC のセッションや Proposal 漁ってたんですが、 { @MainActor in ... } を見つけて、これだったかも?ってなってました。
2:08 AM
↓の T.self をデフォルトにするのおもしろいですね。 JSONDecoder.decode とかもこれやってほしいかも。 static func run<T>(resultType: T.Type = T.self, body: @MainActor @Sendable () throws -> T) async rethrows -> T
2:12 AM
@swift-5.4.3 import Foundation extension JSONDecoder { func myDecode<T: Decodable>(_ type: T.Type = T.self, from data: Data) throws -> T { try decode(type, from: data) } } let decoded: [Int] = try! JSONDecoder().myDecode(from: "[2, 3, 5]".data(using: .utf8)!) print(decoded)
Avatar
[2, 3, 5]
Avatar
omochimetaru 8/31/2021 3:32 AM
↓の T.self をデフォルトにするのおもしろいですね。 JSONDecoder.decode とかもこれやってほしいかも。
↑これは当時仕様設計時に議論されて棄却されてました
(edited)
Avatar
えー、 MainActor.run でいいのはなぜ?用途が異なるから?
Avatar
Avatar
omochimetaru
↓の T.self をデフォルトにするのおもしろいですね。 JSONDecoder.decode とかもこれやってほしいかも。
↑これは当時仕様設計時に議論されて棄却されてました
(edited)
第一引数をなくすのではなく、デフォルト引数を与えるのも棄却されてたの?
Avatar
omochimetaru 8/31/2021 3:38 AM
その run はそもそも resultType がない場合は withXxx 系で多用されるパターンですよね
3:38 AM
だから、無いのが自然で、そこに追加的にresultTypeが足されてるって感じに見えます
Avatar
なるほど。
Avatar
omochimetaru 8/31/2021 3:39 AM
https://github.com/apple/swift-evolution/blob/main/proposals/0167-swift-encoders.md 昔のだからなのか、Alternative Considered章がないな・・・
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swift-evolution/0167-swift-encoders.md at main · apple/swift-evolution
3:41 AM
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swift-evolution/0166-swift-archival-serialization.md at main · apple/swift-evolution
3:42 AM
0166もあるのか。こっちはAltC書いてあるけど、型の件はないな
Avatar
左辺から逆向きに型をひっぱるの、型推論の気分次第で事故ることがあるので明示的なほうが好ましいと思います
Avatar
明示できるようにした上で、デフォルトで省略はありなのかなぁと思ったけどダメかなぁ。
Avatar
Avatar
Iceman
左辺から逆向きに型をひっぱるの、型推論の気分次第で事故ることがあるので明示的なほうが好ましいと思います
omochimetaru 8/31/2021 3:45 AM
そんな話があって当時、そうだなあと納得したんだけど、検索してもみつからね〜
Avatar
Avatar
koher
明示できるようにした上で、デフォルトで省略はありなのかなぁと思ったけどダメかなぁ。
omochimetaru 8/31/2021 3:45 AM
ちなみに推論に任せる場合の悩ましさとして、 右辺値から左辺値に代入する過程で生じうる暗黙の型変換が存在するので、そういう怖さはありますね
3:46 AM
例えば、左辺が Int? だった場合に、右辺が Int で推論されるのか Int? で推論されるのかが、 decode の場合は重い違いになってきます。
3:47 AM
代入文の右辺値・左辺値間もそうだし、関数呼び出し時の 実引数・仮引数間にも変換が生じます(しかもこっちは関数呼び出し用の謎変換が候補に追加される)
Avatar
暗黙型変換は辛い・・・。
Avatar
omochimetaru 8/31/2021 3:51 AM
First of all, great proposal 😃 Brent, earlier in the thread makes a lot of good points. But I’d still like to discuss two subjects: 1) What makes the proposal really stand on its feet compared to third-party libraries is the compiler generation magic. I feel divided about it. On one hand, this is the only solution today to have this level of t...
3:51 AM
2) Libraries like Marshal (https://github.com/utahiosmac/Marshal) and Unbox (https://github.com/JohnSundell/Unbox) don’t require the decoding functions to provide the type: those functions are generic on the return turn and it’s automatically inferred: func decode<T>(key: Key) -> T self.stringProperty = decode(key: .stringProperty) // correct specialisation of the generic function chosen by the compiler Is there a reason the proposal did not choose this solution? Its quite sweet.
3:51 AM
↑ご意見は見つかった
Avatar
これは第一引数をなくしてしまう話じゃない?
3:54 AM
なくすのはないと思っていて、デフォルトで T.self が与えられてるのはありかなぁと。
Avatar
omochimetaru 8/31/2021 3:54 AM
もしかして当時ってまだ protocol extension が無いからデフォルト引数が定義できなかった? (edited)
Avatar
JSONDecoder は具象型だから関係なくない? (edited)
Avatar
omochimetaru 8/31/2021 3:56 AM
JSONDecoder.decode はたしかに。 KeyedContainerProtocol.decode(:for) の話かと思ってました。そっちのほうがたくさん書くのが大変だし。
3:58 AM
https://forums.swift.org/t/proposal-foundation-swift-archival-serialization/5456/35 If each `KeyPath` encapsulates the type information, the `decode` methods won't need a `type` parameter.
3:59 AM
>>51 で matthewさんもこの話してるな
Avatar
たしかに JSONDecoder だけの話じゃないか。
Avatar
omochimetaru 8/31/2021 4:00 AM
ちょいちょい話題が出てくるのでもうちょっと進んだら反論が出てくるのかな
4:02 AM
うーんザッと見じゃわからんかった
4:02 AM
ML時代のやつで検索やハイパーリンクが弱いし、announcementの投稿も形式化されてなかったっぽいのでまとめ投稿が見つからん
Avatar
ML時代辛い・・・
Avatar
omochimetaru 8/31/2021 4:05 AM
There is probably some reason I don't understand that all of them require a metatype argument. Can we just give them all a default (i.e. making the beginning of the signatures look like this)? func decode(_ type: Decodable.Type = Decodable.self The .selfs are not helpful. Not having them is better. struct Coatable: Codable { let 🥼: Int l...
4:06 AM
最近になって聞いてる人がいるけど微妙な回答で終わってるな
Avatar
Avatar
omochimetaru
そんな話があって当時、そうだなあと納得したんだけど、検索してもみつからね〜
class UICell {} func _dequeue(_ type: UICell.Type) -> UICell { print(type) // MyCellが出てこない fatalError() } func dequeue<Cell: UICell>(_ type: UICell.Type = Cell.self) -> Cell { _dequeue(Cell.self) as! Cell } class MyCell: UICell {} class MyCell2: UICell {} func cell(for row: Int) -> UICell { let cell: UICell if Bool.random() { cell = dequeue(MyCell.self) } else { cell = dequeue(MyCell2.self) } return cell } cell(for: 0) おぼろげな記憶から思い出してみたんですがこんな感じだったかも?
Avatar
omochimetaru 8/31/2021 4:10 AM
@Iceman その場合は↓が正しいコードじゃない? func dequeue<Cell: UICell>(_ type: UICell.Type = Cell.self) -> Cell { _dequeue(type) as! Cell } (edited)
Avatar
そうですね。
4:10 AM
たいていのケースでうまくいってたのでミスの発見が遅れたパターンです (edited)
Avatar
omochimetaru 8/31/2021 4:11 AM
ああなるほど。まあ、実装ミスに関しては、標準ライブラリ仕様に関しては関係ないんじゃないでしょうか
Avatar
もうちょっと複雑だった気もするんですが、とりあえずミスってたときに気づきづらいなと
Avatar
omochimetaru 8/31/2021 4:13 AM
まあそれはありますね。間違った推論が伝搬して予想外のところでエラーが出たりする。
Avatar
Kishikawa Katsumi 9/9/2021 6:12 PM
前に書いたサーバー費用、支払いのチャートの詳しい見方がようやくわかって、ボトルネックはLSPのAPIを動かしてるサーバで、それをCloud Runで動かしていたのだけどLSPはかなりCPUを使ってるみたいで「使ったぶんだけ」の料金体系だと想像以上に費用がかさむようでした。 LSPをK8Sの方にうつしたらちょっと安定性は悪くなったんだけど(そこそこの頻度でリソース不足で止まる)費用は半分くらいになった。
6:13 PM
LSPはそこそこスペックが必要だなあというのはわかってたんだけどまさか実際にビルドして実行するよりもはるかにスペックを要求するとは考えの外だった。
6:15 PM
メモリは最低で1GB使ってきます。1GB使えないマシンだとLSPは全然動かない。でもGCPの料金計算だと、それよりも大量にCPUを使ってるみたい。 (edited)
Avatar
ビルドはボタン押したときだけだけど、LSPはコード書いてる間中動いているからでしょうか?
Avatar
Kishikawa Katsumi 9/9/2021 6:34 PM
詳細な要因まではわかってないです。。。
6:38 PM
トラッキング等も全然入れてないので(エラーログを送ってるくらい)実際にどういう使われ方をしているかは想像でしかないんですけど、、、 SourceKit-LSPの挙動を見る限りはタイプしているかカーソルをホバーしているか、という以外で無駄に動いてる様子はないので、補完とか型を表示するとかが重たいのかなあと。 (edited)
Avatar
Kishikawa Katsumi 9/11/2021 8:14 PM
Azureの方がGoogleより安いから移行して、さらに3年分のリソースをまとめて買う割引で15,000円/月くらいになった。 GoogleのManagedサービスがAzureにはほとんどないからその分を作る必要があったけどなんとかなった。 (edited)
✍️ 1
Avatar
CloudRun だとリクエストの数やCPU負荷に応じて複数のインスタンスが立ち上がってしまうと思います。 インスタンス数を制限すればある程度料金は抑えられたかなと思います。 (すでにやってたらすみません)
Avatar
Kishikawa Katsumi 9/13/2021 6:55 AM
制限すると一定以上の負荷はエラーにするってことですよね?
Avatar
はい、その通りです。
7:33 AM
あと、もしからしたら不必要にスケールしちゃってたかなと思いまして。
Avatar
Kishikawa Katsumi 9/13/2021 7:55 AM
最大までスケールするのは問題なかったんですけど、読み間違えましたね。VMが無駄に待機していると思ってたんですけどLSPに関しては使っただけ料金を払う方がだいぶ高かった、というのが誤算というか気付くのが遅れました。
👀 1
7:56 AM
負荷が来たときにエラーにするのは小さいVMを確保するのと変わらないのでそれは避けたかったんですよね。
7:58 AM
スケールするのは構わないけど無駄なリソースを待機させたくはない、、、でCloud Runか?と思って他のサービスはそれでよかったんですけどLSPは誤算でした。
Avatar
なるほど。ありがとうございます。 使わない時間が多ければ CloudRun でもかなり安くなると思ったのですが、LSPのような高負荷なプログラムだと難しいようですね
Avatar
LSPもそうですけど、起動コストが重たいサービスは常駐させるしかないのが辛いところですよね
5:19 AM
GitHub Codespacesは計算課金になってるの最近気づいて なるほどと思った
Avatar
ちょうどこんな発表がありました。本件では安くはできないとは思いますが。 https://cloud.google.com/blog/products/serverless/cloud-run-gets-always-on-cpu-allocation (edited)
New always-on CPU allocation for Cloud Run opens the doors to running workloads that use background processes.
Avatar
Kishikawa Katsumi 9/14/2021 7:24 AM
Cloud Runどんどん便利になっていくな。 私の場合VMの面倒をみたくない、というのが一番大きい感じなので(GoogleだとAPIでセットアップから自動化できるけどCloud RunやKubernetesに比べるとやっぱり面倒さがある)Cloud Runがどんどん便利になるといいのかなあ。 Cloud Runだとちょっと難しい、、、っていう場面を解決したい場合、次はKubernetesみたいなだいぶ大がかりな仕組みになってしまう、のでいい感じのCloud Runよりちょっと上のManagedコンテナのサービスがあるといいなあと思っている。 (edited)
Avatar
awsだとecsがあるんですよね。かなり楽。
Avatar
AWSだと少し前に出たこれがCloud Runっぽいとか? https://aws.amazon.com/jp/blogs/news/introducing-aws-app-runner/
この記事は Introducing AWS App Runner を翻訳したものです。 本日、 AWS 上でコンテナ化された Web アプリケーションをビルド、および実行するための最も簡単な方法である、 AWS App Runner を発表できることを嬉しく思います。 App Runner はコンテナネイティブのフルマネージドサービスです。オーケストレーターの設定、ビルドパイプラインの準備、ロードバランサーの調整、 TLS 証明書のローテートなどは必要ありません。そしてもちろん、管理すべきサーバもありません。 App Runner はアプリケーション実行時間に対する秒単位での課金と、セキュアなプロダクションワークロードを実行するために必要な全てを提供します。たった数クリックで、パブリッ...
Avatar
Kishikawa Katsumi 9/14/2021 8:46 AM
AWSもこんど使ってみよう。ECSとApp Runnerはどう違うんだろ
Avatar
AppRunnerはパッと説明見た感じインフラまで全部セットな感じがしますね
Avatar
Kishikawa Katsumi 9/14/2021 8:48 AM
あれ、ECSはEC2の管理が必要?
Avatar
Fargate使えば要らないです。
8:48 AM
GPU欲しかったらEC2必須
Avatar
Kishikawa Katsumi 9/14/2021 8:48 AM
なるほど。ここでFargateが出てくるのか。
Avatar
ecsは基本コンテナを動かすだけですね、インフラ周りは他で整えます (edited)
Avatar
Kishikawa Katsumi 9/14/2021 8:49 AM
なるほどわかってきた。私の場合まずFargateをやってみるのがよさそう。
Avatar
AppRunner、雰囲気いつもecsの周辺を整えてるのが最初から全部入ってるって感じかな
Avatar
Kishikawa Katsumi 9/14/2021 8:50 AM
FargateができたらECSもKubernetesもどっちもいけるんだな。
Avatar
どっちかというとECSとかEKSを動かすときに、マシンリソースがEC2 vs Fargateになってるって感じかな?
Avatar
Kishikawa Katsumi 9/14/2021 8:55 AM
Fargateは説明を読むだけだと結局わからないな。 GoogleでいうとGKEのオートパイロットモードが近そうだけど。
8:57 AM
AKSより先にFargateを試したほうが良かった気もするけどまあ別の何か作るのを考えよう。 (edited)
Avatar
AKSに紐付ける、実際にアプリケーションを動かすインスタンスがEC2かFargateという話なので、AKSを使うなら同時に触ることになりますね
Avatar
Kishikawa Katsumi 9/14/2021 9:00 AM
変な質問になるけどFargateに対応するGoogleとAzureのサービスはないんですか?
Avatar
どうなんでしょう?基本的にFargateに該当するサービスはGoogleやAzureでは内部に隠蔽されてる気がします
9:04 AM
AWSは最初はEC2のクラスタにECSを使ってコンテナをデプロイするって感じで、でもEC2クラスタ管理するのめんどくさいよねってことでFargateが後から生まれた感じだったと思います。Cloud RunとかAzureのAppServiceなんかはそのステップが最初からないので見えてないか、あるいはDedicated Instanceみたいな文脈で指定する方法があるのかも
Avatar
Kishikawa Katsumi 9/14/2021 9:06 AM
そうなんですね。GとMに比べてFargateはすごく楽そうに見える。GKEでいうとたぶんオートパイロットはかなり運用面では近いものになりそう。 Azureはその辺をManagedにする、っていうのがなんとなくあまりないように見える。
Avatar
Azureはひたすらよくわからんですね。サービス仕様の統一感がないしサービス間のつながりもよくわからないです
👀 1
Avatar
Kishikawa Katsumi 9/14/2021 9:10 AM
Azure混乱してますよね。ひとつひとつのサービスはよく言えばシンプルなのでManagedを諦めたら挙動はわかりやすいとかあるけど。
Avatar
たしかに1個のサービスがやたら高機能だったりしますね。
Avatar
Kishikawa Katsumi 9/14/2021 9:10 AM
あとリソースグループの仕組みはとてもいいと思う。Gもクリーンアップが簡単にできてほしい。
Avatar
omochimetaru 9/14/2021 9:32 AM
-Ounchecked をdeprecatedにするって話があったと思うんですけど、いま調べ直したら特に確定的な事は出てこなくて、どうなったんでしたっけ
Avatar
@swift-5.4.3 func main() { let a: Int??? = 42 print(a as Any) guard let a = a else { return } print(a as Any) guard let a = a else { return } print(a as Any) guard let a = a else { return } print(a) } main()
Avatar
Optional(Optional(Optional(42))) Optional(Optional(42)) Optional(42) 42
Avatar
素晴らしい。
Avatar
Avatar
omochimetaru
-Ounchecked をdeprecatedにするって話があったと思うんですけど、いま調べ直したら特に確定的な事は出てこなくて、どうなったんでしたっけ
これはなんか、 deprecated にしようぜって話が出たけど結局決まらないままだった気がします。ただし、その後ウォッチしてないので新しい話が出てたらわからないです。
3:49 AM
(とりあえず AtCoder の Swift に付いてる -Ounchecked を取り除きたい・・・)
Avatar
Avatar
koher
これはなんか、 deprecated にしようぜって話が出たけど結局決まらないままだった気がします。ただし、その後ウォッチしてないので新しい話が出てたらわからないです。
omochimetaru 9/16/2021 3:53 AM
そうなのかー 調べたら根拠らしきもの見つけられなかったので、そうっぽい。
Avatar
-Ounchecked 自体はパフォーマンス追求するなら必要なんじゃないのかなぁ。分岐予測とかでほぼカバーできるにしても。ただ、 99% のケースでは不要。少なくとも AtCoder には要らない・・・。
Avatar
omochimetaru 9/16/2021 3:55 AM
仕組みとして必要なんですけど -remove-runtime-asserts などの指定があるので
3:55 AM
-O ファミリーである必要はないと思うんですよね。
3:55 AM
最適化レベルは他の副作用も多く含むので
3:56 AM
logic failure時の安全機構の除去は、最適化とは別のスイッチになってるのが良いと思う。
3:56 AM
最適化と、安全性の除去は、分けておく。 (edited)
Avatar
うーん、 -Onone かつ -remove-runtime-asserts がユースケースとしてあり得るのかや、 assert-O で消えることとの一貫性とか考えると最適化の一種じゃないのかなぁ。 (edited)
Avatar
omochimetaru 9/16/2021 3:58 AM
-Osize はあり得ると思います
Avatar
最適化と、安全性の除去は、分けておく。
このとき assert については -O で消える?消えない?
Avatar
omochimetaru 9/16/2021 3:59 AM
最適化は、こう書き換えても同じだよね、ってときにやることで、 そんときに、とにかく速度を目指すか、コードサイズ肥大は避けるか、という戦略はユースケース次第
4:00 AM
assertは安全性は提供しないですね
4:00 AM
preconditionFailureはNeverなんですけど
4:01 AM
assertionFailureはNeverじゃないんです
4:01 AM
よってassertレベルは、デバッグのために仕込むようで、ロジックとしては存在しない扱いというか・・・
4:01 AM
ロジック上存在しない事になる分岐なので、安全性を提供できない。
4:02 AM
preconditionは、残る前提なので、安全性を提供するために使う。 配列のインデックスアクセスが範囲内であるかの検査とかのレベル。
4:02 AM
で、安全性を放棄するとき、preconditionレベルの分岐を消せる。
4:03 AM
assertレベルは開発中のバグ出し用で、preconditionレベルは出荷製品のメモリ安全性を担保する用
Avatar
そうだなぁ。そうすると -remove-runtime-assertsassert ではなく precondition を消すためのものというのが明確だといいかなぁ。
Avatar
omochimetaru 9/16/2021 4:04 AM
あれ、もしかして、 remove-runtime-asserts
4:04 AM
assert を消すだけのものなのかしら? (edited)
4:04 AM
オプション名からはめっちゃそう見える。。
4:05 AM
def RemoveRuntimeAsserts : Flag<["-"], "remove-runtime-asserts">, Flags<[FrontendOption]>, HelpText<"Remove runtime safety checks.">;
4:05 AM
名前が悪そうだなあ
4:05 AM
-remove-safety-checks のほうがよくね?
Avatar
assertprecondition の名前は混乱していて、 Array のインデックスチェックは precondition ではなくインターナルななんとか assert 関数が呼ばれてたような気がする。
4:06 AM
そういう意味で、 precondition も広義の assert の一種なのでは。
Avatar
omochimetaru 9/16/2021 4:06 AM
stdlibの中のassertは外界でいうpreconditionみたいな
4:06 AM
感じでしたっけ。
Avatar
Avatar
koher
そういう意味で、 precondition も広義の assert の一種なのでは。
omochimetaru 9/16/2021 4:06 AM
そうかもしれない
Avatar
あれー、記憶と違うな。 _precondition になってる。 @inlinable @inline(__always) internal func _checkValidSubscript(_ index: Int) { _precondition( (index >= 0) && (index < immutableCount), "Index out of range" ) } https://github.com/apple/swift/blob/main/stdlib/public/core/ContiguousArrayBuffer.swift#L589-L596
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
4:15 AM
しかも6年前からそのままだ。
Avatar
@fushiroyama そこはRustのResultとかOption! あとHaskellのEitherみたいな偉大な先駆者がいるので要チェックです。
@nobu_k @fushiroyama Haskellにはdo記法がありますし、Rustも?がありますが、そういう道具のない言語だと、EitherやResult中心のエラーハンドリングはボイラープレートだらけになりませんか?try-catchは一種のdo記法のようなものではないでしょうか?
@koher @fushiroyama 自分はミドルウェアや分散システムにおけるサービスの開発がメインなのですが、まともなエラー報告やロギングをしようと思うと例外やRustのResultがあっても結局if err != nilとあまり変わらないコードになっていくと言う印象です。分野によるとは思います。
@nobu_k @fushiroyama たしかに、細かく場合分けしてエラーハンドリングすることが求められるなら、あまり変わらなさそうですね。おっしゃるように、do記法やtry-catchが活きるかは分野によりそうです。
Avatar
omochimetaru 9/17/2021 3:51 PM
Swiftのtry-catchを知らないから (edited)
3:51 PM
Haskellのdo記法を肯定してるのにtry-catchを否定する意見になってるんじゃないですかね?
Avatar
概念的には完全に同じなので、知らないだけだと思いますね
Avatar
omochimetaru 9/17/2021 3:52 PM
JavaやC#風(Rubyもかも?)のtry-catchを想定して発言してるように見える。
Avatar
いや、そういう話じゃなくて、一つ一つの処理で発生しうるエラーごとに異なるハンドリングが必要な分野では、結局 do 記法的なものがあってもなくても対して変わらないって意見じゃないかな?
3:53 PM
それが求められるなら確かにそうだと思うんよね。結局一つずつ catch して適切なエラーに包んで投げるとか、ログを吐くとか。
Avatar
一行ずつのエラーの取り扱いが違うからって事ですよね
Avatar
はい。
Avatar
omochimetaru 9/17/2021 3:54 PM
いわゆるred-green flowにならないから要らないという理屈は通りますね。
Avatar
その場合においてもResultとerr!=nilを同一視は、後者は型検査として一段落ちるから微妙な気はするけど (edited)
3:55 PM
do記法が役に立たない分野がある、は確かに有り得るなと思いました
Avatar
型検査として一段落ちるのはそうだけど、 do 記法や try - catch がボイラープレート削減に寄与しないことがあるのはありえそう。
3:56 PM
たるのんさんと同じことを繰り返しただけになってしまった。
Avatar
一応、一行ずつのエラーの型が異なれば、例外処理をまとめてパターンマッチに落とすという書き方が出来て
3:57 PM
そうすると正常処理をまとめて読むことが出来るので正常系の可読性は良くなる(引き換えに異常系の可読性は一行毎のエラーの型についての知識が要求されて下がる)なので
3:58 PM
どっちを取るかなんじゃないかと思いました
Avatar
そうですね。僕だったらパターンマッチにしなさそう。そして guard ... catch { } みたいなのほしくなりそう。
Avatar
僕は正常処理と異常処理で分けたいからパターンマッチかなぁ
Avatar
結局 Optional では都度書くしかないから、それだったらエラーもそれでいいかなと。まとめてハンドリングできるケースなら do - catch したいですが。
Avatar
まあそもtrycatchが本当に真価を発揮するのは非同期が混ざってきてからなんで
4:01 PM
その辺も含めて考えますね
Avatar
I/O エラーみたいな何か一つやる度に発生して、どこで発生しても同じようにハンドリングすることが多いケースは do - catch が活きますよね。
4:02 PM
クライアントサイドも、色んな種類のエラーが来てもログさえ吐けば、あとは大体同じというケースは多そうなので do - catch が活きそう。
Avatar
ただしHaskelを引き合いに出しつつ例外処理が違うとしてるのは、なんともやという感じではありますね
Avatar
そこはたしかに微妙ですね。ただ、元の話は Go だったので。
Avatar
mapErrorが行毎にシュッと出来る機能は欲しいのですよね
4:09 PM
正確にはflatMapErrorか
4:10 PM
Optionalの??に相当するオペレーター、ただしerrorを他のError型に変換するケースも有り得るみたいな
4:10 PM
うーんでも、それなら一行毎のハンドリングでいいやってなるのかなぁ
Avatar
↓みたいに書きたくなりそうな気がするんですよね。 guard let x = try foo() catch { throw BarError(cause: error) }
Avatar
それはflatMapErrorに相当しますね
4:19 PM
guardの左側でtryできるのが良さそう (edited)
4:20 PM
うーん、伝わるかな…
Avatar
同じことしようとすると、今は let x: Foo do { x = try foo() } catch { throw BarError(cause: error) } になるのが辛くて・・・。
4:21 PM
Swift は Java の try - catch を改良したとはいえ、↑のパターンは解決できてないので guard - try - catch がほしい。
Avatar
omochimetaru 9/17/2021 4:21 PM
ちょっと考えたけど、
4:21 PM
分野によってはred-greenにならないっていう主張は、僕は成立しないと思います
Avatar
guard let x = try? foo() else { throw BarError() } はできるけど cause がとれない。
Avatar
omochimetaru 9/17/2021 4:22 PM
なぜなら、普通に抽象化していけば
4:22 PM
実現したい処理に名前をつけて関数化して、それに対して、途中でそれを阻害する失敗原因が複数ある、っていう形に整理されるからです
4:22 PM
局所的に復帰するパターンについては、
4:22 PM
その復帰も含めて閉じ込められるので、結局その外側はred-greenになるはずだし
4:23 PM
ログを出すとかも、別にエラーをthrowした先でログを出すとか出さないとか、どういうログを出すかを、エラーごとに切り替えられるんで
4:23 PM
結局そこでred-greenの全体構造は変わってないし。
4:23 PM
もし、そうならない分野があるとしたら
4:23 PM
アルゴリズムを実装してる部分とかぐらいじゃないですかね
4:24 PM
ソートアルゴリズムとか実装してるときにその内部のフロー制御はエラー制御は出てこないけど複雑な分岐や遷移がある。
4:24 PM
組み込み系だからというのも成り立たないと思っていて
4:24 PM
Linuxのカーネルのソースコードとかも
Avatar
それを常にできる人ならtrycatchがあればなお良いというのは理解できるし、世の中の大半の人間にはそれは無理で、そして問題を解くにあたってそこまでやるのはオーバーキルだから、一行毎のチェックで良いんじゃいというのも、理解は出来るよ (edited)
Avatar
omochimetaru 9/17/2021 4:24 PM
正常系に名前をつけてエラーが横にそれていく設計になっていると思う。みたことがある限りでは。
Avatar
ただまぁ、そうだとしても、error!=nilは、サボったらコンパイルエラーになって欲しいけどねw
Avatar
omochimetaru 9/17/2021 4:25 PM
検査例外はチェックを忘れない位置行ごとのチェックと同じなので
4:26 PM
毎回ifで分岐するスタイルの優位性はやっぱり全く無いと思う
Avatar
それはその通りだと思いますよ
Avatar
omochimetaru 9/17/2021 4:26 PM
Swiftに関して言えば、throwsがuntypedだから
4:27 PM
その点でtyped errorなResultモナドのほうが良い、って事はあると思うけど
4:27 PM
それもやっぱりtry-catch一般論とは別の話でSwiftの実装がそうなってるってだけなので。
Avatar
red-greenって何?ググったけど見つからない・・・。
Avatar
omochimetaru 9/17/2021 4:28 PM
JSでPromiseが流行り始めたときによく言われてたやつですね
4:28 PM
いわゆるtry-catchの挙動を、そう名前をつけて説明してる文章がたくさんあった
4:29 PM
👀 1
4:29 PM
↑こういうの
Avatar
うおおdo構文そのものだ!!!
4:31 PM
誰が言い始めたんだろう、railway oriented って言葉のほうが正しいのかな
4:31 PM
↑のブログにも同じ図がのってる (edited)
Avatar
なるほど。言いたいことはわかったと思う。
Avatar
omochimetaru 9/17/2021 4:32 PM
まあ、こういう制御フローをやりたいときに、try-catch構文はマッチするというのが僕の主張の前提で
4:33 PM
で、こういう制御フローにしたくない分野なんてないんじゃないか、と思ったということです。
Avatar
たとえば X をするために A, B, C という処理が必要で、それぞれエラーを起こしうる処理で、それらのエラーを読み替えて X の文脈におけるエラーに変換したいみたいな場合に、 try - catch でボイラープレート削減ができないんじゃないかなと。
Avatar
omochimetaru 9/17/2021 4:35 PM
個別にcatchして変換してもいいし、まとめてcatchして変換を一括して書いてもいいんじゃ?
Avatar
func x() throws { do { try a() } cathc { throw XError.foo(cause: error) } do { try b() } cathc { throw XError.bar(cause: error) } do { try c() } cathc { throw XError.baz(cause: error) } } みたいな。
Avatar
omochimetaru 9/17/2021 4:36 PM
それでもifで書くよりいいですよね。catch忘れがないんだから。
Avatar
try catchの役割はボイラープレート削減だけではなく
4:36 PM
って書かれてた
4:39 PM
検査例外が機能してる言語が少なすぎて
4:39 PM
世の中の大半のプログラマーの例外処理がJavaかJavaScriptのイメージになってて、良いものと思って貰えないというのは
4:39 PM
間違いなくあるでしょうね
Avatar
Go の方式はチェック忘れが起こり得るけど、 Result なら func x() -> Result<X, XError> { guard case .success(let a) = a() else { return .failure(XError.foo) } guard case .success(let b) = b() else { return .failure(XError.foo) } guard case .success(let c) = c() else { return .failure(XError.foo) } return .success(.init(a, b, c)) } みたいな場合には忘れることは起こらなくない?
Avatar
ResultはGoのそれよりずっと良いと思いますよ
Avatar
↑が求められるケースでは do - try - catch はあまり役に立たない。
4:41 PM
という話なのかなと。
Avatar
omochimetaru 9/17/2021 4:41 PM
パターンマッチで毎回 case success ってかいてるところがノイズだと思います。
4:42 PM
恩恵が相対的に小さいのはそうだと思います。
4:42 PM
あとResultはsuccessがvoidの場合にチェック忘れがありえます。
Avatar
一行毎にtry-catchするシーンにおいてguardが欲しくなるは、なるほどあるなぁ。それがないと、ネストがどんどん深くなるや
Avatar
で、そういうコードばっか書いてると try - catch 要らなくない?って発想になるのかなと。
Avatar
omochimetaru 9/17/2021 4:43 PM
あー1ステップは3行になってるのは良いところですね。
Avatar
(なので、それについては guard let a = try a() catch { ... } がほしい。) (edited)
Avatar
omochimetaru 9/17/2021 4:44 PM
ただそれに関しても try recover { try a() } catch: { throw XError.foo(cause: $0) }
4:44 PM
こういう高階関数を書けば2行にできるしなあ
4:44 PM
まあそれだったらtryでもResultでも同じと言えるか。 (edited)
4:45 PM
なるほど。guard - catch は良さそう。
4:45 PM
else の代わりに catch キーワードを使えるんですね。
Avatar
うん、なので、 try でも Result でも変わらないようなコードってのはあって、その Result の劣化版として if のチェックでも対して困らないよって考えはまああり得るのかなと。
Avatar
omochimetaru 9/17/2021 4:46 PM
try でも Result でも変わらないようなコードってのはあって
ここまでは納得できるけど
4:46 PM
その Result の劣化版として if のチェックでも対して困らない
これはやっぱり同意できないですね。
Avatar
ただし、そういう分野ばかりではないから、 try - catchdo 記法がなくていいということにはならないと思う。
Avatar
omochimetaru 9/17/2021 4:46 PM
劣化でしかないのはそうだし。
Avatar
Avatar
omochimetaru
その Result の劣化版として if のチェックでも対して困らない
これはやっぱり同意できないですね。
まあそりゃそうだけどさ、それを言い始めたらまず null safety が、とかなっちゃうし😅
4:47 PM
null safety を諦めてる環境なら、そこを諦めるのも似たような話な気がする。
Avatar
omochimetaru 9/17/2021 4:48 PM
例外も継承も使わなくなって何年も経つけど、むしろ両方とも無い方が良いと思うようになった。
「無いほうが良い」になる理屈にはなってないと思います。
4:48 PM
「無くても良い」ならわかる。
4:49 PM
「言語組み込み文法が多いとeasyではあるがsimpleではないので習得が難しいので無いほうが良い」という主張なら有り得そうだけど、この人は10年やってるらしいのでそういうレベルの負担はないだろうし。
Avatar
そうだね。そこは非検査例外に引きずられてると思う。
4:50 PM
JS とかの非検査例外しかない環境がヤバイのは間違いなくて、それを悪とみなしたらそういう発想になりそう。一方で、検査例外は Java しか知らないから構文が悪いせいでやっぱり悪と考えてしまう。
Avatar
omochimetaru 9/17/2021 4:50 PM
はい、そういう感じの立ち位置だと思います。
Avatar
ただ、どうせ行ごとにハンドリングしなきゃいけないから do 記法的なもの( try - catch を含む)があまり有効でない世界というのはあまり考えたことがなかったなと。
Avatar
omochimetaru 9/17/2021 4:53 PM
なるほど
Avatar
昨日ここで Haskell の do 記法と throws / try の話をしていたら、偶然だけど今日 inamiy さんが iOSDC で do 記法と async / await の話をしていた。 https://speakerdeck.com/inamiy/iosdc-japan-2021
Swift 5.5 async/await を支えるモナド、継続、コルーチン by 稲見 泰宏 | トーク | iOSDC Japan 2021 #iosdc - fortee.jp https://fortee.jp/iosdc-japan-2021/proposal/9e810800-1829-493b-891f-f80e80bcbdac
Avatar
apple/swift-format、swift5.5のリリース版使ってもthrowable getterを破壊してくるなw
😇 2
2:21 AM
public static subscript<EnclosingSelf: AnyObject>( _enclosingInstance object: EnclosingSelf, wrapped wrappedKeyPath: ReferenceWritableKeyPath<EnclosingSelf, Value>, storage storageKeyPath: ReferenceWritableKeyPath<EnclosingSelf, Published<Value>> ) -> Value {
2:23 AM
この、PropertyWrapperが、プロパティを持ってる外側の型にアクセスする機能、 SE0258でfuture directionsに書いてある機能なんですけど、 OpenCombineですでに利用されてるの、いつ入ったんでしょう?
2:23 AM
アンスコが付いてるから、非公式に隠れで入ってる?
Avatar
かなり前に書いた覚えがある
Avatar
本人登場
Avatar
Combine本体でも使われてるはず
Avatar
どこでこれ見つけたんですか?
Avatar
omochimetaru 10/1/2021 2:24 AM
SwiftUIは @_disfavoredOverload みたいに裏技使うから、SwiftUIのためにこっそり入ってたんかね
Avatar
swiftinterfaceをこっそり見たんですかねぇ
Avatar
https://github.com/apple/swift/blob/3fc18f3603d9d99e2fe456c532e8f9201bcd1f18/stdlib/public/Concurrency/TaskLocal.swift#L185-L193 static varにしかつけられないPropertyWrapperを定義できるのか、面白い (edited)
Avatar
Neverなるほど
Avatar
omochimetaru 10/1/2021 2:28 AM
裏技すぎない?
2:28 AM
それでいいのか??w
2:28 AM
いや、これは潰してるだけだからいいのか?
2:29 AM
Neverがあるとstatic限定になる特別なルールがあるわけじゃなくて
2:29 AM
Neverに固定されてるからNever型以外のインスタンスプロパティに使えなくなっているだけか
Avatar
ぽいですね。賢い
2:32 AM
setにだけunavailable付けられるんだ
Avatar
omochimetaru 10/1/2021 2:39 AM
ほ〜
Avatar
というか、これどういうタイミングで気がついたんですか? (edited)
Avatar
omochimetaru 10/1/2021 2:43 AM
@Iceman が気がついた
Avatar
Published 使ってたらこれがstructなのに違和感を覚えて、色々と気になってきてOpenCombineを調べてみたら見つけたって感じです
Avatar
なーるほど
Avatar
omochimetaru 10/1/2021 3:07 AM
アイスマン「家庭くんはどこで見つけたんだ」 家庭くん「アイスマンはどこで気がついたんだ」
t_kusa 3
Avatar
swift 5.5の#if for postfix member expressionsをapple/swift-format@0.50500.0でも壊してくる。configとかで制御できるのかな。// swift-format-ignoreで一旦はしのげますが VStack { Text("something") #if os(iOS) .iOSSpecificModifier() #endif .commonModifier() } がこうなりConsecutive statements on a line must be separated by a newlineエラーに VStack { Text("something")#if os(iOS) .iOSSpecificModifier() #endif .commonModifier() }
Avatar
↓みたいな JSON 型が標準で提供されると便利そう。自由なフォーマットの JSON をコード側で扱いたいとき。 JSONSerialization と比べるとパフォーマンス悪いけど。 enum JSON { case number(Double) case boolean(Bool) case string(String) case array([JSON]) case object([String: JSON]) case null } extension JSON: Codable { init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() if let value = try? container.decode(Double.self) { self = .number(value) } else if let value = try? container.decode(Bool.self) { self = .boolean(value) } else if let value = try? container.decode(String.self) { self = .string(value) } else if let value = try? container.decode([JSON].self) { self = .array(value) } else if let value = try? container.decode([String: JSON].self) { self = .object(value) } else if container.decodeNil() { self = .null } else { throw DecodingError.dataCorrupted(.init(codingPath: decoder.codingPath, debugDescription: "Failed to interpret as a JSON value.", underlyingError: nil)) } } func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() switch self { case .number(let value): try container.encode(value) case .boolean(let value): try container.encode(value) case .string(let value): try container.encode(value) case .array(let value): try container.encode(value) case .object(let value): try container.encode(value) case .null: try container.encodeNil() } } }
12:40 AM
let json = "[true]".data(using: .utf8)! let decoded = try JSONDecoder().decode(JSON.self, from: json) // .array(.boolean(true))
Avatar
JSONSerializationが返すAnyは辛いのでそれ欲しいっすね
Avatar
decode が特にパフォーマンス悪そうなんだけど、なんかもっといい方法あるかなぁ。
Avatar
JSONSerialization使った後にAnyをJSON型に再起でキャストする方が速かったりしそう
Avatar
そうなんですけど、それだと Codable の仕組みの上で実現できないんですよね〜。
Avatar
JSON型はいかなる場合においてもそれがJSONであればデコードに成功するものなので、無理にCodableに乗せる必要も無いのかな、と思いました
3:26 AM
camelCaseとかやりたい場合はCodableになるか。でもそれぐらい。
Avatar
たとえば JSON をダウンロードしてそれを Firestore に入れたいときに Codable の仕組みを使いたいとか、 YAML に変換したいとか。
Avatar
yutailang0119 10/23/2021 3:31 AM
前におもちとJSON型作る話して、同じようなのやった
Avatar
Codable に適合しつつも、 JSONSerialization を使った高速なデコードが提供されてたらいいのかな。
Avatar
そうですね
Avatar
yutailang0119 10/23/2021 3:33 AM
Codableなレスポンスの中に不定なJSON stringが入ってるパターンで必要だった (普通そんなことないやろと思うけど)
3:33 AM
JSON parserから作って直接生成すれば速い
😅 2
Avatar
downloadTask の completion handler に渡される URL は
You must move this file or open it for reading before your completion handler returns. Otherwise, the file is deleted, and the data is lost.
という制約があるんですが、 https://developer.apple.com/documentation/foundation/urlsession/1411608-downloadtask 新しい download(...) async throws -> (URL, URLResponse) の場合ってどうなるんでしょう? API リファレンスには何も書いていない。 https://developer.apple.com/documentation/foundation/urlsession/3767355-download もし downloadTask と同じなら actor context の引き継ぎとかでキューに投入されてる間に消えてしまうし、そうでなければいつ削除されるんでしょう?
Avatar
手元で動かした感じだとTask抜けたあとも.tmpファイルずっと残ってますね
10:58 AM
実物のディレクトリFinderで覗いてもずっと残ってる(SessionTaskのほうだとすぐに消える)
Avatar
なるほど。現実的には move して利用すると考えると問題ないのかもしれませんが・・・。逆に downloadTask のときにどうやってファイルの read/write が衝突しないようにすればいいのかも微妙ですね。
Avatar
@escaping が小文字始まりなのに @Sendable が大文字始まりなの気持ち悪い気が。
Avatar
それは初期に議論がありました 最初 @sendable だったけど、 protocol Sendable と同じ意味なら @Sendable のほうがよくない?という話になった
Avatar
そっちの気持ちもわかるけど、大文字 @ って Property Wrapper や Global Actor 等に限定されてたと思うのに、 @Sendable はそのルールを破ってる気がする。
Avatar
大文字のルールは型名のルールの方から来てるんでしょうね
Avatar
まあ、それもマーカープロトコルに紐付いていると考えればいいのか?
3:26 AM
クロージャがプロトコルに適合できない以上、 Sendable 以外のマーカープロトコルが導入された場合には @Sendable 相当のものが必要になると考えられ、そうするとプロコトル名に @ を付けるのは合理的だし、 Property Wrapper や Global Actor の @ が型名から生成されることとも一貫性があるのか。
Avatar
あ、そうですね
3:27 AM
まさにそのように他のマーカープロトコルでも同じ事になっていくぞ、という話もありました
Avatar
なるほど。
Avatar
@swift-5.5.3 var a = 2 var b = 3 print(a, b) (a, b) = (b, a) print(a, b)
Avatar
Avatar
koher
@swift-5.5.3 var a = 2 var b = 3 print(a, b) (a, b) = (b, a) print(a, b)
2 3 3 2
Avatar
swap の方がいいだろうけど、これでも書けたのか。
Avatar
NSErrorcode ではなく、あえて _code を使っているコードを見かけたのですが、どんな意図が考えられますか?公開できるコードではないので貼れないですが・・・。
Avatar
なんだこれ。確かに使えますね。
2:26 AM
NSError *error; error->_code;
Avatar
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
2:26 AM
public protocol Error: Sendable { var _domain: String { get } var _code: Int { get } // Note: _userInfo is always an NSDictionary, but we cannot use that type here // because the standard library cannot depend on Foundation. However, the // underscore implies that we control all implementations of this requirement. var _userInfo: AnyObject? { get } #if _runtime(_ObjC) func _getEmbeddedNSError() -> AnyObject? #endif }
2:27 AM
Swift.Error って空じゃないんだ・・・
2:27 AM
Xcodeからは見えない
2:28 AM
NSError._code じゃなくて、
2:28 AM
Error._code が隠しパラメータとして存在していて
2:29 AM
NSError is Error だから、 NSError のじゃなくて Error_code を見ているのかも
Avatar
そういうことか。 ErrorNSError にしたときに Error_codecode として使うのか。
Avatar
あ〜だから、NSError化したときにどうなってほしいか、これを使えばコントロールできるのか。
👍 1
Avatar
NSError化したときにどうなってほしいか
これは CustomNSError が用意されてるので違うような気もしますね
Avatar
正規の方法はそっちか。
Avatar
このハック使ったことあるんだけど、なんで使ったのか思い出せない
Avatar
Kishikawa Katsumi 12/7/2021 8:49 AM
@norio_nomura Herokuのスペア(オフロード先?)として https://render.com/ はよさそうです。Herokuと同様にDockerFileをマルッとデプロイできてFreeプランの制限も似たような感じでした。
Render is a unified cloud to build and run all your apps and websites with free TLS certificates, global CDN, private networks and auto deploys from Git.
Avatar
Avatar
Kishikawa Katsumi
@norio_nomura Herokuのスペア(オフロード先?)として https://render.com/ はよさそうです。Herokuと同様にDockerFileをマルッとデプロイできてFreeプランの制限も似たような感じでした。
norio_nomura 12/7/2021 8:50 AM
お、チェックしてみます。
8:51 AM
ストレージが従量なのかな?
Avatar
Kishikawa Katsumi 12/7/2021 8:52 AM
あ、そこはみてないですね。永続Diskが必要な場合はたぶん別途費用が発生しますね。イメージに収まらないDiskがありますか?
8:53 AM
ステートレスだと思っていました。
Avatar
norio_nomura 12/7/2021 8:54 AM
コンテナのサイズが従量課金対象外になってるなら使えますね。 (edited)
Avatar
Kishikawa Katsumi 12/7/2021 8:57 AM
大丈夫じゃないかな。あまりそこに制限がある(物理的な制限はある)サービスは見ないですね。 https://swift-ast-explorer.com/ をさっき移行して様子を見ています。だいたいこれで1.3GBくらいのイメージサイズのはず。
Visualize Swift AST and select nodes within the editor, a great way to learn about the structure of Swift syntax trees.
Avatar
norio_nomura 12/7/2021 9:02 AM
FreeだとRAM 256MBですが、Swiftコンパイラ動きますか? https://render.com/pricing/#services (edited)
Render is a unified cloud to build and run all your apps and websites with free TLS certificates, global CDN, private networks and auto deploys from Git.
🤔 1
9:03 AM
Linkerが頑張ったりしなければ問題ないのかな。
Avatar
Firebase Functionsでコンパイラ動かしたときは少なくとも1GBくらい必要でした
t_kusa 1
Avatar
norio_nomura 12/7/2021 9:06 AM
今Botが動いてるHerokuはRAM 512MBだった。
Avatar
おお、そんなもんで動くんですね。環境によるのかな
Avatar
Kishikawa Katsumi 12/7/2021 9:10 AM
コンパイルどうかなあ。SwiftFiddleだと128 MB memory limitでDockerを制限して起動しているけど動いてますね。
9:12 AM
ホストもAve 128Miでスケールするような設定にしているけどそこがスケール必要な事態はそんなに起こってないんですよね。ということはこのDiscordで使われてるくらいなら問題ないんじゃないかな。
Avatar
とりあえず、Heroku同様にWeb無しWorkerのみインスタンスを作ろうとしたけど、全く詳細が表示されないエラーで失敗する…
Avatar
Kishikawa Katsumi 12/7/2021 10:35 AM
ビルド(デプロイ)も動かないですか? (edited)
10:36 AM
いや、デプロイはできて実行で失敗している、ということかな。
Avatar
ビルドが走ってそうな雰囲気もなく、即座に失敗します。 "Sync failed for Blueprint" っていうタイトルのメールが届く。
Avatar
Kishikawa Katsumi 12/7/2021 10:39 AM
なんだろう。追加しようとしているのは「Web Service」ですか?
Avatar
"New Blueprint Instance"を選び、リポジトリとブランチを指定しています。
Avatar
Kishikawa Katsumi 12/7/2021 10:43 AM
Dockerfile1つで完結するなら「Web Service」を選んでリポジトリとブランチを指定、でいいと思いますよ。 Health checkのEndpoint /healthz を用意するかそこの設定を変える必要はあるかもしれません。
Avatar
Web Service用のポートをリッスンしたりしないので、Dashboardから選ぶならBackground Workerですね。
10:52 AM
そして、Background Workerを追加しようとするとクレジットカード入力を求められました。
Avatar
Kishikawa Katsumi 12/7/2021 10:54 AM
ああ、そうですね。勘違いしていました。確かにBotを運用するならそうですね 🙏
Avatar
DashboardのWeb UIがありえないくらい遅いので、ちょっとまた後日試そう…な感じ。残念。 (edited)
Avatar
Kishikawa Katsumi 12/7/2021 10:56 AM
私の環境だとWeb UIはむしろHerokuより速く動いてるような印象ですね。
Avatar
Web UIはページを開き直したら速くなりました。
Avatar
Kishikawa Katsumi 12/7/2021 11:07 AM
なるほど。なんかHeroku Alternativeを自称しているくらいだからちょうどいいかと思いましたが、Botの運用には合わないですね。
Avatar
Pricingを見るとBackground WorkerもFreeで利用できるようにも読めるけど、Dashboardの挙動を見る限り$7/moなStarterが必要ぽいです。 https://render.com/pricing/#services
Avatar
Kishikawa Katsumi 12/7/2021 11:16 AM
そのようですね。Freeが選べない。
Avatar
Web Serviceを使った非常駐型なBot(構想中)ならば使えそうな気がします。
Avatar
Kishikawa Katsumi 12/7/2021 11:18 AM
RESTとWeb Socketによるものは使えました。スリープ時間もステータスチェックのサービスを使ってたら自然に起きるので問題はないですね。
Avatar
各アカウント宛のメンションを常駐監視する役割のボットを決めて、RESTで非常駐なボットを起こして〜みたいな感じにしようかと。
Avatar
Kishikawa Katsumi 12/7/2021 11:21 AM
マイクロサービスっぽい。
Avatar
接続中のWeb Socketクライアントがいたらサーバーもsleepしない、とかだと面白いかも。>render.com
Avatar
Kishikawa Katsumi 12/7/2021 12:21 PM
Free tierがあるだけで従量制だからスリープしないのはむしろありそう。
12:22 PM
ブラウザから繋いでる分には普通にちょいちょい切れて再接続するので挙動を見るのは難しんですけども。
Avatar
guard try ... catch { ... } がほしい・・・。
t_wakaru 2
Avatar
例外まとめて投げるんじゃなくて、1行ごとにエラーハンドリングを細かく書きたい時にほしくなる (edited)
Avatar
let もできるといいよね。 guard let foo = try bar() catch { ... }
Avatar
let do catchだと5行かかって大変
Avatar
Avatar
koher
let もできるといいよね。 guard let foo = try bar() catch { ... }
それを考えてました
Avatar
guard let が Optional Binding 以外に使われるのは微妙だけど、これ提案したら通らないかなぁ・・・。
Avatar
Optionalに落とし込む高階関数を作って、それをguardと一緒に使う手はあるかなあ
5:22 AM
たまに考えるんだけどたまにしか出てこないからやらながち
Avatar
guard let foo = try? bar() else { ... } はできるけど、エラーが取れないんよね。
Avatar
ですね。形は近いけど機能が足りない
Avatar
Avatar
koher
guard let が Optional Binding 以外に使われるのは微妙だけど、これ提案したら通らないかなぁ・・・。
普通にパターンとしてはあると思うので欲しい人は居るかも?
Avatar
時間ができたら過去ログ漁って、なかったらForumに書いてみるか。 (edited)
Avatar
行数的にはシンプルな形なら let foo: T do { foo = try bar() } catch { ... } で済むのであんまりメリットなさそうですけど,型名を省略できるというメリットならありそうですね. (edited)
Avatar
guardはelse節で脱出を強制されているメリットもあると思います。 (edited)
Avatar
確かにそれはありますね.一方で do catch だとエラーの型に応じて catch を分けることができますが,guard の場合もそれをやろうと思うと構文が複雑になっちゃいそうで,else 節 (catch 節?) 一つにまとめてしまうとその中で switch で分岐させないといけなくなったりしそうですね.
Avatar
guard let foo = try bar() else catch { switch error { case let FooError as error: print(...) default: print(...) } return } こんなイメージです。
Avatar
はい.それはイメージ合います. そして現状だと以下の 2 パターンがあると思いますが,let への代入前提の場合だと結局これらでも代入か脱出を強制されているので,guard とあまり変わらなさそうですね.(型を省略できる以外は) let foo: T do { foo = try bar() } catch let error as FooError { print(...); return } catch { print(...); return } let foo: T switch Result(catching: { try bar() }) { case .success(let value): foo = value case .failure(let error as FooError): print(...); return case .failure(let error): print(...); return }
Avatar
docatch を複数繋げられるの知りませんでした! 確かに初期化拒否すると脱出が強制されるのはそうですね。なるほど。
Avatar
Kishikawa Katsumi 12/26/2021 6:05 AM
@swift-5.4.3 let foo = true let bar = true outer: if foo { if bar { print("bar") break outer } print("not bar") } print("end")
Avatar
Avatar
Kishikawa Katsumi
@swift-5.4.3 let foo = true let bar = true outer: if foo { if bar { print("bar") break outer } print("not bar") } print("end")
bar end
Avatar
Kishikawa Katsumi 12/26/2021 6:05 AM
知らんかった。Swiftもラベルに飛ぶってあるんですね。
Avatar
実はありますね
8:45 AM
これのせいで、複数後置クロージャの第二クロージャの文法が出た時に、ラベル構文と干渉しないのか?って議論がありました (edited)
Avatar
Kishikawa Katsumi 12/26/2021 8:46 AM
おお、干渉しないんだ。
8:47 AM
外側に来ないから干渉しないのかな。
8:47 AM
いや、そもそもラベルってどこでも書けるのかな。
Avatar
どうだったかな? なんか紛らわしいパターンは生まれてる気がする どういう解釈になるかが固定されただけで
Avatar
Kishikawa Katsumi 12/26/2021 8:53 AM
すぐ下にスコープがある場合に書けるっぽいな。
8:54 AM
@swift-5.4.3 https://swift.org do { print("OK") } (edited)
Avatar
Avatar
Kishikawa Katsumi
@swift-5.4.3 https://swift.org do { print("OK") } (edited)
OK
Avatar
Kishikawa Katsumi 12/26/2021 8:55 AM
なるほど。
Avatar
Kishikawa Katsumi 12/26/2021 9:03 AM
DispatchQueue.main.async { [weak this = self] in ... } キャプチャにその場で名前つけられるっていうのも知らんかった。 ブラウザの古いタブを整理していて知らないTipsがいろいろ見つかった。
Avatar
キャプチャ時の命名って右辺値にどんな式でも書けるのかな
Avatar
Kishikawa Katsumi 12/26/2021 9:08 AM
足し算は書けた。なんでもかけるんじゃない?
😯 1
9:09 AM
print()も書けたから関数呼び出しもかける
9:10 AM
つまりキャプチャするために一時変数に入れるっていうのをしたいわけだけど、その一時変数のスコープを不要に長くしなくて済むってことだな。
9:13 AM
DispatchQueue.main.async { [foo = self.foo, bar = self.bar] in ... } というのを典型的な利用例だと思うけどこの場合selfはキャプチャされない、でいいのかな?
Avatar
そのはずですね。また [foo, bar] と省略してかけます
9:51 AM
IUOはOptionalになってしまうので、 [foo = foo!] という感じになります
Avatar
右辺値側はクロージャを作るコンテキストで評価されるんですね。なるほどなるほど。
Avatar
Kishikawa Katsumi 12/26/2021 10:21 AM
あ、そうか。プロパティならそもそもそれでいいのか。
Avatar
Kishikawa Katsumi 12/26/2021 10:08 PM
Raw String Literal、ダブルクオートをエスケープしなくていいのは便利だけどそんなに読みやすくない。。。Xcodeが外と中で色を変えてくれるといいんだけど。
10:09 PM
それかRubyやJSみたいに全然違う記号を使えるほうがよかったな。
Avatar
Runtime warningが出せるのも面白いし、パラメータを探っていくのも面白かった https://www.pointfree.co/blog/posts/70-unobtrusive-runtime-warnings-for-libraries
Runtime warnings in libraries are a great way to notify your users that something unexpected has happened, or that an API is being used in an incorrect manner. In this post we give an overview of some techniques that can be employed easily today, as well as discuss a technique for surfacing runtime warnings that is both very visible and unobtrus...
Avatar
それ使えるんだ
Avatar
Kishikawa Katsumi 1/5/2022 7:55 AM
なんかに使えそうだよね
Avatar
許容できない入力をエラーに落としつつIDEからも警告出すのは普通に良さそう
Avatar
Kishikawa Katsumi 1/5/2022 8:05 AM
コンソールに出すよりいいな
Avatar
悪いところがはっきりするから体験良いですよね
8:06 AM
止めずに使えるブレークポイントの感覚
Avatar
公式のAPIはよう
Avatar
os_logの仕組みなんすね
8:28 AM
ハッキーだけどdsoでログの発生源騙すくらいなら許容できそう
Avatar
この様子だとまだなんかos_logでできそうだよね
Avatar
ありそう
Avatar
Kishikawa Katsumi 1/14/2022 6:39 AM
https://discord.com/channels/291054398077927425/420754624975339520/894810082120974376 @niw さんに教えてもらったこのプログラム、昨日返事が届いて承認されました 🎉 タダにはならないけど少しの金銭的な援助が受けられることになりました。
🎉 1
Avatar
Avatar
Kishikawa Katsumi
https://discord.com/channels/291054398077927425/420754624975339520/894810082120974376 @niw さんに教えてもらったこのプログラム、昨日返事が届いて承認されました 🎉 タダにはならないけど少しの金銭的な援助が受けられることになりました。
やったー
Avatar
Kishikawa Katsumi 2/12/2022 12:59 PM
そういえばこのDiscordはおそらくスレッドがAtcoderチャンネル以外では使われてない(あとはスレッドの導入初期にテスト投稿があるだけ)
Avatar
yutailang0119 2/17/2022 1:12 PM
これって話題になってたっけ? https://twitter.com/cockscomb/status/1494243453013610502
URLSessionのConcurrencyなAPIってiOS 13までバックポートされようとしてるのかな https://t.co/AT6nVLuuZa
👀 1
Avatar
omochimetaru 2/17/2022 1:13 PM
しらんかった
1:13 PM
Concurrency はバックポートあるけどiOS SDK APIは無いから自前実装だねって話だったけど (edited)
1:14 PM
このへんもバックポートされたら便利だな
Avatar
yutailang0119 2/17/2022 1:19 PM
今日教えてもらったんだけど、こういうが関係するのか、Xcode 13.3をインストールすると、iOS 12.4のシミュレータが使えなくなるらしい https://developer.apple.com/documentation/Xcode-Release-Notes/xcode-13_3-release-notes
Avatar
そう言えば swift build とか swift test とかのようなXcodeプロジェクトが存在しない純粋なSwiftPMプロジェクトって、何か xcresult もしくはそれに準ずるビルド結果の出力ってあるのかな 👀
Avatar
Swift言語のワーキンググループの立ち上げを検討しているみたいですね👀 The intent is to free the core team to invest more in overall project stewardship and create a larger language workgroup that can incorporate more community members in language decisions. https://forums.swift.org/t/core-team-to-form-language-workgroup/55455 (edited)
Avatar
https://forums.swift.org/t/pitch-2-light-weight-same-type-requirement-syntax/55081/144
I'm sorry but I don't follow swift evolution and haven't been a part of the core team since middle of last year. I don't have enough context to have an informed opinion here.
えー
I'm sorry but I don't follow swift evolution and haven't been a part of the core team since middle of last year. I don't have enough context to have an informed opinion here. -Chris
Avatar
それもびっくりでした😅 (edited)
Avatar
Kishikawa Katsumi 2/21/2022 12:06 AM
Swift言語のワーキンググループ
他の言語もだいたいそうだけど、特定の会社の色(Swiftの場合はアップル)を消していく必要があるのでしょうね。
12:06 AM
Swiftの現状を考えてもおそらくいい影響を与えるんじゃないかな。
Avatar
> 他の言語もだいたいそうだけど、特定の会社の色(Swiftの場合はアップル)を消していく必要があるのでしょうね。
そうですね。社内事情(スケジュール)的な要因とは切り離して進めていけたら良いのではないかなと思ってます。(そうなっているとは限りませんが、最近(先週)Acceptされたプロポーザルたちは、なんかまとまる前に終了したような風に見えて、そこら辺が関係あるのかなと個人的には感じてます😅)
(edited)
Avatar
omochimetaru 2/21/2022 1:12 AM
この前 @d_date も同じ意見を言ってたな
Avatar
Kishikawa Katsumi 2/21/2022 1:12 AM
まあその辺のいろいろは感じるよね。ってなるとプロセスの信頼性というかマジメにレビューにコメントしたりProposalするのが徒労に感じてしまうみたいな影響が出てきそうなのも良くなくてそういうふうにならないように進むといいんじゃないかな。
Avatar
omochimetaru 2/23/2022 2:08 AM
クリスラトナーが去年の夏からコアチームを離れた理由について質問されて回答しているんだけど コアチーム会議が攻撃的(toxic)で、ビデオ会議で侮辱されたり(insulted)怒鳴られた(yelled)が、リーダーが改善しなかった フォーラムはすぐ炎上する(more heat than light)、自分の形式的なレビューは一方的に無視される(ignored by the unilateral accepts)、 頑張っても特定人物とこじれるだけで時間の無駄(wasting my time) 自分が影響を与えられなくなった(outgrown my influence)、自分の重視する設計原則は考慮されなくなった などなど書かれていて残念すぎてヤバい・・・ https://forums.swift.org/t/core-team-to-form-language-workgroup/55455/6
Moderator note: this post was originally in the light-weight same-type requirement syntax thread, but only because this thread was locked. We have re-opened this thread and moved this post to separate it from the technical discussion in that thread. Someone asked for more information: I'm sorry but I don't follow swift evolution and haven't ...
😰 2
Avatar
職場の心理的安全性…
Avatar
Avatar
koher
えー
omochimetaru 2/23/2022 3:59 AM
ラトナー自身AIチップ?の会社建てたり、やりたいことが他にもあるのはいいとして、 こんな理由でラトナーがSwiftから離脱するのめちゃくちゃ損失大きいですよね
4:00 AM
フォーラムはなんだかんだヒートアップしても紳士的な感じだからちゃんとしてるなと思ったら、 コアチームのビデオ会議(WebEx)はそうではないっていうのも残念
Avatar
フォーラムはなんだかんだヒートアップしても紳士的な感じ
うん、そんな気がしてたから(英語力が足りなくてニュアンスがつかめてないのかも&最近フォーラムはあまり覗いてないからかもしれないけど)、コアチームの中がそんなことになってたのは意外・・・。
Avatar
Kishikawa Katsumi 2/23/2022 9:49 AM
読んだ。Swiftの仕事はだいぶプレッシャーがキツそうだな。
Avatar
言われてますけど、Appleの秘密主義とか悪影響が凄そう
Avatar
Apple内コアチームメンバーが会社事情で進めたいことがあり、外部のコアチームメンバーはその事情は見えないから一般論で話し、衝突してお互いストレス感じる場面とか多そうですね。
Avatar
海外勢のSwiftUIで面白い議論があったのではってみます https://twitter.com/stroughtonsmith/status/1502033870904045568 (edited)
The harsh reality of SwiftUI in 2022 is that it doesn’t enable a competent dev to build a better app. It gives you a lesser-than-native, less-reliable, less-compatible, less debuggable app — a two-tier system where 3rd-parties may never be able to compete with Apple’s own
Likes
372
11:42 AM
この方はSwiftUIにわりと否定的なんですけれど、実際プロダクションで使ってるよ!という反論含めておもしろかったです
Avatar
Kishikawa Katsumi 3/13/2022 1:19 PM
私はかなり同意しますね。SwiftUIはSwiftUIでできる範囲についてはとてもうまく表現できるけどそれをちょっと超えるとできなくて詰んでしまうのでうまくSwiftUIでできる範囲に収めるっていうのがある意味で腕の見せどころかなと思います。
t_naruhodo 1
1:21 PM
UIKitだとUIKitは十分簡単ですが対AppKitだと、SwiftUIでできる範囲の部分はSwiftUIがはるかに簡単なので勝負はだいぶ難しいですね。
Avatar
宣言型UIに置き換えることで、イテレーティブな改善がやりやすくなる点はメリットだと思っているので、少なくともUIKitでできていたことがそのままバックポートされてくれると嬉しいですね… (「SwiftUIだとこれは難しいので…」みたいな説明で納得してくれる環境があるなら、使えると思うんですけれど…)
1:52 PM
AppKitは完全に棲み分けになりそうな気がしています。簡単に作れて全プラットフォームに配れるけれど、できることに制限があるSwiftUIと、AppKitと、みたいな感じで
Avatar
Kishikawa Katsumi 3/13/2022 2:03 PM
「SwiftUIだとこれは難しいので…」みたいな説明で納得してくれる環境
これ重要なんですよね。自分一人のプロジェクトはSwiftUIに合わせて調整していけるけど、利害関係者が多いプロジェクトは難しそう。
Avatar
Another Swift 5.6 feature ♥️: Diagnose API breaking changes. If you are a library owner, it is now easy to check if you accidentally break public API. Ideally you make this part of your CI. Huge shoutout to community contributor @owenvoorhees who implemented this.👌 https://t.co/Y9qk0qUhg5
10:28 AM
api-digesterがSwiftPMに統合されて、バージョン間でのAPIの破壊的変更が検知できるようになったらしい (edited)
Avatar
Kishikawa Katsumi 3/17/2022 10:29 AM
これどうやって使うものですか?自分のライブラリで前のバージョンから非互換の変更を加えたのがわかる?
Avatar
ですね
10:30 AM
swift-nioとかだとCIでbreaking changeをチェックしてました https://github.com/apple/swift-nio/blob/main/scripts/check_no_api_breakages.sh (edited)
Event-driven network application framework for high performance protocol servers & clients, non-blocking. - swift-nio/check_no_api_breakages.sh at main · apple/swift-nio
Avatar
Kishikawa Katsumi 3/17/2022 10:30 AM
見てみよう
10:32 AM
https://github.com/apple/swift-nio/blob/main/scripts/check_no_api_breakages.sh#L41-L42 swift api-digester -sdk "$sdk" -dump-sdk -module "$module" \ -o "$output/$module.json" -I "$repodir/.build/debug" これかな。
10:32 AM
あ、重なった。ありがとう。
Avatar
norio_nomura 3/22/2022 1:39 AM
JIRAからGitHub Issuesへ移行するらしい。 データ移行には、Swift ForumsのProfileに各ユーザーが登録したGitHub UsernameとJIRA Usernameを使うため、それらの更新を求められてる。 https://forums.swift.org/t/swift-bugs-are-moving-to-github-issues-and-we-need-your-help/56125
Swift bugs are moving to GitHub Issues and we need your help! Swift's open source project issues are currently in JIRA, making it difficult for developers to discover and integrate them into our workflows on GitHub, such as pull requests. To provide a better workflow for developers, we are working on migrating JIRA to GitHub Issues. The issues ...
👀 1
yoshi 1
Avatar
仮に他人のgithubのid 入れたり入れられたらどうなるんだろう?
Avatar
norio_nomura 3/27/2022 7:53 AM
Swift ForumsはGitHubアカウントでログイン出来るので、その情報は使えないのかな?とは思いましたが、JIRAのアカウントをリンク出来なければ、どのみちなりすましは防げませんよね。
Avatar
ArrayとかDictionaryの _modify の気持ちを考えていると、yieldで渡ってきた値対して複数の操作をしたいとき、こういうのがstdlibに欲しくなる func modify<T, ResultType>(_ x: inout T, _ body: (inout T) -> ResultType) -> ResultType { return body(&x) }
1:22 AM
書いてたコード // Before var frame = controlStack.last! self.valueStack.removeLast(valueStack.count - frame.height) frame.unreachable = true self.controlStack[controlStack.count - 1] = frame // After modify(&self.controlStack[controlStack.count - 1]) { frame in self.valueStack.removeLast(valueStack.count - frame.height) frame.unreachable = true }
Avatar
inoutの参照になってればブロックの中で複数回操作してもエコなんでしたっけ
Avatar
ストレージ上の値を直接操作できるので、値全体のコピーと書き込みが必要なくなってエコですね
Avatar
こういうのはコンパイラさんがなんとかしてくれると嬉しいなぁ
Avatar
まあわかる
Avatar
stdlibに入ってないのはそう言う気持ちがありそうとか思ったw
Avatar
@swift-5.6.3 -O @_optimize(none) func blackhole<T>(_: T) {} func modify<T, ResultType>(_ x: inout T, _ body: (inout T) -> ResultType) -> ResultType { return body(&x) } struct Element { var value1: Int64 var value2: Int64 var tails: [Int64] } func modifyElement(items: [Element]) { var items = items modify(&items[0]) { item in item.value1 = 42 item.tails[0] = 50 } blackhole(items) } import Foundation let start = Date() for _ in 0..<1000000 { let baseItems = [ Element(value1: 1, value2: 2, tails: Array(repeating: 24, count: 3000)), ] modifyElement(items: baseItems) } let elapsed = Date().timeIntervalSince(start) print("took \(elapsed)") (edited)
Avatar
Avatar
Yuta Saito
@swift-5.6.3 -O @_optimize(none) func blackhole<T>(_: T) {} func modify<T, ResultType>(_ x: inout T, _ body: (inout T) -> ResultType) -> ResultType { return body(&x) } struct Element { var value1: Int64 var value2: Int64 var tails: [Int64] } func modifyElement(items: [Element]) { var items = items modify(&items[0]) { item in item.value1 = 42 item.tails[0] = 50 } blackhole(items) } import Foundation let start = Date() for _ in 0..<1000000 { let baseItems = [ Element(value1: 1, value2: 2, tails: Array(repeating: 24, count: 3000)), ] modifyElement(items: baseItems) } let elapsed = Date().timeIntervalSince(start) print("took \(elapsed)") (edited)
took 2.2947229146957397 (edited)
Avatar
ああ、Clockは5.7からか
1:57 AM
@swift-5.6.3 -O @_optimize(none) func blackhole<T>(_: T) {} struct Element { var value1: Int64 var value2: Int64 var tails: [Int64] } func modifyElement(items: [Element]) { var items = items var item = items[0] item.value1 = 42 item.tails[0] = 50 items[0] = item blackhole(items) } import Foundation let start = Date() for _ in 0..<1000000 { let baseItems = [ Element(value1: 1, value2: 2, tails: Array(repeating: 24, count: 3000)), ] modifyElement(items: baseItems) } let elapsed = Date().timeIntervalSince(start) print("took \(elapsed)") (edited)
Avatar
Avatar
Yuta Saito
@swift-5.6.3 -O @_optimize(none) func blackhole<T>(_: T) {} struct Element { var value1: Int64 var value2: Int64 var tails: [Int64] } func modifyElement(items: [Element]) { var items = items var item = items[0] item.value1 = 42 item.tails[0] = 50 items[0] = item blackhole(items) } import Foundation let start = Date() for _ in 0..<1000000 { let baseItems = [ Element(value1: 1, value2: 2, tails: Array(repeating: 24, count: 3000)), ] modifyElement(items: baseItems) } let elapsed = Date().timeIntervalSince(start) print("took \(elapsed)") (edited)
took 2.611519932746887 (edited)
Avatar
むしろ遅いな ベンチのとり方が間違ってた。 (edited)
Avatar
ちゃんと速い
Avatar
omochimetaru 4/20/2022 3:14 AM
同じ動機でmodify自作してる、あとコードも短くなるしね トップレベル関数じゃなくてメソッドにしている https://github.com/omochi/WeaselRoll/blob/main/Sources/WeaselRoll/Scope/Scopeable.swift#L16
Contribute to omochi/WeaselRoll development by creating an account on GitHub.
3:21 AM
これだとconformさせないといけないから現実的に標準で入れるならトップレベル関数だろうなあ
Avatar
しかしこんなことを考えながらプログラミングしないといけないの大変だし、最適化でどうにかしたい
Avatar
omochimetaru 4/20/2022 3:35 AM
最適化前のコードでさえ、
3:35 AM
コレクションからreadするときとwriteするときで、
3:35 AM
少なくとも2回、インデックス操作しているところが冗長かつバグの危険があるから
3:36 AM
その心配がない書き方は必要だと思う
Avatar
まあそうかぁ
Avatar
omochimetaru 4/20/2022 3:37 AM
inout item = &array[index] item.foo = a item.bar = b これが既定路線かな
Avatar
Rustの &mut っぽい
3:38 AM
&でinout取ったらそのスコープではその後array には触れない?
Avatar
omochimetaru 4/20/2022 3:38 AM
item が生きてる範囲では触れない
3:38 AM
スコープだと不便なので endScope(item) を追加しようという話もある
Avatar
Hello, swift-evolution. Memory ownership is a topic that keeps poking its head up here. Core team members have mentioned several times that it's something we're interested in working on. Questions sometimes get referred back to it, saying stuff like "we're working on tools to let you control ARC a little better". It's even on the short l...
Avatar
omochimetaru 4/20/2022 3:42 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
3:42 AM
inout変数について直接書いてあるのはココ
Avatar
ふむふむ
Avatar
Taskvalue: Success { get async throws } だけど Resultvalue: Success { get throws } にならないのかな 🤔
Avatar
omochimetaru 5/21/2022 8:40 AM
コードの互換性が壊れちゃうからもう直せなそう
Avatar
Result.value ってもうありましたっけ?
Avatar
omochimetaru 5/21/2022 8:44 AM
あれ? Result.get()
Avatar
うむ
Avatar
omochimetaru 5/21/2022 8:44 AM
あー getとvalueだからいけるか。
Avatar
Hi Swift Evolution, The shortest of pitches... Introduction This proposal introduces a throwing value property to access the Success value of a Result. Motivation SE-0310 added throwing properties, and so SE-0304 has a throwing value instead of get(). This adds a matching equivalent to Result to allow for consistent use. Proposed soluti...
Avatar
typed throws 周りの議論で止まって?しまったんですね… (edited)
Avatar
swift-async-algorithmsにManagedCriticalStateというstructがあり、 https://github.com/apple/swift-async-algorithms/blob/main/Sources/AsyncAlgorithms/Locking.swift 用途としては、複数のactorとかqueueで状態を共有する場合や、前に他のスレッドで話にあったwithTaskCancellationHandlerのcancelHandlerで利用することが想定されているのですが、 https://github.com/apple/swift-async-algorithms/pull/7 actor内部の値にsyncにアクセスしたい場合にも使えるのかなと思ったのですが、どうなんでしょう?withCriticalRegion内部でawaitできないのでデータ競合は起きないのかなーと思ったのですが… actor A { let state = ManagedCriticalState(0) nonisolated var value: Int { state.withCriticalRegion { $0 } } func update() { state.withCriticalRegion { $0 += 1 } } } func test() async { let a = A() await a.update() print(a.value) // 1 } await test()
Async Algorithms for Swift. Contribute to apple/swift-async-algorithms development by creating an account on GitHub.
This is a pre-requisite for managing state for backing storage that cannot be managed as an actor (due to cancellation). Locking is heavily inspired from the cross platform implementation in swift-...
Avatar
出来そうな気配がありますね
👀 1
Avatar
Avatar
shiz
swift-async-algorithmsにManagedCriticalStateというstructがあり、 https://github.com/apple/swift-async-algorithms/blob/main/Sources/AsyncAlgorithms/Locking.swift 用途としては、複数のactorとかqueueで状態を共有する場合や、前に他のスレッドで話にあったwithTaskCancellationHandlerのcancelHandlerで利用することが想定されているのですが、 https://github.com/apple/swift-async-algorithms/pull/7 actor内部の値にsyncにアクセスしたい場合にも使えるのかなと思ったのですが、どうなんでしょう?withCriticalRegion内部でawaitできないのでデータ競合は起きないのかなーと思ったのですが… actor A { let state = ManagedCriticalState(0) nonisolated var value: Int { state.withCriticalRegion { $0 } } func update() { state.withCriticalRegion { $0 += 1 } } } func test() async { let a = A() await a.update() print(a.value) // 1 } await test()
omochimetaru 5/25/2022 4:39 AM
考え方はあってると思いますよ。でも、それはActor以前のJavaのsynchronizedのようなインスタンス別のロックベースの並行プログラミングに戻っているだけなので
4:39 AM
そうした方式の既知の問題を踏んでいく事になると思います
4:41 AM
フィールドの読み書きをアトミックにして並行アクセスに安全なオブジェクトを作る事ができるけど
4:41 AM
現実的には「タイミングを待つ」方式が必要になって、
4:42 AM
そこで、 1. 同期の内側でコールバック関数を呼ぶ 2. 同期の外側で非同期なコールバックを投げる のどちらかが必要になります
4:42 AM
1を選択すると、そのコールバック内でさらにそのオブジェクトを触ろうとしたときにデッドロックするという問題が生じます
4:43 AM
リカーシブロックで問題を緩和する事ができますが(Javaはこれ)、結局2つ以上のアクセスフローが絡まったパターンでデッドロックします
4:45 AM
2を選択すると、結局そこで非同期な待機ポイントが挟まるので、 状態遷移の途中状態にアクセス可能なタイミングが生まれて考慮が難しくなります。
4:46 AM
1はいざエンバグした場合にデバッグするのが難しいので
4:46 AM
常に2になるように強制する事でシンプルにするのと、 メッセージボックスによる直列化でフィールド自体のロックのオーバーヘッドを回避したのが、 SwiftのActorです
4:48 AM
クリティカルセクションの問題は、保護する範囲が拡大していってデッドロックしうるパターンに踏み込むのが一番怖い部分なので、
4:49 AM
適切に使う分には、「syncで状態を読めるActor」でバランスを取れると思います。
Avatar
なるほど…ありがとうございます!なんか1周しただけなんですねw
適切に使う分には、「syncで状態を読めるActor」でバランスを取れると思います。

現状Actorはreentrantなので難しいということでしょうか?(結局デッドロックのリスクは変わらないですかね...?)
Avatar
omochimetaru 5/25/2022 9:04 AM
フィールドを保護してるだけだったら大丈夫なんですけど
9:04 AM
「syncで状態を読める」価値をちゃんと出そうとすると
9:05 AM
「状態を変更するメソッド」も、syncで呼べるようにしないとあんまり意味がない状況が出てくるんですよね
9:05 AM
でも、状態を変更するメソッドの中でロックしている内部で更に別のメソッドを呼ぶとか
9:05 AM
ロックしている内部のタイミングでコールバックしたいとか
9:06 AM
そういう要求が出てきたときにデッドロックのリスクが浮上してくるって感じです
9:06 AM
デッドロックを避けようとするとその部分だけは非同期で遅れてコールバックされる仕組みになるので
9:07 AM
設計上の線引が難しくなると言うか。
9:07 AM
reentrantなので難しいと言うか、actorはデッドロックしないアーキテクチャとしてreentrantを選択しているので
9:08 AM
内部でのロックを導入すると、actorによって心配する必要がなくなったデッドロックのことを
9:08 AM
また考えないといけなくなってくるのがデメリットって感じですかね
9:11 AM
iOS SDKで提供されてるいろんなモジュールは一般的には同期な操作と非同期な操作が混在しているので、 そういうものを作りたい要求はあるはずで、Actorの中でロックを活用する、というのも間違っているわけではないです、ただ難しいという話です
9:12 AM
Actorの思想はそこから進んで同期的な操作を完全に捨てる次世代の設計思想な感もありますが、 UI描画更新とかでどうしても同期になっていてほしいものってありますからねえ。 (edited)
🙇🏻‍♂️ 1
👏🏻 1
Avatar
レイアウトやアニメーションの発火だけは1tickのズレも許されないですからね (edited)
Avatar
omochimetaru 5/25/2022 9:23 AM
ですねえ。そういうところではActor思想が噛み合わなくてロックの利用が必要になってくるはず
Avatar
ありがとうございます!mm Actorはnon reentrantから同じような理由でreentrantにデフォルトが変わった経緯を思い出しました。 将来的な検討事項にnon-reentrantとか新しいtask-chain reentrantが書いてあるので将来的にはできるのかなあと思ってました。 https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md#non-reentrancy (edited)
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swift-evolution/0306-actors.md at main · apple/swift-evolution
Avatar
Avatar
shiz
ありがとうございます!mm Actorはnon reentrantから同じような理由でreentrantにデフォルトが変わった経緯を思い出しました。 将来的な検討事項にnon-reentrantとか新しいtask-chain reentrantが書いてあるので将来的にはできるのかなあと思ってました。 https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md#non-reentrancy (edited)
プログラミングは難しくなるけど必要性はあるからそのへん今後どうなるか気になりますね
t_desune 1
Avatar
@swift-main -Xfrontend -enable-experimental-named-opaque-types func lazyMapCollection<C: Collection, T>(_ collection: C, body: @escaping (C.Element) -> T) -> <R: Collection where R.Element == T> R { return collection.lazy.map { body($0) } }
Avatar
Avatar
Yuta Saito
@swift-main -Xfrontend -enable-experimental-named-opaque-types func lazyMapCollection<C: Collection, T>(_ collection: C, body: @escaping (C.Element) -> T) -> <R: Collection where R.Element == T> R { return collection.lazy.map { body($0) } }
swiftNightly BOT 5/29/2022 9:03 AM
no output
Avatar
omochimetaru 5/29/2022 9:03 AM
リバースジェネリクスの実装入ったのか
Avatar
実装きてる
9:04 AM
named-opaque-typesって名前になったのかな
9:09 AM
割とまえからあったっぽい
Avatar
Avatar
Yuta Saito
割とまえからあったっぽい
omochimetaru 5/30/2022 4:45 AM
Avatar
なるほど
Avatar
omochimetaru 5/30/2022 4:49 AM
いくつか試して -emit-sil してるけど、ジェネリックシグネチャがおかしくみえるのがある
4:52 AM
struct S {} func makePair() -> <T0> (T0, T0) { (S(), S()) }
4:52 AM
// makePair() sil hidden @$s1i8makePairQr_QrtyF : $@convention(thin) @substituted <τ_0_0, τ_0_1> () -> (@out τ_0_0, @out τ_0_1) for <@_opaqueReturnTypeOf("$s1i8makePairQr_QrtyF", 0) __, @_opaqueReturnTypeOf("$s1i8makePairQr_QrtyF", 0) __> { ... }
4:53 AM
swift demangle '$s1i8makePairQr_QrtyF' $s1i8makePairQr_QrtyF ---> i.makePair() -> (some, some)
4:54 AM
これとかシグネチャレベルだとパラメータが2個あるように見える。
Avatar
ああ、ほんとだ
4:56 AM
sil hidden @$s1i8makePairQr_QrtyF : $@convention(thin) @substituted <τ_0_0> () -> (@out τ_0_0, @out τ_0_0) for <@_opaqueReturnTypeOf("$s1i8makePairQr_QrtyF", 0) __, @_opaqueReturnTypeOf("$s1i8makePairQr_QrtyF", 0) __> { こうなってほしいと
Avatar
omochimetaru 5/30/2022 4:56 AM
そう
Avatar
これ面白いのが、
Avatar
omochimetaru 5/30/2022 4:58 AM
あれ?あってるかもしれない
Avatar
BBの返り値用のargumentの型が*Sになってるんですよね sil hidden @$s1a8makePairQr_QrtyF : $@convention(thin) @substituted <τ_0_0, τ_0_1> () -> (@out τ_0_0, @out τ_0_1) for <@_opaqueReturnTypeOf("$s1a8makePairQr_QrtyF", 0) __, @_opaqueReturnTypeOf("$s1a8makePairQr_QrtyF", 0) __> { // %0 "$return_value" // user: %5 // %1 "$return_value" // user: %9 bb0(%0 : $*S, %1 : $*S): (edited)
Avatar
omochimetaru 5/30/2022 4:58 AM
ああ、そうだよ
4:59 AM
caller側が先に真の型を問い合わせて用意する義務がある (edited)
4:59 AM
public func makePair1() -> <T0> (T0, T0) { (S(), S()) } public func makePair2() -> <T0, T1> (T0, T1) { (S(), S()) } // swiftinterface public func makePair1() -> (T0, T0) public func makePair2() -> (T0, T1)
Avatar
これのせいで、SILFunctionのargumentとbbのargumentが一致しないケースがあるのでmapTypeIntoContextしないといけないんですよね (edited)
Avatar
omochimetaru 5/30/2022 5:00 AM
ほお〜
Avatar
そのmapが必要な理由を調べてて、このオプション見つけた
Avatar
omochimetaru 5/30/2022 5:00 AM
関数の方は普通のopaque typeなのかな、そこでキャスト?できるんだね (edited)
Avatar
そうそう
Avatar
Avatar
omochimetaru
public func makePair1() -> <T0> (T0, T0) { (S(), S()) } public func makePair2() -> <T0, T1> (T0, T1) { (S(), S()) } // swiftinterface public func makePair1() -> (T0, T0) public func makePair2() -> (T0, T1)
omochimetaru 5/30/2022 5:02 AM
↑これはswiftinterfaceは生成ステージが早いだけかもしれんなあ
Avatar
ほう、canonicalizeしたらいい感じになる?
Avatar
omochimetaru 5/30/2022 5:02 AM
このSILのシグネチャのforはスペシャライズでも使う記号だろうか
5:02 AM
最初に貼ったクラッシュするケースは
5:03 AM
(T0, T1) な異なる型のペアを、 (T, T) な同一の型のペアとして渡すコードを書くと
5:03 AM
落ちるってやつなので
5:05 AM
複数のパラメータが並んでる場合を考慮できてないような気もするけど、 -> (some P, some P) とかは動くので謎
Avatar
単純な糖衣構文ではないのかなぁ
Avatar
omochimetaru 5/30/2022 5:07 AM
some P とかは
5:07 AM
シグネチャとしては ジェネリックシグネチャにはなってなくて
5:08 AM
型を書くところに「ここにopaque type」っていうプレースホルダが入ってる感じなんだよね
Avatar
@_opaqueReturnTypeOf ?
Avatar
omochimetaru 5/30/2022 5:08 AM
opaqueReturnTypeOfはシグネチャには含まれない
Avatar
ほう
Avatar
omochimetaru 5/30/2022 5:09 AM
public protocol P {} public struct S: P {} public func makePair() -> (some P, some P) { (S(), S()) }
5:09 AM
// makePair() sil hidden @$s1i8makePairQr_QrtyF : $@convention(thin) @substituted <τ_0_0, τ_0_1> () -> (@out τ_0_0, @out τ_0_1) for <@_opaqueReturnTypeOf("$s1i8makePairQr_QrtyF", 0) __, @_opaqueReturnTypeOf("$s1i8makePairQr_QrtyF", 0) __> {
5:09 AM
$ swift demangle '$s1i8makePairQr_QrtyF' $s1i8makePairQr_QrtyF ---> i.makePair() -> (some, some)
5:11 AM
// .swiftinterface public func makePair() -> (some i.P, some i.P)
5:14 AM
外側(caller)から見ると、 some が2つ返り値にあるから、これに0番、1番って番号が付いていて、
5:16 AM
ちょいまち・・・
5:17 AM
callerは swift_getTypeByMangledNameInContext で問い合わせる
Avatar
Avatar
omochimetaru
// makePair() sil hidden @$s1i8makePairQr_QrtyF : $@convention(thin) @substituted <τ_0_0, τ_0_1> () -> (@out τ_0_0, @out τ_0_1) for <@_opaqueReturnTypeOf("$s1i8makePairQr_QrtyF", 0) __, @_opaqueReturnTypeOf("$s1i8makePairQr_QrtyF", 0) __> {
これはこう? 2個目の返り値の番号が0のままになってた // makePair() sil @$s1b8makePairQr_QR_tyF : $@convention(thin) @substituted <τ_0_0, τ_0_1> () -> (@out τ_0_0, @out τ_0_1) for <@_opaqueReturnTypeOf("$s1b8makePairQr_QR_tyF", 0) __, @_opaqueReturnTypeOf("$s1b8makePairQr_QR_tyF", 1) __>
Avatar
omochimetaru 5/30/2022 5:18 AM
いや、コピペした。0になっている。
5:18 AM
多分実装が (S(), S()) だからだと思う。
Avatar
あれー,
5:19 AM
publicなのにsil hiddenになってるし、多分コピペ対象違いそう
Avatar
omochimetaru 5/30/2022 5:20 AM
public protocol P {} public struct S1: P {} public struct S2: P {} public func makePair() -> (some P, some P) { (S1(), S2()) } // makePair() sil @$s1i8makePairQr_QR_tyF : $@convention(thin) @substituted <τ_0_0, τ_0_1> () -> (@out τ_0_0, @out τ_0_1) for <@_opaqueReturnTypeOf("$s1i8makePairQr_QR_tyF", 0) __, @_opaqueReturnTypeOf("$s1i8makePairQr_QR_tyF", 1) __> { (edited)
Avatar
@swift-main -Xfrontend -emit-sil public protocol P {} public struct S1: P {} public struct S2: P {} public func makePair() -> (some P, some P) { (S1(), S1()) } (edited)
Avatar
Avatar
Yuta Saito
@swift-main -Xfrontend -emit-sil public protocol P {} public struct S1: P {} public struct S2: P {} public func makePair() -> (some P, some P) { (S1(), S1()) } (edited)
swiftNightly BOT 5/30/2022 5:20 AM
sil_stage canonical import Builtin import Swift import SwiftShims public protocol P { } public struct S1 : P { init() } public struct S2 : P { init() } public func makePair() -> (some P, some P) // main sil @main : $@convention(c) (Int32, UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>) -> Int32 { bb0(%0 : $Int32, %1 : $UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>): %2 = integer_literal $Builtin.Int32, 0 // user: %3 %3 = struct $Int32 (%2 : $Builtin.Int32) // user: %4 return %3 : $Int32 // id: %4 } // end sil function 'main' // S1.init() sil hidden @$s4main2S1VACycfC : $@convention(method) (@thin S1.Type) -> S1 { // %0 "$metatype" bb0(%0 : $@thin S1.Type): %1 = alloc_stack [lexical] $S1, var, name "self", implicit // user: %3 %2 = struct $S1 () // user: %4 dealloc_stack %1 : $*S1 // id: %3 return %2 : $S1 // id: %4 } // end sil function '$s4main2S1VACycfC' // makePair() sil @$s4main8makePairQr_QR_tyF : $@convention(thin) @substituted <τ_0_0, τ_0_1> () -> (@out τ_0_0, @out τ_0_1) for <@_opaqueReturnTypeOf("$s4main8makePairQr_QR_tyF", 0) __, @_opaqueReturnTypeOf("$s4main8makePairQr_QR_tyF", 1) __> { // %0 "$return_value" // user: %5 // %1 "$return_value" // user: %9 bb0(%0 : $*S1, %1 : $*S1): %2 = metatype $@thin S1.Type // user: %4 // function_ref S1.init() %3 = function_ref @$s4main2S1VACycfC : $@convention(method) (@thin S1.Type) -> S1 // user: %4 %4 = apply %3(%2) : $@convention(method) (@thin S1.Type) -> S1 // user: %5 store %4 to %0 : $*S1 // id: %5 %6 = metatype $@thin S1.Type // user: %8 // function_ref S1.init() %7 = function_ref @$s4main2S1VACycfC : $@convention(method) (@thin S1.Type) -> S1 // user: %8 %8 = apply %7(%6) : $@convention(m (edited)
Avatar
omochimetaru 5/30/2022 5:21 AM
S1, S2にすれば @_oRTOf(..., 1) になる
5:21 AM
たしかにhiddenついてるのはなんかへんだ public付けてないやつを貼ったかも
Avatar
(some P, some P)両方同じ型っていう情報は外から見えないから、callerは2回問い合わせしないといけなくないですか?
5:27 AM
いや、その辺は関係ないか。
Avatar
omochimetaru 5/30/2022 5:28 AM
それ良い質問で
5:29 AM
swift_getTypeByMangledNameInContext
5:30 AM
返り値全体を問い合わせる事もできるし
5:30 AM
個別のパラメータ部分を問い合わせることもできるんだよね
Avatar
ほう
Avatar
omochimetaru 5/30/2022 5:30 AM
@__swift_instantiateConcreteTypeFromMangledName({ i32, i32 }* @"$s1e8ortTupleQr_QR_tyFQOyQo_MD") @__swift_instantiateConcreteTypeFromMangledName({ i32, i32 }* @"$s1e8ortTupleQr_QR_tyFQOyQo__AaBQr_QR_tyFQOyQo0_tMD") (edited)
5:31 AM
__swift_instantiateConcreteTypeFromMangledNameswift_getTypeByMangledNameInContext をキャッシュ付きにラップするローカル関数なんだけど
5:31 AM
swift demangle '$s1e8ortTupleQr_QR_tyFQOyQo_MD' $s1e8ortTupleQr_QR_tyFQOyQo_MD ---> demangling cache variable for type metadata for <<opaque return type of e.ortTuple() -> (some, some)>>.0
5:31 AM
1つ目は、 opaque return type [0] をピンポイント問い合わせしていて
5:32 AM
2つ目は $s1e8ortTupleQr_QR_tyFQOyQo__AaBQr_QR_tyFQOyQo0_tMD ---> demangling cache variable for type metadata for (<<opaque return type of e.ortTuple() -> (some, some)>>.0, <<opaque return type of e.ortTuple() -> (some, some)>>.1)
5:32 AM
返り値のタプルをまるごと問い合わせてる
Avatar
おお!なるほど
Avatar
omochimetaru 5/30/2022 5:32 AM
これめっちゃわかりづらいけど、 (ort[0], ort[1]) っていうマングリングで
Avatar
タプルの個別要素を取り出す情報がマングリングされてるのか
Avatar
omochimetaru 5/30/2022 5:32 AM
[0] と [1] を組み合わせてタプルを構成して問い合わせてる
Avatar
取り出してタプルを作る方法がエンコードされてる?
5:33 AM
kind=Global kind=TypeMetadataDemanglingCache kind=Type kind=Tuple kind=TupleElement kind=Type kind=OpaqueType kind=OpaqueReturnTypeOf kind=Function kind=Module, text="e" kind=Identifier, text="ortTuple" kind=Type kind=FunctionType kind=ArgumentTuple kind=Type kind=Tuple kind=ReturnType kind=Type kind=Tuple kind=TupleElement kind=Type kind=OpaqueReturnType kind=TupleElement kind=Type kind=OpaqueReturnTypeIndexed, index=0 kind=Index, index=0 kind=TypeList kind=TypeList kind=TupleElement kind=Type kind=OpaqueType kind=OpaqueReturnTypeOf kind=Function kind=Module, text="e" kind=Identifier, text="ortTuple" kind=Type kind=FunctionType kind=ArgumentTuple kind=Type kind=Tuple kind=ReturnType kind=Type kind=Tuple kind=TupleElement kind=Type kind=OpaqueReturnType kind=TupleElement kind=Type kind=OpaqueReturnTypeIndexed, index=0 kind=Index, index=1 kind=TypeList kind=TypeList
Avatar
omochimetaru 5/30/2022 5:33 AM
マングリングされた情報として (ort[0], ort[1]) って式が書いてある
Avatar
理解
Avatar
omochimetaru 5/30/2022 5:34 AM
で、 ort って書くところで
5:34 AM
opaque return type of ( function, index )
5:34 AM
って式の形なんだけど、ここのfunction自体が
5:34 AM
それ自身のシグネチャを含むから
5:34 AM
自己参照的な構造になっててめっちゃ長いシンボルになっている
5:35 AM
(ortOf( foo: returns (some some) , 0 ), ortOf ( foo: returns (some some), 1 ) )
5:35 AM
こんなかんじ
Avatar
なるほど
Avatar
omochimetaru 5/30/2022 5:39 AM
あーだからまあ、Reverse Genericsがシグネチャに乗ってない事自体は問題ないきがしてきた
5:40 AM
-> <T0, T1> (T0, T1) でも -> <T0> (T0, T0) でも
5:40 AM
外から見ると、 -> (some, some) になってて
5:41 AM
ortOf で指定できるindexは 0と1 が対応づいていて
5:41 AM
それとは別にソースレベルの型情報として
5:41 AM
<T0, T1> なのか <T0> なのか、もしくは 2つ目が <T0, T1 where T1 == T0> になるのかはわからんけど、
5:42 AM
返り値のジェネリックシグネチャはソースレベルの型検査で扱えてれば問題ないはず
5:43 AM
ジェネリックパラメータと ortOf のindexの対応関係は、 ソースレベルのシグネチャから、IRレベルのシグネチャを対応させてる関係上、 caller側でもcallee側のコンパイル時と同じようにわかるはずだし。
Avatar
omochimetaru 5/30/2022 8:49 AM
public protocol P<A> { associatedtype A } struct S1<A>: P {} struct S2<A>: P {} public func makeP() -> <T: P, U: P where T.A == U.A> (T, U) { return (S1<Int>(), S2<Int>()) }
8:50 AM
// swift-interface-format-version: 1.0 // swift-compiler-version: Apple Swift version 5.8-dev (LLVM 515f8ef5b9ec986, Swift 7435c936a6a67d0) // swift-module-flags: -target x86_64-apple-macosx12.0 -enable-objc-interop -module-name i import Swift import _Concurrency #if compiler(>=5.3) && $PrimaryAssociatedTypes2 public protocol P<A> { associatedtype A } #else public protocol P { associatedtype A } #endif public func makeP() -> (T, U)
8:50 AM
swiftinterface形式が未対応なのかもしれないけどwhereが消えた。
Avatar
あら
Avatar
omochimetaru 5/30/2022 8:52 AM
ん〜でもなんか見てるな
8:53 AM
↑のコードの reverse genericsのwhereがあればコンパイル通るけど、whereが無いとクラッシュする
8:54 AM
そのあたりが実装中なのかな〜 (edited)
Avatar
じゃあswiftinterfaceが未対応ってことかな
Avatar
omochimetaru 5/30/2022 8:54 AM
swiftinterfaceについてはそうっすね
Avatar
any Sequence って self-conform してるんですっけ? @swift-5.7.3 struct Foo {} protocol Bar { associatedtype Foos: Sequence where Foos.Element == Foo var foos: Foos { get } } struct Baz: Bar { var foos: [Foo] { [Foo()] } } let bar: any Bar = Baz() for foo in bar.foos as any Sequence { print(foo) }
Avatar
Avatar
koher
any Sequence って self-conform してるんですっけ? @swift-5.7.3 struct Foo {} protocol Bar { associatedtype Foos: Sequence where Foos.Element == Foo var foos: Foos { get } } struct Baz: Bar { var foos: [Foo] { [Foo()] } } let bar: any Bar = Baz() for foo in bar.foos as any Sequence { print(foo) }
Foo()
Avatar
omochimetaru 6/10/2022 3:10 AM
してない(記述方法がない)はずだけど・・・ for in できるのか。
Avatar
このコード、手元のXcode14だとエラーになりますね
3:30 AM
🤔 1
Avatar
plainなプロトコルをsomeにするかどうかという議論が最近盛り上がってますね(やるべきなのか、やるとしたらいつどうやるのか) これまで存在型になって問題が起きる可能性があったのでanyが入ったという動機を考えるとそうなるのかなあとは思いましたが、どうなんでしょう? https://forums.swift.org/t/discussion-eliding-some-in-swift-6/57918 (edited)
Swift 5.7 includes a suite of new language features that together enhance the expressivity and usability of any and some types, making abstract code more approachable and easier to internalize. In addition to making a lot of common generic code patterns easier to write by eliding an explicit generic signature completely, Swift 5.7 makes it very...
Avatar
Joe_Groff One potential midpoint we could take is to make some the default in places where some or any doesn't really affect the domain of a function, particularly for non-inout function arguments. With the recent additions to generalize existentials and allow for implicit opening, func foo(_: some P) and func foo(_: any P) both accept the same sets of parameters and have the same sets of capabilities operating on their arguments, but func foo(_: some P) is slightly more efficient as public ABI because it can accept a conforming value as-is without boxing it, and also more flexible by default inside the body of foo, since you can use all of P's methods on it without an opening step. It would make sense to favor the more efficient, more expressive interpretation of func foo(_: P) to mean func foo(_: some P), independent of what we choose to do in places where there's an effective semantic difference.
https://forums.swift.org/t/discussion-eliding-some-in-swift-6/57918/5
1:59 AM
仮に func foo(_: P)func foo(_: some P) にするとして、 func foo(_: [P])func foo(_: [some P]) になるのかな?それはまた違う気が・・・。
Avatar
[P]に異なる型を入れようとした場合コンパイラがエラーにするので、既存のコードを壊すことはないから大丈夫、必要ならanyを付ける、とかなんですかね???
Avatar
func foo(_: [some P])func foo<T: P>(_: [T]))とfunc foo(_: [any P]) は全然シグネチャが違うので変なところで呼び出し優先順位が入れ替わったりしちゃわないかなぁ
👀 1
t_naruhodo 1
Avatar
omochimetaru 6/13/2022 7:22 AM
オーバーロードしてれば、しそう。
Avatar
ちょうど真下のコメントにできないっぽいことが書いてありましたね😅 I also think taking this approach will lead to a confusing model because programmers will need to deeply understand where they can omit some and where they cannot. For example, you'd be able to write a parameter of type P, but not of type [P].
Avatar
This removes some of the bridging code and replaces it with C++ calls. rdar://83361087
Avatar
Avatar
Yuta Saito
clangから来たfixitをswiftcでラップしてる部分?
Avatar
何してるのかはわからないけど、ブリッジ用のC構造体が消せてる
Avatar
あ、これSwiftコードの中からSwiftコンパイラ内部のc++の型を触ってるのか
12:02 PM
cxx interopがあるとコンパイラのSwiftへの段階的書き換えがしやすくなるんだな
Avatar
ふと思ったけど、↓ってちゃんとわかってないとややこしいな。見た目が似てるもの( Int.self\Int.self など)が対応してないから。 Int.self Int.Type.self \Int.self \Int.Type.self
Avatar
Int.self // Int.Type Int.Type.self // Int.Type.Type \Int.self // WritableKeyPath<Int, Int> \Int.Type.self // WritableKeyPath<Int.Type, Int.Type> ややこしい
1:33 AM
前半はselfを付けることでその前のもののTypeになる。 後半はプロパティとかと同じでselfが指すものを対象とするKeyPathになる.
Avatar
↑のコメントの通りだけど、 Int.selfInt.Type のインスタンスだけど、 \Int.selfInt.Type ではなく Int (から Int へ)の KeyPath になり、 Int.TypeKeyPath\Int.Type.self と書かないといけないけど、 Int.Type.selfInt.Type.Type のインスタンスというわかりづらさ。 (edited)
Avatar
@swift-5.6.3 extension Int { static var mySelf: Int.Type = Int.self var mySelf: Int { self } } print(type(of: Int.mySelf)) print(type(of: \Int.mySelf))
Avatar
Avatar
t.ae
@swift-5.6.3 extension Int { static var mySelf: Int.Type = Int.self var mySelf: Int { self } } print(type(of: Int.mySelf)) print(type(of: \Int.mySelf))
Int.Type KeyPath<Int, Int>
Avatar
@swift-5.6.3 print(Int.self[keyPath: \Int.Type.self])
Avatar
Avatar
koher
@swift-5.6.3 print(Int.self[keyPath: \Int.Type.self])
Int
Avatar
@available(*, unavailable) extension ISO8601DateFormatter : @unchecked Sendable { } たまたまこういうの見つけたんですが、これってSendableじゃないことを明示的に定義している?
4:08 AM
手元でさらに extension ISO8601DateFormatter: @unchecked Sendable {} 書いたら上書きできるな。これ書くことにどういう意味があるんだろう
Avatar
そういえばDigital Loungesでこんなやりとりありましたねー Thanks! So writing @available(*, unavailable) extension X: Sendable means that a type is explicitly not thread safe? Yes, exactly. The compiler treats an explicitly unavailable Sendable conformance as a stronger sign that the type is not thread-safe, so it may treat them slightly differently from ones that are simply missing—for instance, it may show warnings it would normally suppress, or phrase them differently, or suggest different Fix-Its. (edited)
Avatar
おお!まさしくこの例ですね。ありがとうございます。
Avatar
omochimetaru 8/2/2022 8:56 AM
へぇ〜 ただついてないのより強調できるんだ・・・
Avatar
omochimetaru 8/5/2022 4:05 PM
Incidentally, it's also my last day as an iOS developer. Soon I'll start working on developer tools at Apple, and it's still hard for me believe this is happening, I never expected I could have this opportunity...
4:05 PM
公式WASMくる?
4:08 PM
I have to step away from contributing to open-source projects I worked on, including @SwiftWasm, @TokamakUI. These are in good hands and have a bright future, I trust @kateinoigakukun @yonihemi @CarsonKatri @jed_fox1 will be amazing at this (you should sponsor their work!)
Avatar
omochimetaru 8/5/2022 4:09 PM
have to step away…
Avatar
Appleっぽい
Avatar
Xcode14 beta 5の環境下でmockoloのv1.7.0がmintからインストールできなくて、色々試しているのですが、mockoloの依存ライブラリのSwiftToolsSupport-autoでこの画像のエラーが出ていることが分かりました。こちらのエラーが実際に問題となっていてMintがmockoloをビルドできないところまで確認したのですが、こちらのエラー(Cannot assign value of type 'Thread' to type 'Thread?')って普通に考えたら起き得ないものだと思っているのですが、ご意見いただきたいです🙏
Avatar
Xcode14Beta5の問題ですね (edited)
11:37 AM
Beta4なら通りますよ
Avatar
出た ワイも踏んだそれ
Avatar
解決方法はとくに考えていなくて、Beta4でビルドしたものを使っています
Avatar
あ、beta 4なら通るのですね😐
Avatar
Avatar
fummicc1
Xcode14 beta 5の環境下でmockoloのv1.7.0がmintからインストールできなくて、色々試しているのですが、mockoloの依存ライブラリのSwiftToolsSupport-autoでこの画像のエラーが出ていることが分かりました。こちらのエラーが実際に問題となっていてMintがmockoloをビルドできないところまで確認したのですが、こちらのエラー(Cannot assign value of type 'Thread' to type 'Thread?')って普通に考えたら起き得ないものだと思っているのですが、ご意見いただきたいです🙏
これ、右のThreadはFoundation.Threadで、左のThread?は、TSCBasic.Thread?なんじゃないかと思ってます。
11:38 AM
それならオプショナル変換できない。
Avatar
本当ですね。最新のSwiftToolsSupport-autoだとちゃんとTSCBasic.Threadになっていました
Avatar
あ、コード側で対応されてもう直ったんですね
Avatar
さっき手元で落としてきたのでそうみたいです
Avatar
じゃあxcodeを下げるかmockoloに依存先更新パッチを投げるかが良さそうですね
11:42 AM
予想が当たって嬉しい
👍 1
11:43 AM
詳細薄いですが、これコードが悪いということなんでしょうかね?
11:43 AM
コンパイラが悪いように思ったけどどうなんだろう
Avatar
コメントが気になるな
Fixes an ambiguity that crops up with Sendable adoption (rdar://97223378).
11:44 AM
Sendableが関係しているのか
Avatar
Avatar
Iceman
コンパイラが悪いように思ったけどどうなんだろう
importしてるどっちのモジュールも同じ名前の型を提供してる時ってどうなるんだっけ。
Avatar
パッケージの名前空間的にはTSCBasic.ThreadFoundation.Thread のどちらも同じ優先度だけど、initの引数にとるクロージャが Sendable かどうかでオーバーロード優先順位がFoundationに寄った?
Avatar
型名の選択はオーバーロードできないイメージがありました
11:47 AM
型名によるinitの呼び出しがあるとき、initの引数によってどっちのモジュールの型を意味するか変わる,という仕組みは存在しないと思っていた
11:47 AM
でもSendableが関係してるとするとそういう話な予感もしますねえ
👀 1
Avatar
ここ見たけどリアクションしていなかった みなさんありがとうございました…! fummicc1 さんに swift-tools-support-core 更新の PR を作成してもらい、マージしてリリースまでしています🚀 ただまだ Xcode 14 では動かないかも? ↓のスレでいろいろ話しているので貼っておきます https://twitter.com/the_uhooi/status/1560796006664765445?s=20&t=YVn3hc8-0COpgqjqIZdJdg
@fummicc1 Mockolo への PR などありがとうございましたー!✨ いくつか確認したいのですが、Mockolo が Mint 経由でビルドエラーになるのは、Mint 側を修正する必要があるのでしょうか? あと Swift 5.7 用の swift-syntax を使うようにすべきですね…(まだリリースされていないですが)
🙏 1
Avatar
@swift-5.6.3 struct S { var _value: Int = 0 var value: Int { get { print("get") return _value } set { print("set") _value = newValue } } } var s = S() s[keyPath: \.value] = 42
Avatar
Avatar
Iceman
@swift-5.6.3 struct S { var _value: Int = 0 var value: Int { get { print("get") return _value } set { print("set") _value = newValue } } } var s = S() s[keyPath: \.value] = 42
get set
Avatar
WritableKeyPath 経由で書き込みするときってgetter呼ばれるんですね
Avatar
呼ばれるのまずい気がする…
10:36 AM
@swift-5.6.3 -O struct S { var _value: Int = 0 var value: Int { get { print("get") return _value } set { print("set") _value = newValue } } } var s = S() s[keyPath: \.value] = 42
Avatar
Avatar
Yuta Saito
@swift-5.6.3 -O struct S { var _value: Int = 0 var value: Int { get { print("get") return _value } set { print("set") _value = newValue } } } var s = S() s[keyPath: \.value] = 42
set
Avatar
静的にプロジェクションする最適化で消えちゃう (edited)
10:37 AM
よくありそうな @LateInit みたいなpropertyWrapperでこれに遭遇してちょっと困ったんですよね
Avatar
LateInitなるほど、たしかに困る (edited)
Avatar
おーなるほど
10:39 AM
setだけするつもりがgetが呼ばれて余計な初期化処理が走りうる
Avatar
set前getが検知されてクラッシュ
Avatar
そうかデフォルト値ない実装だと
10:40 AM
やべー
10:42 AM
s.foo.bar = x みたいなアクセスだと、fooをgetしてbarの位置にx書き込んでfooに書き戻すんですけど
10:42 AM
barに対してもfooと同じ書き戻しの仕組みを使っていて、最初にgetするんですよね
Avatar
あーなるほど そういうふうに正規化(?)されてるのか
10:44 AM
MutatingWritebackBuffer が書き戻す君
10:47 AM
チケット無さそう
Avatar
なるほど。このへんSwiftで書かれてたんですね Issueあげておきます
Avatar
たすかります 🙏
12:22 PM
Server Side Swift冷静に考えるとかなりよくないか??簡単なRustという立ち位置で、採用も苦労しなさそうだし。ぶっちゃけRustは好きなんだが普通のWebアプリにRust採用するの気が引けるんだよな。速度はそこそこでいいからRust風のモダンな書き味が欲しいだけというか。
この意見はとても納得できて、SwiftはRustの代替のポジションに滑り込めると思うんですよね。
12:23 PM
Rustは難しすぎて気持ちよく書けるみたいな体験を得るのはとても時間がかかる。
12:23 PM
まあWebサービスじゃなくてもWasmも同じ状況で代替になりうると思う。
Avatar
簡単だけど堅牢さは劣らない(代わりにパフォーマンスは劣る)という点でアプリケーションにめちゃくちゃ向いてると思うんですよね
Avatar
Kishikawa Katsumi 10/25/2022 12:26 PM
そうですねえ。Rustが難しすぎてのくだりは仕事でRustをメインに書いてる人もそう言ってたので、Rustで気持ちよく書くのは本当に大変なんだと思う。
Avatar
iOSはUIKitとかが型とか関係なくクラッシュしたりして難しい部分あるけど、サーバだとピュアなSwiftロジックだけ書けばいいのでiOSよりも快適ですね
Avatar
あまりに思想が同じで自分のツイートかと思ったわ
Avatar
Kishikawa Katsumi 10/25/2022 12:30 PM
Swift書くにはiOSやmacOS知らん方がいいっていうのはあるな。iOSアプリ作りたい、って人はしょうがないけど。
Avatar
サーバーサイドがAPI提供のため or Webがないの条件下で、採用を度外視すると選択肢でも上位になりますね
12:39 PM
採用とWebの存在はやはり大きいです
Avatar
採用で言うとRustとどっちが多いんだろう、Rustはどこで覚えるんだろう
Avatar
逆にこれからiOS人材の需要が減っていった場合に獲得しやすいはあるかもしれん (edited)
Avatar
iOS市場が縮小して野生のSwiftプログラマーが放出
Avatar
Webは、nextjsがあまりにも強すぎて (edited)
12:42 PM
これと言語を揃えるモチベーションがめっちゃ高いです
12:43 PM
採用文脈だとgolangが普通に強い印象
Avatar
口を揃える文脈ならgRPCとかgqlとかあるけど、単に実装する言語が共通なとこに重き置いてる感じですかね
Avatar
わざわざgRPCやらgql入れる必要無いよなって感覚ですね
12:45 PM
決して悪口ではないが、かなり遠回りをしてるなという印象を受けています
12:45 PM
もちろんリポジトリやチームの構成含め様々な選択の果ての最適ではある、一概に言えるものでは無い (edited)
Avatar
DOMがWasmから触りやすくなってコールバックとか仕込みやすくなれば、色んな言語版のReactができてJSから抜けられるのにな〜
Avatar
Reactが〜というか、SSRがあまりにも強い
Avatar
SSRしやすいのはハイドレーションしやすいからであって、それはJSがDOMを直接触りやすいってとこに落ち着きませんか?
Avatar
それはそうですね
Avatar
単純な成熟度合いがかけ離れてて相当追いつけないとかはあるでしょうけど
Avatar
wasm一般化してSwift版nextjsは夢のある話だけど、まだ夢の話なんだよな (edited)
12:53 PM
現実解はnextjs最強なんだ
Avatar
rustはedgeのwasm用でウェブ屋では流行ってます、edge computingはシステムデザインでデファクト化しそうなので。 (edited)
3:39 PM
kateinoigakukukunさんに期待
Avatar
そういえば、JSの正規表現エンジンライブラリとかのコア部分がRustみたいなケースありますね
Avatar
dom触らないところ、特にedge aiなんかはwasmの方が良いですね
Avatar
Swift Cloud のエンジニアである Andrew Barba 氏は先日、Fastly の Compute@Edge プラットフォーム向けに高いパフォーマンスと豊富な機能を備えた Swift SDK をリリースしました。しかも、わずか4日間で初回リリースを構築したそうです。感銘を受けた私たちは Barba 氏と対談し、彼の目標やプロジェクトの構築プロセスについてお話を伺いました。
👀 2
Avatar
AnyHashable ってハッシュ値の計算においてmetatypeを混ぜ込まないから、同じレイアウトを持つ2つの異なる型がある時、容易にハッシュ衝突が起きるな (edited)
Avatar
あれ、メタタイプでいい感じにバラけるものだとおもってた (edited)
Avatar
Avatar
Yuta Saito
あれ、メタタイプでいい感じにバラけるものだとおもってた (edited)
思うよね!なってなくない・・・?
Avatar
だめじゃん
Avatar
AnyHashableを使いたい状況を想像すると複数のタイプをeraseしてごちゃまぜたいときだろうから
9:12 AM
そうなってるべきだと思うんだよな
Avatar
これなんか私昔踏んだときにObjectIdentifierにMetaType渡す実装作った気がするんだよな〜
Avatar
でもDictionaryで重複してないってことはさすがにAnyHashable.==ではメタタイプの比較してるぼい
Avatar
ただちょっと思うのが、こいつって AnyHashable(1) == AnyHashable(1.0) だから
9:13 AM
内部の真の型について気持ちが弱いのかもしれない
Avatar
あれぇ
9:14 AM
確かSwiftで実装されてないんですよね
Avatar
そうね、AnyHashable用のランタイム関数あるね (edited)
Avatar
Kishikawa Katsumi 11/11/2022 9:15 AM
え、Hashが一緒になるだけじゃなくてEqualも変わっちゃうの?
Avatar
そんなー
Avatar
SとKは違う型としてnot equalですけど、Int(1) と Double(1) は違う型だけどequal扱いなので、Dictionaryのkeyとして共存できないです。 (edited)
Avatar
Kishikawa Katsumi 11/11/2022 9:17 AM
それは難しいな
Avatar
違う型だけどequal扱いは誰が特別扱いしてるんだ?
Avatar
これはObjectiveCの頃の、DictionaryのkeyにIntやDoubleを使おうとすると、NSNumber にラップする必要があって同じ値になった挙動を再現している (edited)
Avatar
Avatar
Yuta Saito
違う型だけどequal扱いは誰が特別扱いしてるんだ?
AnyHashableの== の実装がやってる
9:25 AM
_HasCustomAnyHashableRepresentation っていう裏プロトコルがあって Int とかがこれを使ってるわ
Avatar
はーなるほど
Avatar
internal var _canonicalBox: _AnyHashableBox { // We need to follow NSNumber semantics here; the AnyHashable forms of // integer types holding the same mathematical value should compare equal. // Sign-extend value to a 64-bit integer. This will generate hash conflicts // between, say -1 and UInt.max, but that's fine. if _value < 0 { return _IntegerAnyHashableBox<Int64>(Int64(truncatingIfNeeded: _value)) } return _IntegerAnyHashableBox<UInt64>(UInt64(truncatingIfNeeded: _value)) }
9:27 AM
% if bits != 16: internal struct _${Self}AnyHashableBox: _AnyHashableBox { internal typealias Base = ${Self} internal let _value: Base internal init(_ value: Base) { self._value = value } internal var _canonicalBox: _AnyHashableBox { // Float and Double are bridged with NSNumber, so we have to follow // NSNumber's rules for equality. I.e., we need to make sure equal // numerical values end up in identical boxes after canonicalization, so // that _isEqual will consider them equal and they're hashed the same way. // // Note that these AnyHashable boxes don't currently feed discriminator bits // to the hasher, so we allow repeatable collisions. E.g., -1 will always // collide with UInt64.max. if _value < 0 { if let i = Int64(exactly: _value) { return _IntegerAnyHashableBox(i) } } else { if let i = UInt64(exactly: _value) { return _IntegerAnyHashableBox(i) } } if let d = Double(exactly: _value) { return _DoubleAnyHashableBox(d) } // If a value can't be represented by a Double, keep it in its original // representation so that it won't compare equal to approximations. (So that // we don't round off Float80 values.) return self }
9:27 AM
Floatのほうが Int64(exactly:) つかって _IntegerAnyHashableBox にすり寄っていくらしい
Avatar
おー、ということはInt系は辞書のキーにするとちょっと遅いのかー
Avatar
本物のAnyHashableを自作した方が良いかもね。
Avatar
Objective-Cを忘れたAnyHashable
Avatar
5.7なら_openExistential無しで実装できるんじゃないかな (edited)
Avatar
Kishikawa Katsumi 11/11/2022 9:38 AM
なんでAnyHashableがObjective-Cの都合を気にする必要があるんですか?
Avatar
Avatar
Kishikawa Katsumi
なんでAnyHashableがObjective-Cの都合を気にする必要があるんですか?
objcのNSDicionaryはSwiftからみると[AnyHashable: Any]にブリッジされるからです
Avatar
Kishikawa Katsumi 11/11/2022 9:39 AM
あー、なるほど。
Avatar
NSStringがSwiftではStringに見えてるのと同じで
9:39 AM
ほぼそのための存在なんですよね
Avatar
Kishikawa Katsumi 11/11/2022 9:40 AM
AnyHashableはこちらが便利に使うものじゃないってことか。
Avatar
Avatar
omochimetaru
5.7なら_openExistential無しで実装できるんじゃないかな (edited)
openExistentialどこですか?
Avatar
いや、リファレンスでは、異なる型を辞書に混ぜる時に便利だよ、って書いてある・・・
Avatar
Avatar
Yuta Saito
openExistentialどこですか?
比較するところでT.==を呼ぶためにopenが要ると思う
9:43 AM
継承ボックスで実装したらいらんかもしれん。
Avatar
継承boxっぽい (edited)
Avatar
あーさっき張った既存実装は、そうか。
9:44 AM
シンプルにAnyで保持する自作の実装を考えてた。
Avatar
あー、なるほど
Avatar
その方が間接呼び出しが減って早く出来そうな気がする (edited)
Avatar
型の同一性だけとりだすのでよければExistential開かなくてもtype(of:)でよさそう
Avatar
そのあと==呼ばないと。
9:46 AM
昔本物のAny.==を作っていた
9:47 AM
あー、そうか==の引数に開いた状態のインスタンスが必要かー
Avatar
@swift-5.7.3 func nonThrowing(_ body: @autoclosure () throws -> Void) { try? body() } func rethrowing(_ body: () throws -> Void) rethrows { try body() } func fail() throws { throw NSError(domain: "", code: 0) } func foo() { nonThrowing(try fail()) } func bar() { rethrowing { nonThrowing(try fail()) } }
🙅‍♂️ 1
Avatar
Avatar
ジュニア
@swift-5.7.3 func nonThrowing(_ body: @autoclosure () throws -> Void) { try? body() } func rethrowing(_ body: () throws -> Void) rethrows { try body() } func fail() throws { throw NSError(domain: "", code: 0) } func foo() { nonThrowing(try fail()) } func bar() { rethrowing { nonThrowing(try fail()) } }
exit status: 1 with stderr:<stdin>:8:11: error: cannot find 'NSError' in scope throw NSError(domain: "", code: 0) ^~~~~~~ <stdin>:15:5: error: call can throw, but it is not marked with 'try' and the error is not handled rethrowing { ^ <stdin>:15:16: note: call is to 'rethrows' function, but argument function can throw rethrowing { ^
🙅‍♂️ 1
Avatar
@swift-5.7.3 enum HogeError: Error { case hoge } func nonThrowing(_ body: @autoclosure () throws -> Void) { try? body() } func rethrowing(_ body: () throws -> Void) rethrows { try body() } func fail() throws { throw HogeError.hoge } func foo() { nonThrowing(try fail()) } func bar() { rethrowing { nonThrowing(try fail()) } }
Avatar
Avatar
ジュニア
@swift-5.7.3 enum HogeError: Error { case hoge } func nonThrowing(_ body: @autoclosure () throws -> Void) { try? body() } func rethrowing(_ body: () throws -> Void) rethrows { try body() } func fail() throws { throw HogeError.hoge } func foo() { nonThrowing(try fail()) } func bar() { rethrowing { nonThrowing(try fail()) } }
exit status: 1 with stderr:<stdin>:17:5: error: call can throw, but it is not marked with 'try' and the error is not handled rethrowing { ^ <stdin>:17:16: note: call is to 'rethrows' function, but argument function can throw rethrowing { ^
Avatar
bar での rethrowing 呼び出しに try は不要だと思うんですが、これってコンパイラのバグなんでしょうか? foo は期待通りコンパイル通るんですが…
Avatar
ほんとですね autoclosureに包まれてる事を見逃してそう?
Avatar
ありがとうございます🙇🏻‍♂️ そうなんですよね。↓のようなテストを書いたときに怒られて気になった次第でした。 XCTContext.runActivity(named: "") { _ in // Call can throw, but it is not marked with 'try' and the error is not handled XCTAssert(try foo()) }
Avatar
https://github.com/apple/swift/issues/43104 これかなあ?2016年から報告済みっぽい
Previous ID SR-487 Radar rdar://problem/22394263 Original Reporter russ (JIRA User) Type Bug Environment Apple Swift version 2.1.1 (swiftlang-700.1.101.15 clang-700.1.81) Apple Swift version 3.0-de...
t_naruhodo 1
Avatar
@swift-main protocol P { static func equals(a: Self, b: Self) -> Bool } class C1: P { init() {} static func equals(a: C1, b: C1) -> Bool { true } } class C2: C1 { } func start(_ a: any P, _ b: any P) { open(a, b) } func open<T: P, U: P>(_ t: T, _ u: U) { guard let u = u as? T else { print("no") return } print("ok") _ = T.equals(a: t, b: u) } func check(_ a: C2, b: C1) { _ = C2.equals(a: a, b: b) } start(C1(), C2()) // ok start(C2(), C1()) // no
Avatar
Avatar
omochimetaru
@swift-main protocol P { static func equals(a: Self, b: Self) -> Bool } class C1: P { init() {} static func equals(a: C1, b: C1) -> Bool { true } } class C2: C1 { } func start(_ a: any P, _ b: any P) { open(a, b) } func open<T: P, U: P>(_ t: T, _ u: U) { guard let u = u as? T else { print("no") return } print("ok") _ = T.equals(a: t, b: u) } func check(_ a: C2, b: C1) { _ = C2.equals(a: a, b: b) } start(C1(), C2()) // ok start(C2(), C1()) // no
swiftNightly BOT 11/16/2022 4:26 PM
ok no
Avatar
ちょっとおもしろい事を知った。 any P<T: P> に implicit open されるときの挙動で、 もしインスタンスの型がクラス(C2)で、その P conformanceが親クラス (C1) で行われていた場合、 openする型はそのまま値の型 (C2) になる。
4:28 PM
一見、open の実装は正しいように見えるが、この挙動のおかげで、 tとuにC1とC2を渡すと、tがC1のときは u as? C1 が成功するが、 tがC2のときは u as? C2 は失敗するので実行結果が変わる。
4:29 PM
しかし、 C2 の P 準拠は C1 で行われているので、 C2.equals は 2つの C1 を受け取る関数になっていて、本来は C2 と C1 を渡す事ができる。(check で確認)
4:31 PM
C2P への準拠は、 Self = C1 としての準拠になっていると言えるので、 openする時の TC1 として open されるほうが自然な気もするし、 実際の値のmetatypeがそのまま出てくる今の挙動のほうが自然な気もする。
Avatar
Swift 5.7 の any P を多用してコードを書いているんだけど、 struct S: Equatable { var a: any P } ↑これが通らないのがダルい
2:23 AM
PEquatable でも any PEquatable ではないからなんだけど、
2:23 AM
extension any P: Equatable { ... } が書けるようになってほしい。。
t_wakaru 2
Avatar
Box<T> みたいな型を作って any P じゃなくて Box<any P>S に持たせるようにしたらこれが書けるようになるんですけどね... extension Box: Equatable where T == any P { static func == (lhs: Self, rhs: Self) -> Bool { true // FIXME } }
Avatar
そうですねえ Boxがあると取り回しが面倒になるので、property wrapperでそんな感じにして見かけを誤魔化しています
t_aruaru 1
Avatar
var v: Int? print(v[keyPath: \.?.description]) これかけてちょっとびっくりした
Avatar
最初の .?. が気持ち悪いな
4:09 AM
4:09 AM
省略形じゃないのか・・・?
Avatar
@swift-5.7.3 print(\Int?.?.description) print(\Optional<Int>.?.description)
Avatar
Avatar
Iceman
@swift-5.7.3 print(\Int?.?.description) print(\Optional<Int>.?.description)
exit status: 1 with stderr:<stdin>:2:20: error: '>' is not a postfix unary operator print(\Optional<Int>.?.description) ^ <stdin>:2:21: error: cannot find operator '.?.' in scope print(\Optional<Int>.?.description) ^~~ <stdin>:2:24: error: cannot find 'description' in scope print(\Optional<Int>.?.description) ^~~~~~~~~~~
Avatar
Int? はOKで Optional<Int>はNG
4:13 AM
???
🤔 1
Avatar
@swift-5.7.3 func f(async: Int) { let _: Int = async } func g(throws: Int) { let _: Int = `throws` }
Avatar
Avatar
Iceman
@swift-5.7.3 func f(async: Int) { let _: Int = async } func g(throws: Int) { let _: Int = `throws` }
no output
Avatar
asyncはキーワードじゃないけど、throws はキーワード
Avatar
async は先にメソッド名としても使われてたりしたし、キーワードにはできなかったのか。過去にもキーワードじゃなくなったものとかあったし、 async ができるなら throws もやればできそう。
Avatar
asyncとthrowsは出現ポジションが文法上限定されてて衝突しないからエスケープ不要でも問題無さそうですね
7:25 AM
https://github.com/apple/swift-syntax/blob/main/gyb_syntax_support/AttributeKinds.py ContextualSimpleDeclAttribute('async', 'Async', DeclModifier, OnVar, OnFunc, ABIBreakingToAdd, ABIBreakingToRemove, APIBreakingToAdd, APIBreakingToRemove, code=106), (edited)
7:26 AM
最近は swift-syntax リポジトリの方に定義の親玉があって、
7:27 AM
どのキーワード(?)がどういう場所に出てくるかとか定義されてる この親玉からコンパイラ側の一部のソースコードとかも生成されている
7:31 AM
https://github.com/apple/swift-syntax/blob/main/gyb_syntax_support/Token.py#L261 ExprKeyword('Throws', 'throws', serialization_code=53), (edited)
7:32 AM
asyncは contextual simple decl attributeで、throwsはexpr keywordらしい。
Avatar
@swift-5.7.3 import Foundation var f = DateFormatter() f.dateFormat = "yyyy/MM/dd HH:mm:ss" f.locale = Locale(identifier: "ja") f.calendar = .init(identifier: .gregorian) f.timeZone = TimeZone(abbreviation: "JST")! print(f.date(from: "2022/07/10 12:00:00") ?? "nil") // ok print(f.date(from: "2022-07-10 12:00:00") ?? "nil") // macだとok, Linuxだとng (edited)
Avatar
Avatar
Iceman
@swift-5.7.3 import Foundation var f = DateFormatter() f.dateFormat = "yyyy/MM/dd HH:mm:ss" f.locale = Locale(identifier: "ja") f.calendar = .init(identifier: .gregorian) f.timeZone = TimeZone(abbreviation: "JST")! print(f.date(from: "2022/07/10 12:00:00") ?? "nil") // ok print(f.date(from: "2022-07-10 12:00:00") ?? "nil") // macだとok, Linuxだとng (edited)
2022-07-10 03:00:00 +0000 nil (edited)
Avatar
macのDateFormatter、/- を許してて謎
Avatar
DateFormatterって特殊な y みたいな文字以外はなんでも書けるものだと思ってた(Linuxが変 (edited)
Avatar
なるほど?
10:05 AM
An interactive playground and reference for formatting and parsing dates with DateFormatter using Swift or Objective-C.
10:05 AM
特殊文字を置換させたくない場合は ' ではさむ
Avatar
変換の向きが逆だなぁこのサイトは
Avatar
逆ってどういうことかと思ったら 元の話は String -> Date か
Avatar
AIにSwiftでコードゴルフさせてみました。いきなり完成形にできなかったので、会話しながら少しずつ改良。途中のFoundationについてのやりとりとか興味深かったです。 https://twitter.com/koher/status/1599401015392231424
AIにコードゴルフさせてみた。対話の内容に沿ってコードを短くしていく過程がおもしろい。(1/n)
👀 1
Avatar
SwiftPM の ArgumentParser が古くて困ってたら絶賛対応中だった
10:19 AM
Motivation: Plenty of updates were added to ArgumentParser since 1.0.3. For example, @OptionGroup(_hiddenFromHelp: true) is now @OptionGroup(visibility: .hidden). Also, some of the placeholder help...
10:20 AM
あと思った以上にいろんなところに PR 送らないと上げられないのは辛そう…
Avatar
swift-driverが古いのが辛い
t_desune 1
Avatar
omochimetaru 12/9/2022 1:38 PM
これ読んでるけどおもしろいな👀 “UCDetector:ユーザ空間で実装したSwift言語用の循環参照検知器” https://t.co/DYZjko524i
1:40 PM
リフレクションなどを使ってメモリ上のオブジェクトをトレースして、 mark-sweepで正確なリーク検出をするライブラリの実装の論文だそうです
Avatar
Kishikawa Katsumi 12/9/2022 1:41 PM
検証に使ったアプリ、のところでCotEditor出てくる。
1:45 PM
CotEditor、優秀
Avatar
HeapObject.h も C++で記述されている.このため, そのままでは Objective-C コードではインクルード できないが,調査の結果,現在の Swift 言語処理系の 実装では,#define __swift__ することでインクルー ドが可能になることが判明した.
Objective-CからランタイムのC++ヘッダincludeするためにC Interop時に定義されるマクロ定義を手動で定義してるw
2:02 PM
めちゃくちゃSwift自体のコードを読み込んでいてすごいなぁ…
Avatar
omochimetaru 12/9/2022 2:04 PM
ObjectiveC++からincludeするんじゃだめなのか?
Avatar
というかObjective-Cで書く必要は。。
2:05 PM
普通にC++で書いてもよさそう
2:07 PM
https://github.com/tarunon/XCTAssertNoLeak ↑これ検討してほしかった。
Provides assert function that check memory leak in Swift. - GitHub - tarunon/XCTAssertNoLeak: Provides assert function that check memory leak in Swift.
2:07 PM
あと Xcode の Debug Memory Graph って、 Instruments の Leaks と性能同じなんだっけ?
Avatar
Debug Memory Graphはデフォルトだと保守的な検出しかしなかった気がする
2:09 PM
Mallocフックするモードが確かあって、それだともうちょい精度が良かったはず
Avatar
omochimetaru 12/9/2022 2:09 PM
モードとかがあるのか。
2:09 PM
iOSアプリ開発において一般的に使用される既存のソリューション、っていうとLeaksの方だと思うんだけどLeaksに言及が無いのが気になった。 (edited)
😇 1
2:12 PM
leaksコマンドというのがあるのかー
2:14 PM
機能的には全部 libgmalloc が基盤にあって、それが環境変数でコントロールできるようになっていて、
2:15 PM
leaks コマンドがそのフロントエンドになっていて、 XcodeのやつもLeaksも本質的には同じポテンシャルがあるって感じか?
Avatar
そういう話に見えますねぇ
Avatar
omochimetaru 12/9/2022 2:16 PM
なるほど
2:17 PM
そうするとこの辺の言及はちょっと怪しい気がするな。
Avatar
MallocStackLogging.framework以外はだいたい https://github.com/apple-oss-distributions にありそうな気配
Avatar
Swiftのコード生成をするためのライブラリ CodegenKit を作った。 https://github.com/omochi/CodegenKit 画像1枚目のように @codegen@end のプレースホルダマーカーをソースコードに書いておいて、 画像2枚目のようなレンダラーを書いておくと、 (その他いろいろなセットアップを経て) $ swift package codegen で、プレースホルダ内に生成コードが挿入される。 swift-format を組み込んであって、インデントとか綺麗になる。
Avatar
Kishikawa Katsumi 12/17/2022 8:53 AM
template["as"] = asCast(...) のところが // @codegen(as) // @end のところに差し込まれて、最終結果が一枚めってことですね。だいぶ高度な高度生成ができそう。 (edited)
👌 1
8:55 AM
.pascalとかなんか便利そうなプロパティがあるのもおもしろい。プレースホルダがあるからややこしいロジックがあるコード生成以外の固定のところは普通にテキストで書けるのも使い勝手のバランスがいいのかな。
Avatar
そうですね。テンプレート言語とかだとXcodeが認識してくれないのが面倒だったりするので、.swiftの中にプレースホルダを当てるだけにしている。 テンプレート言語でのループとか分岐みたいな制御とかはいらなくて、それはレンダラー側のフルのSwiftで好きにロジックを書いたら良いというコンセプト。 (edited)
9:00 AM
https://github.com/omochi/TypeScriptAST/blob/main/Sources/codegen/Codegen.swift ↓ユーザー側のmain。CodegenRunnerがライブラリの提供してる型。 (edited)
Contribute to omochi/TypeScriptAST development by creating an account on GitHub.
Avatar
Kishikawa Katsumi 12/17/2022 9:00 AM
そうですね。テンプレート言語でいろいろやるよりはここからここまで生成する、で生成コードはSwiftコードで自由に書く、っていうこの方法は使いやすいと思います。
🙂 1
Avatar
CodegenKitに、一発でユーザーのプロジェクトにcodegenを導入するコマンドを実装しました。 画像1: $ swift package init してから、手動で、CodegenKitを依存に追加する 画像2: $ swift package codegen-kit init を実行する 画像3: その結果、自動で codegen がセットアップされる 画像4: $ swift package codegen でコード生成を実行する 対象のパッケージはswift package initした状態ではない途中からでも codegen-kit init できる。 SwiftPM の command plugin は、product として公開しておくと、ルートのプロジェクトから、依存先のcommandが呼び出せるので、自分自身をセットアップするコマンドを出荷することができる・・・ codegenのセットアップにおいては、プロジェクトの Package.swift をswift-syntaxで解析して編集してる。 (edited)
Avatar
自分自身をセットアップなるほど、そういうこともできるか
1:20 PM
Pluginの設定とかめんどくさいからいいですね
Avatar
そうなんですよ。 > pluginめんどくさい (edited)
Avatar
値型のプロパティを一部書き換えたコピーを頻繁に作りたいときに extension Value { func with<Value>( _ kp: WritableKeyPath<Self, Value>, _ newValue: Value ) -> Self { var copy = self copy[keyPath: kp] = newValue return copy } } を用意すると let copy = value .with(\.name, "John") .with(\.address.countryName, "Japan") みたいにできて便利で、 SwiftSyntax はプロパティ毎の withXXX(_:) APIを全部捨ててこの汎用with(_:_:)に置き変えますよっていう。 https://github.com/apple/swift-syntax/pull/1253 (edited)
Instead, provide a single with function that takes a key path of the child you want to replace. This significatnly reduces the amout of code that is being generated for SwiftSyntax. While at it, al...
Avatar
omochimetaru 1/26/2023 6:05 AM
Swiftの値型ってこういうケースで var copy = value copy.name = "john" copy.address.countryName = "Japan" って書けるのが良いところの一つだと思うんですけど レシーバ何度も書くのは良くないので、 value.modified { $0.name = "john" $0.address.countryName = "Japan" } って僕は書いてますね
6:06 AM
withFooはこのmodifiedのストリクトな版と言えそうと思ってて
6:06 AM
with(keypath)にできるのはなるほどと思った
6:07 AM
後者ならライブラリとしてコード量が増えないで済むメリットがあるのかな
Avatar
func modified(_ body: (inout Self) -> Void) -> Self ってことですよね?
🙆‍♂️ 1
6:08 AM
inout渡した方がコピーが一回で済むのは確かに有利ですね。
Avatar
omochimetaru 1/26/2023 6:09 AM
あーそこの挙動も違いが出るか
Avatar
variadic generics が出てきたら value.with([ \.name: "John", \.address.countryName: "Japan", ]) 出来るようになるかな。
Avatar
Avatar
rintaro
variadic generics が出てきたら value.with([ \.name: "John", \.address.countryName: "Japan", ]) 出来るようになるかな。
omochimetaru 1/26/2023 6:10 AM
キーと値のペアそれぞれに別の型がついたdictionary?
Avatar
Avatar
omochimetaru
キーと値のペアそれぞれに別の型がついたdictionary?
ですね Dictionary ではなく dictionary literal に準拠した何かを作る必要はありそうだけど。
Avatar
omochimetaru 1/26/2023 6:13 AM
めっちゃマッチョな型だ、、 他にも応用が出てきそう
6:16 AM
kotlinのdata classはデフォルトでそんな感じのメソッド生えますね
Avatar
data classのそれは同じこと思いましたけど、address.countryNameの変更に当たるコピーが更に必要ですね。
Avatar
omochimetaru 1/26/2023 6:18 AM
そうですね。KeyPathを使って孫プロパティも変えられるのは結構すごいかも。
Avatar
ほほー。ちょっとずれますが、swiftでこれ (copy) 生やすときに、やっぱ Optionalな値はダブルオプショナルでデフォルト引数 nil にするのが一番よいんでしょうか?
6:21 AM
そうすると、値をnilに変えたコピーを作りたいときに .some(nil) を渡さないといけないので、つらいなと思っています。
Avatar
Dictionaryが土台なら、キーの有無で見分けられる?
Avatar
omochimetaru 1/26/2023 6:22 AM
オプショナル値を変更しない事を表現するためにダブルオプショナルになるやつだ
Avatar
Dictionaryが土台なら、キーの有無で見分けられる?
たしかに、けどやっぱ variadic generics 必要そう
Avatar
Avatar
rintaro
ほほー。ちょっとずれますが、swiftでこれ (copy) 生やすときに、やっぱ Optionalな値はダブルオプショナルでデフォルト引数 nil にするのが一番よいんでしょうか?
omochimetaru 1/26/2023 6:23 AM
関数引数に並べてやるならそれしかないような気がする
☹️ 1
6:24 AM
一番外側だけ専用のenum型にして case update(T); case skip とかすると多少わかりやすいかなあ?
Avatar
そう、enum も考えたんですがやっぱ透過的にやりたいよねぇってことで、 Swift も暗黙変換をユーザー定義できたらいいなーとか、邪悪なことを考えてしまった。 (edited)
🧙 1
Avatar
Observable って protocol でも使えるようになるのかな? protocol Foo: Observable { var value: Int { get } } みたいな。今って @Publishedprotocol に書けなくて不便だけど、↑ができたら解決される?
Avatar
Avatar
koher
いつの間にか Partial Task は Job という名前に変わってたのか・・・。 https://github.com/apple/swift-evolution/commit/2b1373654b97373a49efcbb210b1a0ac0b05cd5a
omochimetaru 2/19/2023 3:52 AM
3:53 AM
partial taskの概念は変わってなくて
3:53 AM
ただしAPIとしてはもうちょっと抽象化しておくためにJobを当てる
3:53 AM
って書いてありましたよ
3:54 AM
いやでも304に出てくる言葉を全部直したのか
3:54 AM
じゃあ更に名前ごと変えようってなったのか?
3:56 AM
The name "job" was selected because we do not want to constrain this API to just "partial tasks", or tie them too closely to tasks, even though the most common type of job created by Swift concurrency are "partial tasks".
3:56 AM
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swift-evolution/nnnn-custom-actor-executors.md at wip-custom-executors · ktoso/swift-evolution
Avatar
omochimetaru 2/19/2023 4:31 AM
もし名称変更なら↑の記述も更新されそうですね
Avatar
プログラム書いて対戦するゲーム教えてもらったんですが、↓と書いてあって、 Swift Wasm が使われてそう!
Other languages are supported via WebAssembly: C/C++, Rust, TypeScript, Go, C#, F#, Kotlin, Swift, D, Pascal, Zig, the list is growing.
https://store.steampowered.com/app/1137320/Screeps_Arena/
Screeps: Arena is an online RTS PvP-only game. Your script fights other players' script autonomously in a match-based arena environment.Features:All aspects of an RTS game: gathering resources, base building, creating and upgrading units.You don't control your units directly, you play by writing full-fledged JavaScript that runs on game servers....
Price
$19.99
😲 6
Avatar
@swift-5.8.1 struct Foo: ExpressibleByArrayLiteral { var values: [Int] init(_ values: [Int]) { self.values = values } init(arrayLiteral elements: Int...) { self.init(elements) } } print(Foo())
Avatar
Avatar
koher
@swift-5.8.1 struct Foo: ExpressibleByArrayLiteral { var values: [Int] init(_ values: [Int]) { self.values = values } init(arrayLiteral elements: Int...) { self.init(elements) } } print(Foo())
Foo(values: [])
Avatar
可変長引数、↑こんなことになるの知らなかった。
Avatar
配列になりますね
Avatar
Avatar
omochimetaru
配列になりますね
そうじゃなくて、呼び出し側が Foo() で書ける話です。わかりにくかった💦
Avatar
omochimetaru 4/21/2023 1:13 AM
あれ?たしかに。0個のときは arrayLiteral: のラベル消せるのか
Avatar
そう、ラベルごと消えちゃうんよね。まあ他に方法はないだろうけど・・・。意識したことなかったから、意図せず衝突するケースがありそう。
Avatar
これまで考えたことなかったけど、 any 必須化されたら、 Result<Int, any Error> とか PassthroughSubject<Int, any Error> とか書かないといけなくなるの?
Avatar
AnyError は例外じゃないですか?
Avatar
Anyany Any と書かずに Any と書ける特別対応がある、 AnyObject も同様。
10:53 AM
一方、型パラメータの any Error は必須じゃないかな?
Avatar
Error についての議論は見たことなかった気がするなと。
Avatar
-enable-upcoming-feature ExistentialAny を入れてもError単体で怒られなかったので特別扱いされてそうですね。
Avatar
なんと・・・
Avatar
自分は気づかずにany Errorって書いてましたが…
Avatar
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swift-evolution/0335-existential-any.md at main · apple/swift-evolution
11:16 AM
Error を特別扱いするって書いてないような・・・
t_tashikani 1
Avatar
Miwa / Ensan 4/27/2023 1:14 PM
https://discord.com/channels/291054398077927425/430242233468452865/1101133802195124316 Errorで反応しないのはバグだと思います Swift 5.8だとStandard Library(?)のプロトコルは-enable-upcoming-feature ExistentialAnyを素通りしてくる https://github.com/apple/swift/issues/65034
Description Enabling upcoming feature ExistentialAny does not work for standard library protocols. For example, it should produce a compile error, considering Decoder is a bare protocol. However, t...
😿 2
Avatar
Avatar
Miwa / Ensan
https://discord.com/channels/291054398077927425/430242233468452865/1101133802195124316 Errorで反応しないのはバグだと思います Swift 5.8だとStandard Library(?)のプロトコルは-enable-upcoming-feature ExistentialAnyを素通りしてくる https://github.com/apple/swift/issues/65034
omochimetaru 4/27/2023 1:16 PM
おお、報告してたんですね素晴らしい もう修正済みみたいですね https://discord.com/channels/291054398077927425/430242233468452865/1101134622450012160
Avatar
Miwa / Ensan 4/27/2023 1:17 PM
なのでおそらくSwift 5.9かSwift 5.8.1かのタイミングでもう一回any P修正祭りになる😇 (edited)
Avatar
omochimetaru 4/27/2023 1:17 PM
@koher ResultのErrorもany Error必須になってました。 https://discord.com/channels/291054398077927425/430242233468452865/1101135014952972318
👌 1
Avatar
Avatar
Miwa / Ensan
なのでおそらくSwift 5.9かSwift 5.8.1かのタイミングでもう一回any P修正祭りになる😇 (edited)
omochimetaru 4/27/2023 1:18 PM
あ、そうか、いったんオプションつけてマイグレーションした人たちは、第二回戦が来るのかw
😇 4
Avatar
Miwa / Ensan 4/27/2023 1:20 PM
自己適合をextension any P: Pって書くのがSE-0335のFuture Directionになってるので、その意味でもany Errorがおそらく望まれてる表記で正しいですね (edited)
Avatar
Avatar
Miwa / Ensan
自己適合をextension any P: Pって書くのがSE-0335のFuture Directionになってるので、その意味でもany Errorがおそらく望まれてる表記で正しいですね (edited)
ただ、 Error は暗黙の self conformance があるので、 ErrorAny とかと同じく特別表記もありだったとは思うんですよね。
Avatar
omochimetaru 4/28/2023 3:38 AM
将来的な方向性としてself conformanceをユーザー側で書けるようしようとしているので
3:39 AM
その際に、ユーザーにとってわかりやすいように、 Error の特別扱いをやめて 標準ライブラリ内で self conformance を宣言している形に修正するべきだと思うんですよね
3:39 AM
そこで「self conformanceがあるからanyを省ける」とすると、ユーザー定義のプロトコルに対しても、 self conformanceをつけたらanyが省けるようになる、という仕様になって、これはわかりにくいのと (edited)
3:40 AM
生のプロトコル名を some の省略に入れ替える将来的なプランもあるので、
3:41 AM
「生のプロトコル名がanyになる場合」を残すとわかりづらくなってしまうと思う。
Avatar
Avatar
omochimetaru
そこで「self conformanceがあるからanyを省ける」とすると、ユーザー定義のプロトコルに対しても、 self conformanceをつけたらanyが省けるようになる、という仕様になって、これはわかりにくいのと (edited)
そういう意味ではなく、 self conformance は extension any P: P で書くべきだけど、 Error についてはそれを書く場面がなく、 Swift の中で例外的に existential として用いられる場面が多いので、 Any と同じく any 不要でもいいかなと。
3:43 AM
CheckedContinuation<Foo, Error> とか、 ErrorNever かの二択だし。
Avatar
Errorの特別扱いはObjC世界から見たらNSErrorっていうのもあって、Self Conformanceが一般化したとしても、ニュアンスが異なるかもしれない
Avatar
omochimetaru 4/28/2023 3:43 AM
func foo(p: P) = foo(p: some P) = foo<T: P>(p: T) // 将来↑の仕様が入った時点で func foo(error: Error) = foo(error: any Error) // ↑この特別ルールが残るのは混乱を招きません? (edited)
Avatar
Avatar
koher
そういう意味ではなく、 self conformance は extension any P: P で書くべきだけど、 Error についてはそれを書く場面がなく、 Swift の中で例外的に existential として用いられる場面が多いので、 Any と同じく any 不要でもいいかなと。
omochimetaru 4/28/2023 3:44 AM
Error についてはそれを書く場面がなく
↑これは、ユーザーもself conformanceが記述可能になったら、ヘッダーに飛んだら標準ライブラリの中にこれが書いてあるかのように表示されるようになると思う。
(edited)
Avatar
Any は?
Avatar
omochimetaru 4/28/2023 3:47 AM
Any は名前に Any が入っているので any 省略に見える」という説明になっていました。
Avatar
そうじゃなくて、「ヘッダーに飛んだら標準ライブラリの中にこれが書いてあるかのように表示される」の場合、 Any の self conformance はヘッダーでどう記述されるの? (edited)
Avatar
omochimetaru 4/28/2023 3:49 AM
Any は空のプロトコルで、型制約部分に書けないから、existentialに名前が付いてる特別なもの、という気持ちはわからなくもないです。 しかし AnyObjectAnyActor は制約としても使えるので結構怪しい
3:51 AM
そのへんのやつらはヘッダー飛んだ時の見え方がそもそも特殊で
3:51 AM
AnyObjectとか左辺しかないaliasになっている
3:51 AM
Any は飛ぶことすらできない・・・
3:52 AM
あ、 public typealias AnyObject = Builtin.AnyObject
3:52 AM
Builtinが不可視になってるらしい
3:53 AM
Any って標準ライブラリに存在してないのかも
Avatar
うーん、 Error は飛べるけど、 Error のプロトコル宣言になにか意味があるわけじゃないし、 ErrorAnyXxx 系と同じく特別扱いでも不思議じゃないと思うんよね。
Avatar
omochimetaru 4/28/2023 3:54 AM
Error のプロトコル宣言はちゃんと意味があると思いますよ
3:54 AM
public protocol Error : Sendable { } 今だとSendableが付いてるけど、 ユーザー側でextensionを追加する事もできます
3:55 AM
ジェネリックパラメータ型の制約にも使えるし、完全に普通のプロトコルです
3:55 AM
対するAnyはextensionも書けないし制約にも使えません。
Avatar
any 導入の目的の一つは、不必要に Existential が利用されることが抑制されることだけど、 Error は Existential として利用することが当たり前なので微妙な気がする。将来的に typed throws が導入されるなら any Error でもいいかもしれない。
Avatar
Avatar
omochimetaru
対するAnyはextensionも書けないし制約にも使えません。
AnyObjectextension は無理か。なるほど?
Avatar
omochimetaru 4/28/2023 3:56 AM
暗黙のself conformanceについても、 Errorだけではなく、 「@objc protocol かつ staticメンバがない場合」ユーザー定義プロトコルに対しても発動するので
3:57 AM
「self conformanceがユーザーが書けない」のが変なだけで、 self coformanceを持つことがprotocolとしてことさら特別な意味をもつわけでもないと思います
Avatar
Avatar
koher
AnyObjectextension は無理か。なるほど?
omochimetaru 4/28/2023 3:58 AM
Any はプロトコルとしては空のプロトコルって扱いなんですよね なのでプロトコル部分を持たない
t_naruhodo 1
3:59 AM
今って typealias X = P & Q って合成プロトコルが書けるけど これを昔は typealias X = protocol<P, Q> って記法だった時代があって で、そのころの Anytypealias Any = protocol<> だったんですよね。 空の合成プロトコルなのでプロトコル部分がないというニュアンスが読み取れると思います。 (edited)
Avatar
「self coformanceを持つことがprotocolとしてことさら特別な意味をもつ」というニュアンスではなくて、 Error を特別扱いするのは現実的なユースケースを考えるとあり得ると思っていて、 self conformance の記述問題も起きないって話の順序で考えています。
Avatar
omochimetaru 4/28/2023 4:03 AM
うーん。any の導入はそもそも、 P<: P> が同じ見た目なのに意味が違うのがわかりづらい、 それによってユーザーがSwiftを理解するのを困難にしている、という課題から始まった話なので
4:04 AM
Result<Int, Error> ←これこそまさに、 Errorのself coformanceがあるせいで、余計に何が起きてるかわかりづらい一例なので
4:04 AM
Result<Int, any Error> と書かなければならないようにすることで、
4:04 AM
ユーザーが existential型 と protocol制約の2つがあることを理解する助けになって良いのではないだろうか
4:05 AM
むしろResultとセットでよく見かけるErrorにこのルールが適用されないと、 さらなる混乱を生みそう。 (edited)
Avatar
うーん、僕はSwiftを書くときにできるだけ Existential を使わないけど、 Error だけは避けようがなくて、その原因は untyped throws に結びついてるんですよね。 Result はともかく、 CheckedContinuationErrorNever かの二択になっていて、 throws に型を付けられないから避けようがない。言語の都合で Existential 使ってるのに any を書かされるということに釈然としない気持ちがあります・・・。他のケースは、 Existential を使うことに罪悪感を感じるべきで、そのペナルティとして any を書かされるのは納得なんですが。 (補足: Existential を使うなという意味ではなく、ちゃんと罪悪感を感じた上で選択すべきだと思ってます。) (edited)
Avatar
omochimetaru 4/28/2023 4:10 AM
その原因は untyped throws に結びついてる
そうですね。throws が意味するのは any Error を投げるって意味ですね。 なるほど。 「existentialは非推奨だから any を書く手間が増えるのはマッチしている」という解釈のもとで、 「言語都合でexistentialを使わされるケースで手間が増えるのは嫌だ」は筋が通った意見だと思いました
4:11 AM
たしかに、 「裸プロトコル名を some に省略にする」プランも、「anyよりsomeを使うのを推奨するべきだから望ましいものを簡単に書ける方にしよう」という話を含んでいるので
4:11 AM
any を書くのが一手めんどくさい」のは意図的なペナルティと言えそう。
4:12 AM
でもその方向で意見をすすめるなら、typed throwsを導入すれば全部キレイに解決しませんかね?
Avatar
はい、解決します。
4:12 AM
将来的に typed throws の可能性を残すのであれば any Error じゃないといけないので、そう思って納得することにします。
Avatar
omochimetaru 4/28/2023 4:12 AM
「typed throwsがあるならany Errorを使う必要がないし、untypedなthrowsにはanyを書くペナルティが乗る」 という世界観だとkoherさんの意見にマッチしてそう。
Avatar
typed throws が導入されたら、 untyped throws を使うときに罪悪感を感じるべきなので。
Avatar
omochimetaru 4/28/2023 4:13 AM
そうですよね。
4:13 AM
将来計画としてはあんまりその方向性はコアチームは明確に打ち出してないけど・・・ (edited)
4:14 AM
「typed throwsがない未完成であるゆえのペインが生じている」って納得することはできそう・・・
Avatar
typed throws が導入されても、(ライブラリでなく)アプリで untyped throws 使うのは全然ありだと思いますけどね。ただ、その場合でも existential であることは意識すべきで、その意味での any Error というのはマッチすると思います。
Avatar
omochimetaru 4/28/2023 4:14 AM
ResultもCheckedContinuationも、一応 typed throwsの可能性を見てるから型パラメータ <Error> を採用してるという側面はありますね。
😻 1
Avatar
なるほど。
Avatar
omochimetaru 4/28/2023 4:15 AM
どっちのときもなんかフォーラムでややこしい議論になっちゃってました。
Avatar
デフォルト型パラが導入されて、 enum Result<Success, Failure = any Error> だとちょうどいいのかも。
Avatar
omochimetaru 4/28/2023 4:17 AM
ちなみに聞いてみたいんですけど
4:17 AM
typealias AnyError = any Error ↑これだったら AnyError の利用にペナルティは感じます?
4:17 AM
一文字目から補完が効くので、1文字しか減ってないけど、結構入力時の体感は楽になると思うんですよね。 (edited)
Avatar
self conformance が導入されたら AnyP 系は撲滅したいですね・・・
Avatar
omochimetaru 4/28/2023 4:18 AM
ああ〜・・・
4:18 AM
それはたしかに。。
4:19 AM
書いてて思ったけど anya まで打ったら、ny Error 補完候補に出してほしいな。
4:19 AM
any E まで行かないと補完が効かないのが今だるい
Avatar
そもそも Xcode の補完壊れてることが多いのであまり気にならない😇
t_wakaru 1
Avatar
omochimetaru 4/28/2023 4:20 AM
補完無関係派w (edited)
Avatar
UUID ってなんで DataProtocol に準拠してないんだろう?
Avatar
omochimetaru 4/28/2023 8:07 AM
準拠してても良さそうではあるな 数値的なものと捉えるかバイト列的なものと捉えるかだと思うけど
8:08 AM
規格上バイト数は確定してるけどバイト表現はどうなんでしょうね エンディアンとか
Avatar
↓があるので、これに対応したバイト列とみなして良さそう。 https://developer.apple.com/documentation/foundation/uuid/1779678-uuid (edited)
Avatar
omochimetaru 4/28/2023 8:12 AM
ほんとだ。バイト列のコンセプトですね。
8:12 AM
I’m pleased to announce that a preview of the future of Foundation is now available on GitHub!
8:13 AM
swift-foundationならそういう細かいの相談できそう
As a secondary goal, the project requests community proposals to add new APIs with focused scope to round out existing API functionality in Foundation.
Avatar
この提案はもう受け付けてるんだろうか?
Avatar
omochimetaru 4/28/2023 8:17 AM
Inspired by the workgroups in the Swift project, it will have a workgroup to (a) oversee community API proposals and (b) to closely coordinate with developments in the Swift project and those on Apple’s platforms.
8:17 AM
って書いてあるから、swift-foundation workgroup をこれから作ってそこで話すんだと思う
Avatar
高円寺Style 5/2/2023 12:37 PM
Avatar
Kishikawa Katsumi 5/16/2023 11:23 PM
Power Assertがだいぶいい感じに開発されてきたからPlayground作った。 https://power-assert.swiftfiddle.com/
Explore and test the Swift Power Assert library in real-time, an interactive online playground
👀 3
11:23 PM
次はXcodeのリファクタリングプラグインを作りたい。
Avatar
Kishikawa Katsumi 5/16/2023 11:31 PM
今回はKoyebっていうところにDeployした。ここもRenderなどと同様にDocker Imageをそのままデプロイできる。 https://www.koyeb.com/
Koyeb is a developer-friendly serverless platform to deploy apps globally. No-ops, servers, and infrastructure management.
Avatar
BotをHerokuから移行する際、Koyebはdeploy時にクレジットカード登録が必要だったので、登録不要だったRenderにした。
Avatar
Kishikawa Katsumi 5/17/2023 12:02 AM
最近はクレジットカードはまあスパムBotとかを弾くために認証として必要でしょうからねえ。
12:02 AM
なんやかんやでRenderが一番簡単かつ高機能ですよね。
Avatar
Renderが無ければ、クレジットカード登録してKoyebを使ってたと思う。
12:10 AM
ユーザー登録自体はクレジットカード不要だったけど、スパムBot避けになってるのかな?
Avatar
Kishikawa Katsumi 5/17/2023 12:28 AM
クレジットカード登録がないと先に進めないと思うのでたぶんアカウントの量産とかが防げてるんじゃないかなあ。
Avatar
https://twitter.com/aheze0/status/1663458829974241283?s=61&t=ABsyk3MBNtZ6Zpk8vMBS9Q こういうクラス名の難読化ってmacro使うとソースコードに難読化前の文字列として書いておけたりするのかしら
Made a one-file, App-Store safe version of this beautiful blur effect: https://t.co/9noMc7fCyC Thanks for the great work Janum!
Avatar
できそう
🥳 1
Avatar
base64にしてprivateクラス使ってるの草生える
Avatar
Kishikawa Katsumi 5/30/2023 12:10 PM
マクロでobscuratorはユースケースとして議論に上がってた気がする。
Avatar
ミュートスイッチの状態とるのにプライベートなのが必要で適当に文字列分割で実装したらコンパイラに最適化されてリジェクトされた記憶がある。今はビルド後のバイナリをチェックするようなステップを入れてる。
Avatar
プライベートAPIの利用検出ってバイナリ中のテキスト検索とかでやってるんすかねえ
11:19 PM
審査用の実行環境で、プライベートAPI(この例ならクラスのinit)の突入点でスタックトレース一個掘って、ユーザーバイナリから入ってきてるか調べるみたいな、より直接的な方法もできると思う
Avatar
UIView のリファレンス https://developer.apple.com/documentation/uikit/uiview の Conforms To に EquatableHashable がないんだけど( NSObject https://developer.apple.com/documentation/objectivec/nsobject にはある)、これって単にドキュメント上で漏れてるだけ? Equatable に準拠したクラスのサブクラスの Equatable 準拠ってどうなるんだったっけ( ==Self がサブクラスを指さずにスーパークラスを指して UIVeiw にとっての Euatable 準拠になってない?)と思ったけど、↓はできたからサブクラスにとっての Equatable 準拠でいいのかな。 @swift-5.8.1 import Foundation struct Foo<T: Equatable> { func bar(_ x: T, _ y: T) -> Bool { return x == y } } class UIView: NSObject { } let foo: Foo<UIView> = .init() // これが通るので UIView は Equatable 準拠 let a: UIView = .init() let b: UIView = .init() print(a == a) print(a == b)
Avatar
Avatar
koher
UIView のリファレンス https://developer.apple.com/documentation/uikit/uiview の Conforms To に EquatableHashable がないんだけど( NSObject https://developer.apple.com/documentation/objectivec/nsobject にはある)、これって単にドキュメント上で漏れてるだけ? Equatable に準拠したクラスのサブクラスの Equatable 準拠ってどうなるんだったっけ( ==Self がサブクラスを指さずにスーパークラスを指して UIVeiw にとっての Euatable 準拠になってない?)と思ったけど、↓はできたからサブクラスにとっての Equatable 準拠でいいのかな。 @swift-5.8.1 import Foundation struct Foo<T: Equatable> { func bar(_ x: T, _ y: T) -> Bool { return x == y } } class UIView: NSObject { } let foo: Foo<UIView> = .init() // これが通るので UIView は Equatable 準拠 let a: UIView = .init() let b: UIView = .init() print(a == a) print(a == b)
true false
Avatar
NSObjectの==はisEqualの関数を呼ぶようにNSObjectで定義されている説
6:36 AM
@swift-5.8.1 import Foundation class Amanojaku: NSObject { override func isEqual(_ object: Any?) -> Bool { !super.isEqual(object) } } let a = Amanojaku() let b = Amanojaku() print(a == a) print(a == b) (edited)
Avatar
Avatar
tarunon
@swift-5.8.1 import Foundation class Amanojaku: NSObject { override func isEqual(_ object: Any?) -> Bool { !super.isEqual(object) } } let a = Amanojaku() let b = Amanojaku() print(a == a) print(a == b) (edited)
false true (edited)
Avatar
おけおけ
6:40 AM
想定通りの動きになりました
6:41 AM
subclassを作った時のvtableと、pwtの兼ね合いで、
Avatar
Avatar
koher
UIView のリファレンス https://developer.apple.com/documentation/uikit/uiview の Conforms To に EquatableHashable がないんだけど( NSObject https://developer.apple.com/documentation/objectivec/nsobject にはある)、これって単にドキュメント上で漏れてるだけ? Equatable に準拠したクラスのサブクラスの Equatable 準拠ってどうなるんだったっけ( ==Self がサブクラスを指さずにスーパークラスを指して UIVeiw にとっての Euatable 準拠になってない?)と思ったけど、↓はできたからサブクラスにとっての Equatable 準拠でいいのかな。 @swift-5.8.1 import Foundation struct Foo<T: Equatable> { func bar(_ x: T, _ y: T) -> Bool { return x == y } } class UIView: NSObject { } let foo: Foo<UIView> = .init() // これが通るので UIView は Equatable 準拠 let a: UIView = .init() let b: UIView = .init() print(a == a) print(a == b)
omochimetaru 6/26/2023 6:41 AM
サブクラスにとっての Equatable 準拠
==Self 型で定義されてるから、サブクラスの式に見えてるときは サブクラス同士でないと比較できないはず
(edited)
Avatar
サブクラスでoverrideした時のprotocolに登録した関数がプログラマの意図通りに呼ばれなくなることがある現象は、swiftのjiraの2桁台からある… (edited)
6:42 AM
というか報告したの私じゃなかったっけ
6:44 AM
https://github.com/apple/swift/issues/42725 あった。103番で、僕でしたw
Previous ID SR-103 Radar rdar://problem/21141185 Original Reporter tarunon (JIRA User) Type Bug Environment Reported: Mac OSX 10.11.1, Swift 2.2-dev Tested & remains an an issue on: macOS 10.14...
👍 1
Avatar
Avatar
omochimetaru
サブクラスにとっての Equatable 準拠
==Self 型で定義されてるから、サブクラスの式に見えてるときは サブクラス同士でないと比較できないはず
(edited)
コンパイラが Foo<UIView> に対して ==UIView 同士の比較に制限し、それが呼び出されたときは NSObject== (の先にある isEqual が呼ばれるのはいいとして、その場合 UIViewEquatable に準拠していると言えると思うけど、 UIView のリファレンスに載ってないのはドキュメント上の問題なのかな? (edited)
Avatar
NSObjectで準拠してるからUIViewには明示的には存在しないって事だと思います (edited)
Avatar
"Conforms To" ってサブタイプでもスーパータイプの準拠が全部列挙されませんでしたっけ?
6:52 AM
元が Obj-C だから extensionEquatable 準拠してて表示が漏れるとか?
Avatar
Avatar
koher
コンパイラが Foo<UIView> に対して ==UIView 同士の比較に制限し、それが呼び出されたときは NSObject== (の先にある isEqual が呼ばれるのはいいとして、その場合 UIViewEquatable に準拠していると言えると思うけど、 UIView のリファレンスに載ってないのはドキュメント上の問題なのかな? (edited)
omochimetaru 6/26/2023 6:52 AM
UIViewEquatable に準拠している」で合ってると思います。 「親クラスを経由して準拠している」のか「自分で準拠している」のかは、違いをもたらさないはず。 SR-103は、「親クラスで準拠する時にデフォルト実装を選択している」だから「子も準拠している」と考えてよくて、特に↑とは矛盾しない。 (edited)
👍 1
6:53 AM
ドキュメントに出てこないのはよくわからないです。 僕はドキュメントのそのあたりの表示は昔から信用してないので、普通に壊れてるんじゃ?と思いましたw
😂 1
Avatar
"Conforms To" ってサブタイプでもスーパータイプの準拠が全部列挙されませんでしたっけ?
これが気のせいなのかな・・・
Avatar
そっちが気のせいだと思います。例えばUIScrollViewはInheritsであるUIViewのものは省略してますね
Avatar
たしかに NSMutableArray にも Sequence とかないですね。
Avatar
そこらへんのルールが謎で、UIViewのサブクラスであるUILabelはNSCodingに準拠していますが、UIViewでも準拠していてよくわからない… https://developer.apple.com/documentation/uikit/uiview https://developer.apple.com/documentation/uikit/uilabel しかもUILabelのConform Toのほうが件数が少なくて、全部列挙でもなさそう… (edited)
Avatar
これは推測ですが、自前で再実装してる場合は明示してるとかじゃないでしょうか
Avatar
Avatar
tarunon
これは推測ですが、自前で再実装してる場合は明示してるとかじゃないでしょうか
omochimetaru 6/26/2023 6:57 AM
ありそ〜
Avatar
NSCodingは再実装しないと実現できないので。他方、オブジェクトのEquatableはポインタ比較で良いので再実装は必要ありません。isEqualでもそう。
Avatar
なるほどー。
Avatar
omochimetaru 6/26/2023 6:59 AM
そのへんのドキュメント挙動ってdoccで自前のライブラリのドキュメント生成したときも再現するのかな。 (edited)
Avatar
同じ文字列なら true を返すようにオーバーライドされてるけど、 NSString にも NSMutableString にも "Conforms To" に Equatable がない。 @swift-5.8.1 import Foundation let a: NSMutableString = "X" let b: NSMutableString = "X" print(a === b) print(a == b) (edited)
Avatar
Avatar
koher
同じ文字列なら true を返すようにオーバーライドされてるけど、 NSString にも NSMutableString にも "Conforms To" に Equatable がない。 @swift-5.8.1 import Foundation let a: NSMutableString = "X" let b: NSMutableString = "X" print(a === b) print(a == b) (edited)
false true (edited)
Avatar
(わざわざ NSMutableString を使ったのは、 NSString だと色んな手を使ったけど同じ文字列に同じオブジェクトが割り当てられて↑みたいなことができなかった。) (edited)
Avatar
omochimetaru 6/26/2023 7:08 AM
NSStringは(短い?)文字列を実体キャッシュしてインスタンスも同じにするやつあるらしいですね。 (edited)
Avatar
Avatar
koher
(わざわざ NSMutableString を使ったのは、 NSString だと色んな手を使ったけど同じ文字列に同じオブジェクトが割り当てられて↑みたいなことができなかった。) (edited)
omochimetaru 6/26/2023 7:08 AM
「いろんな手」に、「デカイ文字列にする」も入ってます?
Avatar
入ってないです。部分文字列から生成とか試してみたくらい。
Avatar
omochimetaru 6/26/2023 7:09 AM
なるほど
7:09 AM
デカイ文字列を許してしまうと、そのキャッシュテーブルとマッチングを取るための「ハッシュ計算」が O(k); (kは文字列の長さ) の負担になるので、 キャップがある気がするんですよね。 (edited)
Avatar
Java だと同じ文字列リテラルには同じオブジェクトが割り当てられるから、 .init してみたり、それで不十分だったから部分文字列から生成とか試した。 NSString 自体の部分文字列は試してない。
Avatar
omochimetaru 6/26/2023 7:10 AM
あーそうか、リテラルはコンパイル時に限定的な数でできるから統合されそう・・ (edited)
Avatar
Avatar
koher
Java だと同じ文字列リテラルには同じオブジェクトが割り当てられるから、 .init してみたり、それで不十分だったから部分文字列から生成とか試した。 NSString 自体の部分文字列は試してない。
omochimetaru 6/26/2023 7:11 AM
Javaで文字列を(間違って) == で比較しても(リテラル同士の範囲で)うまく動いてしまう罠の話、 Obj-Cでも同じ用に罠なのかな。 (edited)
Avatar
ありそう。 Obj-CNSString * のポインタ同士を == で比較するって意味ですよね?
Avatar
omochimetaru 6/26/2023 7:12 AM
そう。
Avatar
しかも、リテラルを超えて、短い文字列の範囲なら成り立つ😂 (edited)
Avatar
omochimetaru 6/26/2023 7:13 AM
本当は isEqual: しないとバグってる。
Avatar
罠度が高そう。
Avatar
omochimetaru 6/26/2023 7:13 AM
あそうか、Javaよりも罠が巧妙だ。
Avatar
@swift-5.8.1 class A: Equatable { static func ==(lhs: A, rhs: A) -> Bool { print("A") return lhs === rhs } } class B: A {} class C: B { static func ==(lhs: C, rhs: C) -> Bool { print("C") return lhs === rhs } } struct Foo<T: Equatable> { func bar(_ x: T, _ y: T) -> Bool { x == y } } let c: C = .init() print(Foo<A>().bar(c, c)) print(Foo<B>().bar(c, c)) print(Foo<C>().bar(c, c))
Avatar
Avatar
koher
@swift-5.8.1 class A: Equatable { static func ==(lhs: A, rhs: A) -> Bool { print("A") return lhs === rhs } } class B: A {} class C: B { static func ==(lhs: C, rhs: C) -> Bool { print("C") return lhs === rhs } } struct Foo<T: Equatable> { func bar(_ x: T, _ y: T) -> Bool { x == y } } let c: C = .init() print(Foo<A>().bar(c, c)) print(Foo<B>().bar(c, c)) print(Foo<C>().bar(c, c))
A true A true A true
Avatar
最後の A じゃなく C にならないんですっけ?
Avatar
omochimetaru 6/26/2023 7:28 AM
ならないですね。
7:29 AM
親でconformしたPWTエントリは、子で上書きできないです
7:29 AM
そのようにしたければ、A.==class func にして、 C.==override class func にする必要があります。
Avatar
@swift-5.8.1 import Foundation struct Foo<T: Equatable> { func bar(_ x: T, _ y: T) -> Bool { x == y } } let a: NSMutableString = "X" let b: NSMutableString = "X" print(a === b) print(Foo<NSObject>().bar(a, b)) print(Foo<NSString>().bar(a, b)) print(Foo<NSMutableString>().bar(a, b))
Avatar
Avatar
koher
@swift-5.8.1 import Foundation struct Foo<T: Equatable> { func bar(_ x: T, _ y: T) -> Bool { x == y } } let a: NSMutableString = "X" let b: NSMutableString = "X" print(a === b) print(Foo<NSObject>().bar(a, b)) print(Foo<NSString>().bar(a, b)) print(Foo<NSMutableString>().bar(a, b))
false true true true
Avatar
NSObject==static func っぽいけど何が起こってるの?? static func == (lhs: NSObject, rhs: NSObject) -> Bool https://developer.apple.com/documentation/objectivec/nsobject/2983393 (edited)
Avatar
Avatar
koher
NSObject==static func っぽいけど何が起こってるの?? static func == (lhs: NSObject, rhs: NSObject) -> Bool https://developer.apple.com/documentation/objectivec/nsobject/2983393 (edited)
omochimetaru 6/26/2023 7:37 AM
たるのんが言ってるとおり、その中でインスタンスメソッドの isEqual を呼ぶのでしょう。 (edited)
Avatar
ああ、そういうことか。 isEqual がオーバーライドされてるのか。
Avatar
omochimetaru 6/26/2023 7:38 AM
そうそう。
Avatar
ObjC時代は[NSString isEqualToString:] で比較してたから特に違和感なかったけど、Swiftでvar a: NSString== で比較するのはめっちゃ違和感ありますね・・・
Avatar
Obj-C と Java の記憶が・・・
Avatar
omochimetaru 6/26/2023 7:48 AM
僕は参照型でも == で同値比較する感覚にもう馴染んだなあ
Avatar
ObjectiveCとかFoundationのオーバーレイのソースってもう公開されてないんでしたっけ
8:03 AM
Xcode 12出たタイミングでツールチェインからSDKの方に移してapple/swiftから消えてるのは掘り出せたけど、その後apple-oss-distributionsとかでも公開されてなさそう? https://github.com/apple/swift/pull/32502
Update master branch for Xcode 12 beta. Several overlays, whose purpose is to refine a framework’s Objective-C APIs into Swift, have had their sources removed as the functionality has been sunk int...
Avatar
オーバレイ、Apple内部管理になったのか
12:48 AM
3年前?マジか
Avatar
omochimetaru 7/5/2023 3:59 AM
⇒  新幹線・特急つばめ・リレーつばめ号のデータファイルはこちら新幹線つばめ号と特急つばめ号のプチ・ストーリー(国鉄時代・特急つばめ号(東海道)は別ページ)◆新幹線つばめ号2004年3月13日の九州新幹線・部分開業の際に営業を開始したが、そ
3:59 AM
Avatar
これ、Swiftのロゴ大丈夫なの?
swift 3
Avatar
omochimetaru 7/5/2023 6:14 AM
結構似てるけど顔の反りが逆だ
Avatar
そのレベルは盗作だと言われたらアウトでは?ツバメのシルエットとして一般的な形なのかなぁ。
Avatar
色まで似てるものもありますよ.https://www.tsubamegas-f.co.jp/company/message/
Avatar
omochimetaru 7/5/2023 3:20 PM
swift 1
3:20 PM
おおw
Avatar
呉の大和ミュージアムの隣の海上自衛隊呉史料館で撮りました。英国だったかの軍隊のものだったと思います。
Avatar
omochimetaru 7/5/2023 11:30 PM
ヤバ!w 名前まで一緒だww
Avatar
まあSwiftはアマツバメという意味だから。このシルエットだとただのシルエットだと思うんですけど、九州新幹線のとツバメガスフロンティアのはシルエットをデフォルメした形状が似すぎな気が・・・。
12:38 AM
複数あるということは、デザイナーからすると自然なデフォルメをした際に行き着く先なのかな・・・。
Avatar
田舎のローカルタクシーだけど、昔こんな色じゃなかったから寄せに行ってると思うんだよね…
Avatar
omochimetaru 7/7/2023 12:18 PM
手描き?w
Avatar
omochimetaru 7/20/2023 5:43 AM
XCFrameworkって複数のモジュールを含める事ってできるんですっけ
Avatar
できないものという認識ですができたりするのかな
Avatar
omochimetaru 7/20/2023 6:02 AM
単に .framework をマルチアーキテクチャするだけのものだと考えると無理ですよねえ。
Avatar
mobulemap ファイルを複数持つみたいなトリッキーなことできたりしないかな
Avatar
modulemap自体は複数のモジュールを1枚の.modulemapに持てる
Avatar
omochimetaru 7/20/2023 6:10 AM
なるほど
Avatar
たしかにそうだ
Avatar
.swiftmoduleでできるのかはやったことない
Avatar
Kishikawa Katsumi 7/20/2023 6:36 AM
.framework は中に.framework を入れられるのでmacOSだといけるんじゃないかな。
6:36 AM
iOSでも動くけどApp Storeで許されてない。
Avatar
確かに昔に.frameworkに.framework入れてApp Storeにアップロードしようとしたらエラーになった
Avatar
omochimetaru 7/20/2023 7:00 AM
なるほどなるほど
Avatar
Kishikawa Katsumi 7/20/2023 7:15 AM
https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/CreationGuidelines.html サラッと調べてみたけどAppleは
Don’t Create Umbrella Frameworks
って言ってるみたいな。iOSで使えない理由ではないけど。
Provides conceptual information and guidelines on how to create a framework.
Avatar
↑の時のエラー文言もそんな感じだった気がします
Avatar
何か見覚えあるなと思ったら、同じようなやり取りをしていた https://twitter.com/k_katsumi/status/1249892988299272199?s=20 (edited)
@kitasuke そこまではうまくいくと思うのですが、申請できない(AppStore Connectでエラーになる)と思います。iOSでNested Frameworkがサポートされない、というのは動作の問題じゃなくてストアに出せないという意味、のはず。 https://t.co/5IuXZKEqko
Avatar
@swift-5.8.1 let foo: [Character] = Array("Hello, World") print(foo)
Avatar
Avatar
Iceman
@swift-5.8.1 let foo: [Character] = Array("Hello, World") print(foo)
["H", "e", "l", "l", "o", ",", " ", "W", "o", "r", "l", "d"]
Avatar
Arrayが暗黙的に[Character]に変換される挙動なんてあったんですね
12:57 AM
あいや、これは文字列リテラルがSequenceとしてArrayのinitに渡っててString.ElementのArrayが出てきてるだけか
Avatar
let bar: [Character] = "Hello, World"ができないのでそうみたいですね。
Avatar
omochimetaru 7/25/2023 1:00 AM
文字列型がCharacterのCollectionなの、「文字列型の配列」を用意すべきところで、間違ってただの文字列型を書いてしまった結果、 なんかその先の .map とかvalidになってしまってよくわからないハマりがたまに起きるw
1:43 AM
一段概念がズレてる
Avatar
omochimetaru 7/29/2023 8:15 AM
withExtendedLifetime のasync版が無いのっていいのかね
Avatar
func _fixLifetime<T>(_ x: T)を直接使うかwithExtendedLifetime(x) { _ in } で一応代用できるはず、たぶん
Avatar
omochimetaru 7/29/2023 8:22 AM
_fixLifetime ってstdlib用だと思ってた、ほんとだシンボル見えてるな
8:22 AM
withExtendedLifetime(x) { _ in } ←これわかるんだけど、その用法って同期関数でもできるよね
8:23 AM
fixLifetime のほうがわかりやすいのに、なんでスコープ関数の withExtendedLifetime が標準で提供されているのかがよくわからない
8:23 AM
fixLifetime だけだったら、最初からasyncも対応できるし。
Avatar
そういうAPIちょこちょこありそう
Avatar
omochimetaru 7/29/2023 8:26 AM
async対応漏れ?
Avatar
対応漏れというかreasync待ちというか
Avatar
omochimetaru 7/29/2023 8:27 AM
なるほど
Avatar
omochimetaru 8/17/2023 6:58 AM
enum E { case a case b } func body(e: E) { // OK if case .a = e { print("a") } // なにこれ? if case e = .a { print("a") } }
6:58 AM
↑これ左右逆にできるの知ってた?
Avatar
expression failed to parse: error: MyPlayground.playground:13:18: error: reference to member 'a' cannot be resolved without a contextual type if case e = .a { ~^
バージョンによって推論できない?E.aだったらコンパイルできるので本題としては同じですが
Avatar
let x = 42 let a = Int(readLine()!)! switch a { case .zero: Print("0") case x: print("42") default: print("Other") }
7:02 AM
これの case x のパターンみたいなもの?
Avatar
omochimetaru 8/17/2023 7:03 AM
Event-driven network application framework for high performance protocol servers & clients, non-blocking. - apple/swift-nio
Avatar
Avatar
koher
let x = 42 let a = Int(readLine()!)! switch a { case .zero: Print("0") case x: print("42") default: print("Other") }
switch E.a { case e: print("a") default: break } こういう解釈になる?
Avatar
omochimetaru 8/17/2023 7:05 AM
じゃあ一般に if a == bif case a = b と書けるって事か? (edited)
Avatar
@swift-5.8.1 func eq<T>(a: T, b: T) -> Bool{ if case a = b { return true } else { return false } }
Avatar
Avatar
t.ae
@swift-5.8.1 func eq<T>(a: T, b: T) -> Bool{ if case a = b { return true } else { return false } }
exit status: 1 with <stdin>:2:13: error: operator function '~=' requires that 'T' conform to 'Equatable' if case a = b { ^ Swift.~=:1:13: note: where 'T' = 'T' public func ~= <T>(a: T, b: T) -> Bool where T : Equatable ^
Avatar
~= があればなんでもよいのかな
Avatar
omochimetaru 8/17/2023 7:09 AM
Equatableに対する ~= が提供されてるから case a = b で書けるってことか
Avatar
@swift-5.9.2 let v = if Bool.random() { "World" } else { nil } print(type(of: v)) let v2 = Bool.random() ? "World" : nil print(type(of: v2))
Avatar
Avatar
Iceman
@swift-5.9.2 let v = if Bool.random() { "World" } else { nil } print(type(of: v)) let v2 = Bool.random() ? "World" : nil print(type(of: v2))
exit status: 1 with <stdin>:1:45: error: 'nil' requires a contextual type let v = if Bool.random() { "World" } else { nil } ^ <stdin>:2:1: error: type of expression is ambiguous without a type annotation print(type(of: v)) ^~~~~~~~~~~~~~~~~~
Avatar
if式の型推論弱いの何なんでしょうね
Avatar
omochimetaru 8/21/2023 8:19 AM
However, the impact of bidirectional inference on the performance of the type checker would likely prohibit this feature from being implemented today, even if it were considered preferable. This is especially true in cases where there are many branches. This decision could be revisited in future: switching to full bidirectional type inference may be source breaking in theory, but probably not in practice (the proposal authors can't think of any examples where it would be).
8:20 AM
型推論が重くなりそうだから、分岐ごとの部分式を合成して推論する事をしていなくて
8:20 AM
分岐ごとに推論した後で結果をマージしようとしている。
Avatar
三項演算子にできてることができないのは何かif式のほうが高い表現力を持ってるからなんでしょうかね?
Avatar
omochimetaru 8/21/2023 8:21 AM
確かめられてないんだけど、Result Builderの中でif文使った時の挙動と同じなんじゃあないかな
Avatar
Avatar
Iceman
三項演算子にできてることができないのは何かif式のほうが高い表現力を持ってるからなんでしょうかね?
omochimetaru 8/21/2023 8:22 AM
逆ですね、三項演算子のほうが表現力が高いはず。 三項演算子は任意の式ポジションに書けるけど、if式は代入文の直下の右辺とかしか書けない
Avatar
引数に使えるとかで三項演算子のほうが幅広いですよね
8:23 AM
なおさら推論が弱い理由にはならないような?
Avatar
omochimetaru 8/21/2023 8:23 AM
if「文」はreturnを含めたりできるから三項演算子より表現力が高いけど、 式モードのときのifはreturnとか書けなくなるから三項演算子の劣化だと思う
Avatar
Avatar
Iceman
引数に使えるとかで三項演算子のほうが幅広いですよね
omochimetaru 8/21/2023 8:24 AM
「三項演算子が既にできてるんだから良いじゃん」に対しては、 三項演算子のほうはそもそもやりすぎちゃったけど、 ここ変更すると互換性壊れるからしょうがないんだわ、みたいな話だったと思う(フォーラムで見た (edited)
Avatar
なるほど。今の三項演算子がすでに型推論器に負荷かかってるのでやめたい、という感じなんですね
Avatar
omochimetaru 8/21/2023 8:25 AM
まあでも見づらいからゆうほど使われてないんじゃないかなあ。 三項演算子の中に三項演算子が入ってるときの結合とか難しいし。
8:25 AM
if式はブレースがついてるから入れ子の場合はわかりやすい。
Avatar
⚪⚪︎じゃなければnil」みたいなパターンに対して、 if foo { "bar" } else { nil }
8:30 AM
ができないのが不便そうだなぁと感じてました
Avatar
omochimetaru 8/21/2023 8:31 AM
わかる、それすぐ踏む。
Avatar
(元々三項演算子があったりOptionalがモナドなのでそんなに困ってはない) (edited)
Avatar
omochimetaru 8/21/2023 8:31 AM
左辺に明示的な型を付けるか、 .some("bar") でいけるのか?
Avatar
@swift-5.9.2 let v = if Bool.random() { "World" } else { .none } let v2 = if Bool.random() { .some("World") } else { nil } let v3: String? = if Bool.random() { "World" } else { nil } (edited)
Avatar
Avatar
Iceman
@swift-5.9.2 let v = if Bool.random() { "World" } else { .none } let v2 = if Bool.random() { .some("World") } else { nil } let v3: String? = if Bool.random() { "World" } else { nil } (edited)
exit status: 1 with <stdin>:1:46: error: cannot infer contextual base in reference to member 'none' let v = if Bool.random() { "World" } else { .none } ~^~~~ <stdin>:2:30: error: cannot infer contextual base in reference to member 'some' let v2 = if Bool.random() { .some("World") } else { nil } ~^~~~ (edited)
Avatar
左辺アノテーションだけですね
Avatar
omochimetaru 8/21/2023 8:35 AM
微妙だ。
Avatar
@swift-5.9.2 let v = if Bool.random() { "World" } else { nil } as String?
Avatar
Avatar
masakihori
@swift-5.9.2 let v = if Bool.random() { "World" } else { nil } as String?
no output
Avatar
一応これも
Avatar
おお。そこにasがあるの新鮮ですね
Avatar
omochimetaru 8/25/2023 8:46 AM
そんなのいけるんだ!w
8:46 AM
代入分右辺のルート式じゃないとダメだと思ってた。これだとルート式はas演算子で、if式はそのオペランドだから部分式になる。 (edited)
Avatar
Kishikawa Katsumi 9/3/2023 4:16 PM
https://github.com/apple/swift-org-website/blob/7518f22dae2c2ab8320d0184ddb0e9fbedc36d13/_posts/2023-08-29-swift-5.9-released.md いつの間にかSwift 5.9リリースされてた、 って思ったけどされてなかった。
Swift.org website. Contribute to apple/swift-org-website development by creating an account on GitHub.
😂 4
Avatar
Mojo🔥 is here! Many, many folks want to download and run the Mojo compiler locally instead in notebooks... but languages aren't just a compiler, you need a full ecosystem of developer tools to build things! Mojo is still a young language, but today is a huge step forward! 🚀❤️‍🔥
Likes
509
👉 1
Avatar
omochimetaru 9/15/2023 2:47 AM
@swift-5.8.1 let str = "abc" str.withCString { print(String(format: "%8s", $0)) } print(String(format: "%8@", str))
2:48 AM
%s なら幅指定子が使えるのに %@ だと使えない・・・
Avatar
omochimetaru 9/15/2023 3:07 AM
@swift-5.8.1 起きて
Avatar
Avatar
omochimetaru
@swift-5.8.1 起きて
exit status: 2 with error: unable to invoke subcommand: swift-起きて (No such file or directory)
Avatar
Avatar
omochimetaru
@swift-5.8.1 let str = "abc" str.withCString { print(String(format: "%8s", $0)) } print(String(format: "%8@", str))
exit status: 1 with <stdin>:3:17: error: incorrect argument labels in call (have 'format:_:', expected 'repeating:count:') print(String(format: "%8s", $0)) ^~~~~~~
Avatar
omochimetaru 9/15/2023 3:09 AM
@swift-5.8.1 import Foundation let str = "abc" str.withCString { print(String(format: "%8s", $0)) } print(String(format: "%8@", str))
Avatar
Avatar
omochimetaru
@swift-5.8.1 import Foundation let str = "abc" str.withCString { print(String(format: "%8s", $0)) } print(String(format: "%8@", str))
abc abc
👀 1
Avatar
%8@ みたいな指定って昔ありましたっけ…?
Avatar
omochimetaru 9/15/2023 4:33 AM
C言語に昔からありますよ %02d とかがよく使うと思うけど
4:33 AM
全ての型で使えると思います、文字列出す時の幅なんで。 %@ だけなぜか使えない。
Avatar
あれってCなんですね。OjbCの拡張かと思ってました
Avatar
omochimetaru 9/15/2023 4:35 AM
あ、 %@ が使えるのは ObjC です。
4:35 AM
元々はC言語の printf が多分元祖で大昔からあって
4:35 AM
ObjCではそこに オブジェクトなんでも渡せる型指定子として @ を追加したわけです。 (edited)
4:37 AM
Format Specifiers The format specifiers supported by the NSString formatting methods and CFString formatting functions follow the IEEE printf specification; the specifiers are summarized in Table 1. Note that you can also use the “n$” positional specifiers such as %1$@ %2$s. For more details, see the IEEE printf specification. You can also use these format specifiers with the NSLog function.
Avatar
そうそう %02d とかはよく整形する時に使ってましたけど、%@ にそれ使うの見た覚えがなくて 👀
Avatar
omochimetaru 9/15/2023 4:38 AM
Each conversion specification is introduced by the '%' character [XSI] [Option Start] or by the character sequence "%n$", [Option End] after which the following appear in sequence: Zero or more flags (in any order), which modify the meaning of the conversion specification. An optional minimum field width. If the converted value has fewer bytes than the field width, it shall be padded with spaces by default on the left; it shall be padded on the right if the left-adjustment flag ( '-' ), described below, is given to the field width. The field width takes the form of an asterisk ( '*' ), described below, or a decimal integer.
Avatar
Avatar
lovee
そうそう %02d とかはよく整形する時に使ってましたけど、%@ にそれ使うの見た覚えがなくて 👀
omochimetaru 9/15/2023 4:38 AM
ず〜っと対応が無いのかもしれませんね
4:39 AM
IEEE printf specには、各変換子にはfield widthが与えられる、って書いてあるし、 %8@ もできないとダメだと思うけどなあ
Avatar
なるほど、そう言うことだったんですね
Avatar
omochimetaru 9/15/2023 4:40 AM
printf specに従っているよと言いながら、独自追加した %@ はそれとは関係ないよ、って感じになってますな
Avatar
まあでもそれC向けの規格で %@ はあくまでObj-Cの拡張だから…かなw
Avatar
omochimetaru 9/15/2023 5:35 AM
@swift-5.7.3 import Foundation print("\\".withCString { String(format: "%s", $0) })
Avatar
Avatar
omochimetaru
@swift-5.7.3 import Foundation print("\\".withCString { String(format: "%s", $0) })
\
Avatar
omochimetaru 9/15/2023 5:54 AM
@swift-5.7.3 import Foundation print("あいう".withCString { String(format: "%s", $0) })
Avatar
Avatar
omochimetaru
@swift-5.7.3 import Foundation print("あいう".withCString { String(format: "%s", $0) })
あいう
Avatar
%@はObjective-Cでオブジェクトにメッセージdescriptionを送って返されるNSStringを印字だからなのかな?
Avatar
そうですね。でも、その NSString を印字する前に、 %s と同じように、幅指定子でスペースを挿入してやる事は仕組みとしてはできると思います。 (edited)
Avatar
確かに C 実装の方なら https://github.com/apple/swift-corelibs-foundation/blob/swift-5.8.1-RELEASE/CoreFoundation/String.subproj/CFString.c#L7834https://github.com/apple/swift-corelibs-foundation/blob/swift-5.8.1-RELEASE/CoreFoundation/String.subproj/CFString.c#L7676-L7699 と同等のことをするだけですね.ObjC 実装と C 実装が swift-foundation で統一されるなら,swift-foundation に proposal を出せばワンチャンあるのかもしれないですね.(今の swift-foundation では Stringformat あり init は未実装みたいですが)
Avatar
「@はオブジェクトそのものを示してる(桁数とかはない)」という感じかな? pが桁数を黙って無視するのと同じ感じ?
5:29 AM
NSNumberな10を%03@で出力したら何が表示されるのが正しいのかとか面倒くさそう
t_desune 1
Avatar
以前、NSDataのdescriptionの内容が変わって、これを16進数変換に利用していたコードが不正となってしまったことがあったので、descriptionの出力内容に依存してほしくないという理由で、指定できない方がいいのかなと思いました。
Avatar
omochimetaru 9/20/2023 4:12 PM
そういえば、 any P: P ではないけど、 any Sendable だけは : Sendable ですね。
Avatar
marker protocolがself-conformingできるからとかでしょうか?
Avatar
そうですね、埋める実装がないので必ずできますね 自作マーカープロトコルでも同じ挙動かな?
Avatar
できそうですね。
Marker protocols always self-conform.
https://github.com/apple/swift/blob/b741b01377af745a6ca4de8f5a0ab11171e82eae/lib/Sema/TypeCheckDecl.cpp#L686
(edited)
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
ExistentialConformsToSelfRequestわかりやすいな
👍🏻 1
Avatar
struct S { var a: Int init(cond: Bool) { if cond { a = 1 // self ok (1) foo() } a = 2 // self ok (2) foo() } func foo() {} } 知らなかった。
12:30 AM
てっきり、一箇所に集約されるんだと思ってた
Avatar
https://forums.swift.org/t/second-review-se-0390-noncopyable-structs-and-enums/63866/28 割と長い間なぜ !Copyable ではなく ~Copyable なのか謎に思ったのですが、なるほど厳密には「Copyable ではない」じゃなくて「Copyable の保証がない」の意味だったか
I'm concerned that the reading as "not" is specifically misleading, since in its generalization, that's not strictly what it means; it's more like "this specific declaration does not promise Copyable". In the fullness of time, we want to allow for conditionally copyable types, which would look like: enum Optional: ~Copyable { ... } extension O...
t_naruhodo 7
Avatar
omochimetaru 10/2/2023 4:48 AM
なるほど〜
4:48 AM
notではないから!にはしない、という意図があったんですね
t_sorena 1
Avatar
その定義をちょっと変えようとしているんですかね?保証も準拠も同じな気がしますが https://github.com/apple/swift/pull/68818 (edited)
👀 2
Avatar
@swift-main func XCTAssertEqual<T: Equatable>(_ a: T, _ b: T) { guard a == b else { print("\(a) != \(b)") return } } // コ + 半角濁点 let s = "\u{30B3}\u{FF9E}" XCTAssertEqual(s.unicodeScalars.count, 2) XCTAssertEqual(s.count, 1) let indices: [String.Index] = Array(s.indices) + [s.endIndex] XCTAssertEqual(indices.count, 2) let range: Range<String.Index> = s.rangeOfCharacter(from: chars)! XCTAssertEqual(indices.contains(range.lowerBound), true) XCTAssertEqual(indices.contains(range.upperBound), false) // !?
Avatar
Avatar
omochimetaru
@swift-main func XCTAssertEqual<T: Equatable>(_ a: T, _ b: T) { guard a == b else { print("\(a) != \(b)") return } } // コ + 半角濁点 let s = "\u{30B3}\u{FF9E}" XCTAssertEqual(s.unicodeScalars.count, 2) XCTAssertEqual(s.count, 1) let indices: [String.Index] = Array(s.indices) + [s.endIndex] XCTAssertEqual(indices.count, 2) let range: Range<String.Index> = s.rangeOfCharacter(from: chars)! XCTAssertEqual(indices.contains(range.lowerBound), true) XCTAssertEqual(indices.contains(range.upperBound), false) // !?
swiftNightly BOT 10/24/2023 11:50 PM
exit status: 1 with <stdin>:17:71: error: cannot find 'chars' in scope let range: Range<String.Index> = s.rangeOfCharacter(from: chars)! ^~~~~ <stdin>:17:48: error: value of type 'String' has no member 'rangeOfCharacter' let range: Range<String.Index> = s.rangeOfCharacter(from: chars)! ~ ^~~~~~~~~~~~~~~~
Avatar
@swift-main import Foundation func XCTAssertEqual<T: Equatable>(_ a: T, _ b: T) { guard a == b else { print("\(a) != \(b)") return } } // コ + 半角濁点 let s = "\u{30B3}\u{FF9E}" XCTAssertEqual(s.unicodeScalars.count, 2) XCTAssertEqual(s.count, 1) let indices: [String.Index] = Array(s.indices) + [s.endIndex] XCTAssertEqual(indices.count, 2) let chars = CharacterSet(charactersIn: "ァ"..."ヺ") let range: Range<String.Index> = s.rangeOfCharacter(from: chars)! XCTAssertEqual(indices.contains(range.lowerBound), true) XCTAssertEqual(indices.contains(range.upperBound), false) // !?
Avatar
Avatar
omochimetaru
@swift-main import Foundation func XCTAssertEqual<T: Equatable>(_ a: T, _ b: T) { guard a == b else { print("\(a) != \(b)") return } } // コ + 半角濁点 let s = "\u{30B3}\u{FF9E}" XCTAssertEqual(s.unicodeScalars.count, 2) XCTAssertEqual(s.count, 1) let indices: [String.Index] = Array(s.indices) + [s.endIndex] XCTAssertEqual(indices.count, 2) let chars = CharacterSet(charactersIn: "ァ"..."ヺ") let range: Range<String.Index> = s.rangeOfCharacter(from: chars)! XCTAssertEqual(indices.contains(range.lowerBound), true) XCTAssertEqual(indices.contains(range.upperBound), false) // !?
swiftNightly BOT 10/24/2023 11:51 PM
no output
Avatar
なにこれ
11:52 PM
rangeOfCharacterが返すRangeのupperBoundが、
11:52 PM
検索対象の文字列に含まれないindexになっている
11:53 PM
あれ?でも、s[] に渡したら濁点だけ取り出せた
11:54 PM
もしかしてcharactersの刻みとズレてるindexの存在が許されるのか
Avatar
@swift-main let s = "\u{30B3}\u{FF9E}" let su = s.unicodeScalars let i0 = su.startIndex let i1 = su.index(su.startIndex, offsetBy: 1) let i2 = su.index(su.startIndex, offsetBy: 2) print(s.distance(from: s.startIndex, to: i0)) print(s.distance(from: s.startIndex, to: i1)) print(s.distance(from: s.startIndex, to: i2)) print(i0 < i1) print(i1 < i2) print(i2 == s.endIndex)
Avatar
Avatar
omochimetaru
@swift-main let s = "\u{30B3}\u{FF9E}" let su = s.unicodeScalars let i0 = su.startIndex let i1 = su.index(su.startIndex, offsetBy: 1) let i2 = su.index(su.startIndex, offsetBy: 2) print(s.distance(from: s.startIndex, to: i0)) print(s.distance(from: s.startIndex, to: i1)) print(s.distance(from: s.startIndex, to: i2)) print(i0 < i1) print(i1 < i2) print(i2 == s.endIndex)
swiftNightly BOT 10/25/2023 12:10 AM
0 0 1 true true true
Avatar
@swift-main let s = "\u{30B3}\u{FF9E}" let su = s.unicodeScalars let i0 = su.startIndex let i1 = su.index(su.startIndex, offsetBy: 1) let i2 = su.index(su.startIndex, offsetBy: 2) print(s.distance(from: s.startIndex, to: i0)) print(s.distance(from: s.startIndex, to: i1)) print(s.distance(from: s.startIndex, to: i2)) print(i0 < i1) print(i1 < i2) print(i2 == s.endIndex) print(su.distance(from: su.startIndex, to: i0)) print(su.distance(from: su.startIndex, to: i1)) print(su.distance(from: su.startIndex, to: i2)) (edited)
Avatar
Avatar
omochimetaru
@swift-main let s = "\u{30B3}\u{FF9E}" let su = s.unicodeScalars let i0 = su.startIndex let i1 = su.index(su.startIndex, offsetBy: 1) let i2 = su.index(su.startIndex, offsetBy: 2) print(s.distance(from: s.startIndex, to: i0)) print(s.distance(from: s.startIndex, to: i1)) print(s.distance(from: s.startIndex, to: i2)) print(i0 < i1) print(i1 < i2) print(i2 == s.endIndex) print(su.distance(from: su.startIndex, to: i0)) print(su.distance(from: su.startIndex, to: i1)) print(su.distance(from: su.startIndex, to: i2)) (edited)
swiftNightly BOT 10/25/2023 12:11 AM
0 0 1 true true true 0 1 2 (edited)
Avatar
うへ〜なるほど〜
12:12 AM
UnicodeScalarIndexは実はString.Indexと同じで String.distanceで見たときは、charactersの刻みでしか数えられないから、 一見同じ距離に見えるが、実は違う UnicodeScalarView.distanceで見るとちゃんとunicode scalarの刻みでのオフセットで見える
Avatar
func takeSendableClosure(_ c: @Sendable () -> ()) {} let nonSendable: () -> () = {} takeSendableClosure(nonSendable) // 警告出る struct S { var nonSendableValue: () -> () @Sendable func mayUseNonSendableValue() { nonSendableValue() } } var s = S(nonSendableValue: {}) takeSendableClosure(s.mayUseNonSendableValue) // 警告出ない (edited)
3:04 AM
structとかに生えてる関数、適当に@Sendableつけるだけで@Sendableなクロージャとして扱えてしまうんですが、これって正しいんでしょうかね?
Avatar
mutatingじゃなければ問題なさそう
Avatar
@swift-5.9.2 -strict-concurrency=complete import Foundation func takeSendableClosure(_ c: @Sendable @escaping () -> ()) { Task.detached(operation: c) } let nonSendable: () -> () = {} takeSendableClosure(nonSendable) // 警告出る struct S { var nonSendableValue: () -> () @Sendable func mayUseNonSendableValue() { nonSendableValue() } } var count = 0 var s = S(nonSendableValue: { count += 1 }) takeSendableClosure(s.mayUseNonSendableValue) // 警告出ない for _ in 0..<10000 { takeSendableClosure(s.mayUseNonSendableValue) } print(count) sleep(1) print(count) (edited)
Avatar
Avatar
Iceman
@swift-5.9.2 -strict-concurrency=complete import Foundation func takeSendableClosure(_ c: @Sendable @escaping () -> ()) { Task.detached(operation: c) } let nonSendable: () -> () = {} takeSendableClosure(nonSendable) // 警告出る struct S { var nonSendableValue: () -> () @Sendable func mayUseNonSendableValue() { nonSendableValue() } } var count = 0 var s = S(nonSendableValue: { count += 1 }) takeSendableClosure(s.mayUseNonSendableValue) // 警告出ない for _ in 0..<10000 { takeSendableClosure(s.mayUseNonSendableValue) } print(count) sleep(1) print(count) (edited)
9745 9999<stdin>:7:21: warning: converting non-sendable function value to '@Sendable () -> ()' may introduce data races takeSendableClosure(nonSendable) // 警告出る (edited)
Avatar
やーでもこうやって平気で壊せると思うんですよね
3:13 AM
本来はSがSendableである上で、funcについた@Sendableが認められるべきかなと (edited)
Avatar
まずそう
3:14 AM
@swift-main -strict-concurrency=complete import Foundation func takeSendableClosure(_ c: @Sendable @escaping () -> ()) { Task.detached(operation: c) } let nonSendable: () -> () = {} takeSendableClosure(nonSendable) // 警告出る struct S { var nonSendableValue: () -> () @Sendable func mayUseNonSendableValue() { nonSendableValue() } } var count = 0 var s = S(nonSendableValue: { count += 1 }) takeSendableClosure(s.mayUseNonSendableValue) // 警告出ない for _ in 0..<10000 { takeSendableClosure(s.mayUseNonSendableValue) } print(count) sleep(1) print(count)
Avatar
Avatar
Yuta Saito
@swift-main -strict-concurrency=complete import Foundation func takeSendableClosure(_ c: @Sendable @escaping () -> ()) { Task.detached(operation: c) } let nonSendable: () -> () = {} takeSendableClosure(nonSendable) // 警告出る struct S { var nonSendableValue: () -> () @Sendable func mayUseNonSendableValue() { nonSendableValue() } } var count = 0 var s = S(nonSendableValue: { count += 1 }) takeSendableClosure(s.mayUseNonSendableValue) // 警告出ない for _ in 0..<10000 { takeSendableClosure(s.mayUseNonSendableValue) } print(count) sleep(1) print(count)
swiftNightly BOT 11/6/2023 3:14 AM
9798 9977<stdin>:7:21: warning: converting non-sendable function value to '@Sendable () -> ()' may introduce data races takeSendableClosure(nonSendable) // 警告出る <stdin>:11:3: warning: instance methods of non-Sendable types cannot be marked as '@Sendable'; this is an error in Swift 6 @Sendable func mayUseNonSendableValue() { ^
Avatar
あれ、mainだと直ってる!
Avatar
よかったよかった
Avatar
クロージャにもSendableいるのではと思ったら、ちゃんとそういう扱いになってた
Avatar
for (int i = 0; i < 10; i++); { System.out.println("繰り返す"); } というコードはコンパイルエラーになるべき。毎回みんなで悩んでいる。 プロJavaではこういう悲劇が起きないよう、IntelliJ IDEAのテンプレートを使うよう念を押している
7:40 AM
これCやJavaにある罠だけど構文設計が悪いよね Swiftにも似たような罠ってあるかな
7:40 AM
ブレースを取らないforが許されないし、単発スコープにもdoキーワードが必要だから、とりあえず全く同じ形の問題は起きないが。
Avatar
yutailang0119 11/14/2023 7:42 AM
Taskの中のtryが自動ではcatchされないのとか?
Avatar
Kishikawa Katsumi 11/14/2023 7:42 AM
あー、セミコロンでfor文が終わってるのか。
Avatar
Avatar
yutailang0119
Taskの中のtryが自動ではcatchされないのとか?
投げっぱなしになってエラーハンドリングを忘れちゃうって意味ですかね?
Avatar
Avatar
Kishikawa Katsumi
あー、セミコロンでfor文が終わってるのか。
そうwセミコロンを見逃すとハマる。
Avatar
Text("Swift!") .bold() // OK
Avatar
Avatar
omochimetaru
投げっぱなしになってエラーハンドリングを忘れちゃうって意味ですかね?
yutailang0119 11/14/2023 7:53 AM
それです、罠というと罠で挙げたけど、Javaの例に比べるとすぐ判別できるね (edited)
Avatar
Text("Swift!") bold() // OK!ただし実行時エラー
7:54 AM
これはSwiftUIかつresultBuilderだから特殊かも
Avatar
Avatar
yutailang0119
それです、罠というと罠で挙げたけど、Javaの例に比べるとすぐ判別できるね (edited)
非同期のエラー見逃すは確かにしばらく気付けないし問題を深くするし、気軽にそれ踏めるのは嫌だな
Avatar
Avatar
Iceman
Text("Swift!") bold() // OK!ただし実行時エラー
記号一個の差でぶっ壊れてるの似てますね てか bold() 単体はなんで通るんだ
Avatar
bold()some View に生えてるせいでself.bold()になってる
Avatar
なるほどwww 良いねそれ 芸術点高い
Avatar
これは実際にハマったので・・・
Avatar
メソッドチェーンするつもりがドットが消えちゃってて、でも self. の省略形としてコンパイル通っちゃうは、一般性があるな
7:57 AM
API設計によるけどSwiftUIだとそこら中で踏めますね。 (edited)
Avatar
そのままだとインデントおかしいからformatしたあとのコードレビューは引っ掛かりそう
Avatar
元ネタはフォーマッターでは気付けないのがえぐいな
Avatar
Kishikawa Katsumi 11/14/2023 9:19 AM
Formatterで防ぐっていうのがOKならLinterで防げそう。
Avatar
元ネタもリンターで行ける範囲ですね 無意味なループになるので
Avatar
;の後ろに改行が無いのでもアウトに出来ますね (edited)
Avatar
ああ、それが良さそう。
Avatar
Kishikawa Katsumi 11/14/2023 10:46 AM
JavaじゃなくてScalaを使うって手もあるな。
Avatar
Shape にも加減算(まあ厳密には集合の演算ブール演算って今知った)ができることに最近気づいたw https://twitter.com/lovee/status/1729881642591006937 (edited)
Avatar
ベクター画像のブール演算ですね https://helpx.adobe.com/jp/xd/help/combine-mask-objects.html SwiftUIでもできるんですね
Avatar
お、ブール演算って言うんですね
3:21 PM
そうそうできるんですよ、しかも戻り値もShape適合だから、色々使いやすいです
iine 1
Avatar
最近iOS16でAPI生えました
例えば上下それぞれ違うradiusにしたい
(edited)
t_oltsu 4
t_kami 1
t_tsuyoi 2
👀 2
Avatar
radiusにinfinity指定できるの面白いですね。
2:20 AM
これ CGFloat の生の +inf か。へえ〜
Avatar
infinity、UIKitだとレモンみたいな形になってた気がするのでSwiftUIが賢くやってそうな気がする
Avatar
指定した値を縦幅と横幅の小さい方(の半分)でキャップしてそうですね。 (edited)
2:39 AM
それならinfinityが指定されても特殊な分岐無しで動くし。 (edited)
Avatar
@swift-5.9.2 func f() async {} async let a = f() await a
Avatar
Avatar
Iceman
@swift-5.9.2 func f() async {} async let a = f() await a
<stdin>:3:11: warning: constant 'a' inferred to have type '()', which may be unexpected async let a = f() ^ <stdin>:3:11: note: add an explicit type annotation to silence this warning async let a = f() ^ : ()
Avatar
この警告、async letのときはいらないですよね
Avatar
なくしてほしいですね。
Avatar
@swift-5.9.2 func f() { defer { Task { print("defer:", value) } } let value = 42 } f()
Avatar
Avatar
Iceman
@swift-5.9.2 func f() { defer { Task { print("defer:", value) } } let value = 42 } f()
no output
Avatar
@swift-5.9.2 func `do`(_ c: () -> ()) { c() } func f() { defer { `do` { print("defer:", value) } } let value = 42 } f()
Avatar
Avatar
Iceman
@swift-5.9.2 func `do`(_ c: () -> ()) { c() } func f() { defer { `do` { print("defer:", value) } } let value = 42 } f()
defer: 42
Avatar
普通のdeferは未宣言ローカル変数をキャプチャできないけど、クロージャをかますと何故かうしろの変数を参照できる
‼️ 7
Avatar
@swift-5.9.2 func foo( arg0: String = "\(#function)", arg1: String = #function ) { print(arg0) print(arg1) } func main() { foo() } main()
9:16 AM
返事がない
9:16 AM
foo(arg0:arg1:) main() 結果はこうなるんですが、
9:16 AM
#functionって引数ラベルに書いても直接使わなかった場合は呼び出し側の値が使われないことを初めて知りました
Avatar
えー、変なの・・・
Avatar
Avatar
Iceman
@swift-5.9.2 func foo( arg0: String = "\(#function)", arg1: String = #function ) { print(arg0) print(arg1) } func main() { foo() } main()
foo(arg0:arg1:) main()
Avatar
Miwa / Ensan 2/1/2024 2:23 PM
以前info: (String, Int) = (#file, #line)みたいなことをやろうとして同じのを踏みました。不具合かと思っていたら、SE-0422の説明で明示的に書かれていて仕様だったのか……となりました。
Avatar
omochimetaru 2/1/2024 5:19 PM
ほ、ほんとだ・・・
Avatar
Key Path Expressions as FunctionsのProposalに載ってるコードの例がコンパイル通らない・・・ [1, nil, 3, nil, 5].compactMap(\.self) self-keypath-as-function.swift:1:32: error: cannot convert value of type 'WritableKeyPath<_, _>' to expected argument type '(Int?) throws -> ElementOfResult?' [1, nil, 3, nil, 5].compactMap(\.self) ^ self-keypath-as-function.swift:1:21: error: generic parameter 'ElementOfResult' could not be inferred [1, nil, 3, nil, 5].compactMap(\.self) ^ Swift.Sequence:2:28: note: in call to function 'compactMap' @inlinable public func compactMap<ElementOfResult>(_ transform: (Self.Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult] ^ self-keypath-as-function.swift:1:32: error: cannot infer key path type from context; consider explicitly specifying a root type [1, nil, 3, nil, 5].compactMap(\.self) ^ <#Root#> 推論に問題がありそう?
7:55 AM
最初、\.self が対応してないのかと思ったけど、↓だと通る。 let values: [Int] = [2, 3, 5] let convert: (Int) -> Int = \.self let result: [Int] = values.map(convert) print(result)
Avatar
\.selfは実装当初からできないんですよね
7:59 AM
どっかに記述があった気がするような
8:01 AM
8:02 AM
@swift-5.10.1 print([1, nil, 3, nil, 5].compactMap(\.self))
Avatar
Avatar
Iceman
@swift-5.10.1 print([1, nil, 3, nil, 5].compactMap(\.self))
swift510 BOT 2/14/2024 8:02 AM
exit status: 1 with <stdin>:1:38: error: cannot convert value of type 'WritableKeyPath<_, _>' to expected argument type '(Int?) throws -> ElementOfResult?' print([1, nil, 3, nil, 5].compactMap(\.self)) ^ <stdin>:1:27: error: generic parameter 'ElementOfResult' could not be inferred print([1, nil, 3, nil, 5].compactMap(\.self)) ^ Swift.Sequence:2:28: note: in call to function 'compactMap' @inlinable public func compactMap<ElementOfResult>(_ transform: (Self.Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult] ^ <stdin>:1:38: error: cannot infer key path type from context; consider explicitly specifying a root type print([1, nil, 3, nil, 5].compactMap(\.self)) ^ <#Root#>
Avatar
Avatar
Iceman
\.selfは実装当初からできないんですよね
これはできてるんで、Key Path Expressions as Functionsとは別の問題がありそうに思います。 let convert: (Int) -> Int = \.self
Avatar
omochimetaru 2/14/2024 8:37 AM
最新の SE-0416 (Subtyping for keypath literals as functions) の話してるのかと思ったら、SE-0249 (Key Path Expressions as Functions) の話か (edited)
8:38 AM
ほんとだ。そのまんま
8:39 AM
https://github.com/apple/swift/issues/54861 2020年3月から起票されてたw (edited)
Previous ID SR-12422 Radar rdar://problem/62201019 Original Reporter pacheco (JIRA User) Type Bug Attachment: Download Environment Xcode 11.4 (11E146) macOS 10.15.3 (19D76) Additional Detail from J...
Avatar
Avatar
Iceman
https://github.com/apple/swift/issues/55343#issuecomment-1846305300 修正されたことになってそう?
12月のコメントだから5.10ブランチには入ってなさそう
✨ 1
8:40 AM
@swift-main print([1, nil, 3, nil, 5].compactMap(\.self))
Avatar
Avatar
Yuta Saito
@swift-main print([1, nil, 3, nil, 5].compactMap(\.self))
swiftNightly BOT 2/14/2024 8:40 AM
[1, 3, 5]
Avatar
omochimetaru 2/14/2024 8:41 AM
#54861 はトラッキングが漏れててcloseされてないだけで #55343 で治ったんだな
Avatar
#54861はcloseしておきました
✨ 2
Avatar
おお
Avatar
おお、直ってるんですね
Avatar
omochimetaru 2/16/2024 2:17 AM
Swift 5.10 incorporates the remaining language proposals necessary for accomplishing full data isolation under strict concurrency checking. It does so conservatively, and the set of proposals under active development now in Swift evolution aim to lift some of the limitations for patterns that are diagnosed in Swift 5.10, but can be proven safe u...
2:18 AM
Hollyさんによれば5.10の次は6になりそうらしい
As such, the next release of Swift will be Swift 6.
2:18 AM
Let's talk about data race safety in Swift 6! The Swift 6 language mode is opt-in; you can continue to use Swift 5 mode with the Swift 6 compiler. You can incrementally refine your code to take advantage of full data isolation at your own pace, module by module.
👀 3
2:19 AM
Swift 6 コンパイラでも、Swift 5 互換モードでビルドできるから対応はゆっくり進めることができるけど、警告は出まくるのかな?
2:21 AM
それとも5互換モードだと5.10と同じで、5互換モードにおいてfeature flagを付けながらマイグレーションするのかな
Avatar
Hollyさんによれば5.10の次は6になりそうらしい
そうっぽいですね。 https://github.com/apple/swift/pull/71707
The Swift 6.0 release process will be announced soon. The main branch will be used to track Swift 6.0 until release/6.0 branch has been created.
Avatar
https://github.com/ml-explore/mlx-swift/ Apple SiliconでMLをほげほげするやつが出ました
Swift API for MLX. Contribute to ml-explore/mlx-swift development by creating an account on GitHub.
👏🏻 3
11:43 PM
Swift Foundationからブログも出てる https://www.swift.org/blog/mlx-swift/
The Swift programming language has a lot of potential to be used for machine learning research because it combines the ease of use and high-level syntax of a language like Python with the speed of a compiled language like C++.
Avatar
機械学習をまるっとSwiftでやるためのライブラリなんですね
11:50 PM
これ自体はcxxもpythonもあるのかあ
11:51 PM
pytorchとかtensorflowとかめっちゃたくさんあるけど流行るのか? (edited)
11:55 PM
SwiftはMLに向いてるとは思うけど、AppleSiliconサポートが強いって理由があってもMLピーポーが乗り換えるほどの理由にならなそう
11:58 PM
A notable difference from these frameworks and MLX is the unified memory model. Arrays in MLX live in shared memory. Operations on MLX arrays can be performed on any of the supported device types without performing data copies.
なるほど
Avatar
ざっとこれ見てたんですが、 https://ml-explore.github.io/mlx-swift/MLX/documentation/mlx/troubleshooting
If you receive a message like this: error: Internal inconsistency error: received multiple target ended messages for target ID '5' or received target ended message but did not receive corresponding target started message, while retrieving parent activity in taskStarted message. There are a few approaches that have been observed to work around the issue: - wait a few seconds and try building again - quit and restart xcode - clean the build folder and rebuild - use Xcode 15.3 beta 2 or later
最近のXcodeの壊れに対するプラクティスが書かれてたw
😂 2
Avatar
omochimetaru 2/22/2024 5:10 PM
15.3betaだとリビルド通るわかる
Avatar
ちょっと試してみてサンプルのプロジェクトを元にmacOSアプリ(Catalyst)上でLlamaを動かせるようになった
12:40 PM
iOSでもやってみたい
Avatar
識者の人々がLLMのモデルをMLX用に変換してHugging Faceに集めてたりしている。https://huggingface.co/mlx-community エンジニアがローカルで実行するだけならPythonで十分でSwiftである必要性はないけど、iOS/macOSアプリにしていくのだったらSwiftから扱えるのは便利(?)。
2:32 PM
On-device LLM界隈
2:33 PM
Hugging Faceの中の人もswift-transformersというLLMをCore ML経由で実行するためのライブラリは公開してて盛り上がっている https://huggingface.co/blog/swift-coreml-llm https://github.com/huggingface/swift-transformers
Avatar
omochimetaru 2/23/2024 2:34 PM
なるほど
2:35 PM
「スマホでの実行」の需要があるのか
Avatar
GitHub Copilotみたいなのもon deviceで実行できたらソースコードがどこにも学習されなくて済むしこれから需要は増えそう
Avatar
omochimetaru 2/23/2024 2:36 PM
サービス運営の観点なら実行コストを避けられるし嬉しいのかしら
2:36 PM
あー原理的にプライバシー保護のメリットもありますね
Avatar
運用面でも計算コスト分散できて良いですね
Avatar
omochimetaru 2/23/2024 2:40 PM
Swiftでの機械学習、S4TFは解散しちゃったけど、今度は盛り上がるといいなー
t_sorena 1
Avatar
あとはこういうAIアシスタントのデバイスをオフラインで動くようにするとか https://www.rabbit.tech/
Avatar
omochimetaru 2/23/2024 2:41 PM
Python interopは当時の成果が残ってて、それも役に立ちそうだし。 (edited)
2:43 PM
今回はcxx interopも活用されてるな
Avatar
Avatar
ainame
あとはこういうAIアシスタントのデバイスをオフラインで動くようにするとか https://www.rabbit.tech/
omochimetaru 2/23/2024 2:43 PM
なんだこれ。かわいいですね
2:43 PM
そういうのもあるのか
2:49 PM
S4TF teamの人たちは別のスタートアップの人とまだ活動しているらしい
2:50 PM
Avatar
omochimetaru 2/23/2024 2:51 PM
Swiftのネイティブ自動微分の実装は時々保守されてプルリク作られてて気になってました
Avatar
わかる
2:55 PM
ビデオにChris Lattner出てきたw
Avatar
omochimetaru 2/23/2024 3:29 PM
👀
👀 1
Avatar
ベンチマークの内容わからないし最適化してないコードと比較してないか?とかRedditで言われてたw
🙂 1
Avatar
omochimetaru 2/23/2024 3:31 PM
Pythonだと限界があって製品開発に使うコードと統合するべき、って主張はよくわかる
3:31 PM
逆にPythonを進化させてそれに寄せていくのがmojo言語のアプローチだと思う (edited)
🔥 2
4:35 PM
Discord serverも出来た
4:36 PM
Experimenting with Apple MLX by creating a macOS Local LLM Chat SwiftUI App. Chat with local LLM Model without internet connection utilizing native performance and efficiency of Apple Silicon Unified GPU & CPU architecture! #LLMs #iosdev https://t.co/LXAnv1HHKZ
Avatar
最近ツールチェーンが更新されていないのは何かの準備中なのでしょうか?(わかる方がいらっしゃれば) https://github.com/apple/swift/tags
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
1週間くらいCIが壊れ続けており…
t_naruhodo 1
3:33 PM
https://ci.swift.org のSwift Package - XXジョブがOSSツールチェイン作るやつです (edited)
Avatar
omochimetaru 3/11/2024 2:13 AM
protocol P { nonisolated func foo() func bar() } struct S: P { func foo() {} func bar() {} } actor A: P { // NG // func foo() {} nonisolated func foo() {} // NG // func bar() {} nonisolated func bar() {} }
2:13 AM
protocolにつける nonisolated ってなんか意味あるんか? 付いてても付いてなくても特に変わらない気が (edited)
Avatar
P が Actor protocol を継承している場合は違いが出るみたいです.
Avatar
omochimetaru 3/11/2024 2:55 AM
2:57 AM
protocol P: Actor { nonisolated func foo() func bar() } actor A: P { // NG // func foo() {} nonisolated func foo() {} // OK func bar() {} }
2:57 AM
P: AnyActor だと変化なし P: Actor で変化した
2:58 AM
nonisolatedはnonisolatedでしか準拠できない isolatedは nonisolatedでもisolatedでも準拠できた。
3:03 AM
なのでサブタイピングは nonisolated func < isolated func か。
3:03 AM
で、Actorプロトコルではない場合は、無印funcは暗黙にnonisolated funcと考えるのが良いんだな。 (edited)
Avatar
omochimetaru 3/11/2024 7:32 AM
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
7:32 AM
InferSendableFromCaptures が実装されているのが 6.0 からになっていて
7:34 AM
Upcoming Feature Flag って、6.0からデフォルトになる挙動を6.0以前で先に有効にして対応するものだから、6.0から導入されても意味ないような気がしたけど、 6.0コンパイラにおいて、5互換モードを有効にしている場合においては、 デフォルト無効、フラグを指定すると有効 になるから意味があるね。
👍🏻 1
🙌 1
Avatar
Swiftの高階関数等で引数を省略する記法の名前をご存じの方はいらっしゃいますか…? [0, 1, 2, 3, 4, 5].reduce(0, +) // { $0 + $1 }ではなく+だけでいい 人に説明するとき困ってしまって… (edited)
Avatar
trailing closure だったかしら
2:29 AM
じゃないw
t_desune 1
2:30 AM
そもそもswiftのoperatorが、関数による実装になっているんで
2:30 AM
ちょっと難しいですね、名前付いてるんだろうか
Avatar
operatorが、関数による実装
あー、そうですねその話も混ざっててややこしい… operator云々を取っ払った例だとこういう感じので… func say(_ text: String) { print(text) } ["Hello", "こんにちは"].forEach(say)
Avatar
それだと普通に、「関数が第一級オブジェクトである」みたいな言い方をする話題っぽいですね
2:35 AM
他のオブジェクト同様、変数や引数に関数を渡すことの出来ることを指します。
2:37 AM
「operatorはstatic関数による実装である」は、それ以外の平易な言い方は思い付かないです
Avatar
第一級関数?
Avatar
first class object
Avatar
第一級関数は概念としてはもっと広いですね。ただの高階関数(高階メソッド)な気がします。
Avatar
確かに、そうか
Avatar
「関数を引数に渡すときの(渡した関数に対する)引数省略記法」の名前が知りたいみたいな感じです! (関数が第一級オブジェクトであることは理解しております) (edited)
Avatar
.forEach(say).reduce(0, +) が高階関数の基本的な使い方で、クロージャを渡すのが特殊例で、Trailing Closureはさらに特殊な例だと思います。
Avatar
関数に関数を渡すのは高階関数でよさそう
2:42 AM
高階関数がシンプルに使えるようになるために、第一級オブジェクトであること、operatorがstatic関数であることが役に立っている、という関係性で良いと思います
Avatar
// 関数を引数に渡せる関数を高階関数と言います。 [0, 1, 2, 3, 4, 5].reduce(0, add) // Swiftでは演算子も関数なので演算子も渡せます。 [0, 1, 2, 3, 4, 5].reduce(0, +) // その場でクロージャを宣言して渡すこともできます。 [0, 1, 2, 3, 4, 5].reduce(0, {$0 + $1}) // 末尾のクロージャ引数は()の外に出すことができ、Trailing Closureと呼ばれます。 [0, 1, 2, 3, 4, 5].reduce(0) {$0 + $1} という順序の話だと思うので、最初の方の例には名前は付いていない(標準的な高階関数の例)なんじゃないでしょうか。 (edited)
Avatar
なるほど高階関数においてむしろ省略というか関数名 + だけ記述するのが普通で、 クロージャーで { $0 + $1 } とか書くのがイレギュラーパターンだったってことなんですね。 (edited)
Avatar
そうだと思います!実用的にはクロージャを渡すことが多いとは思いますが。
t_naruhodo 2
Avatar
omochimetaru 3/13/2024 2:51 AM
クロージャが一般的になりすぎて、一番基本的な形が特殊に見えるのが面白いですね
2:54 AM
クロージャが無い時代のC言語とかだと関数を名前で指定して他の関数に渡す書き方がよくあった (edited)
Avatar
おっしゃるとおりクロージャで書くのが殆どで基本形がわかっていませんでした。 引数として渡さなければいけない関数と同じ型の関数は普段あんまりなくて、クロージャでいい感じに変形するのがほとんどという…
Avatar
以下コードがエラーになる理由がよく分からないです。 どう見てもEncodableに準拠しているように見えるのですが... struct Foo: Encodable { // Type 'Foo' does not conform to protocol 'Encodable' let value: Encodable } encodeを実装したら解消しましたが、これも理由が説明できず。 やりたいことは実現でましたがモヤモヤしています。 struct Foo: Encodable { let value: Encodable enum CodingKeys: String, CodingKey { case value } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(value, forKey: .value) } } let data = try! JSONEncoder().encode([Foo(value: 10), Foo(value: "bar")]) let json = String(data: data, encoding: .utf8)! // [{"value":10},{"value":"bar"}]
Avatar
自動的なEncodableの適合はプロパティがすべてEncodableに適合しているときに行われること、 プロトコル型はそのプロトコル自身に適合しない(self-conformanceしない)ことが組み合わさって起きてそう…? https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types https://heart-of-swift.github.io/protocol-oriented-programming/protocols-as-types-or-constraints.html (edited)
Make your data types encodable and decodable for compatibility with external representations such as JSON.
“Heart of Swift” は、 Swift の Heart である Value Semantics と Protocol-oriented Programming を軸に、 Swift という言語のコンセプトを説明するオンライン書籍です。
💯 1
✨ 1
Avatar
protocolはそれ自身に準拠しないんですよ
4:26 AM
だからEncodableはEncodableではありません
Avatar
EncodableがEncodableに準拠していないのに、引数がEncodableに準拠していることを求める関数encode(try container.encode(value, forKey: .value))に渡せるのって仕様的に整合性が取れていないように思えるのですが、これは整合性が取れているのでしょうか?
5:54 AM
Swift 5.7から、existentialが暗黙にopenできるようになったので
5:56 AM
any Encodableを、<T: Encodable>の引数として渡すことができるようになったからです
Avatar
EncodableはEncodableではありません
Swiftは哲学的ですね。笑 でも皆さんのおかげで理解が深まりました。ありがとうございます! any Encodableを <T: Encodable>に渡せるのは仕様的にまずそうに見えますが、なぜ問題ないのかは自分で調べてみます。
(edited)
Avatar
それが哲学的になってしまうことを問題視して、生まれたのがany Encodable記法ですね Swift6からはanyをつけないといけません
10:01 AM
anyがついてれば、別の概念だとわかりやすい。
Avatar
Avatar
omochimetaru
それが哲学的になってしまうことを問題視して、生まれたのがany Encodable記法ですね Swift6からはanyをつけないといけません
あれ,でも any をつけないといけない feature flag は Swift 6 でデフォルト有効になる flag から Swift 7 でデフォルト有効になる flag へと先送りにされてますよ. https://github.com/apple/swift/pull/70123 (edited)
4:09 PM
2 週間前からは書く場所も隔離されてもっと明確に Swift 7 向けの flag として強調されてます. https://github.com/apple/swift/blob/315a763c2891965df315cb6039db512686eedab0/include/swift/Basic/Features.def#L190
Avatar
omochimetaru 3/13/2024 4:26 PM
あれ、そうなんですね、互換モードじゃないSwift6でも無効なのか
Avatar
Avatar
trickart
Swiftの高階関数等で引数を省略する記法の名前をご存じの方はいらっしゃいますか…? [0, 1, 2, 3, 4, 5].reduce(0, +) // { $0 + $1 }ではなく+だけでいい 人に説明するとき困ってしまって… (edited)
Swift関連で使われている例はあまりないですが、Point-Free Style と呼ぶみたいです
t_naruhodo 1
11:54 AM
WebKitにSwift C++ Interopが使われるらしい
11:55 AM
11:55 AM
元々 Swiftで書きつつ @objc つけて、 ObjC として WebKit 側にエクスポートしているコードを
11:55 AM
普通のSwiftクラスにしてる
Avatar
おークロスプラットフォーム性が高まった
Avatar
あ、そうか、ObjCを消せるってことか
11:56 AM
Swift C++ Interopって、SwiftアプリケーションがC++ライブラリを使うものだと思ってたから
11:57 AM
C++のシステムに対してSwiftのインターフェースをつなぐために使う事例を先に見ることになって興味深い
Avatar
両方向できるのとても良い
Avatar
Appleが最近Swiftだけで使えるAPIを出したりしてたけど
11:58 AM
C++コードベースからそれを呼びたいっていうユースケースが実はちょこちょこあるのかもねえ
Avatar
GNOME の標準ブラウザとか Haiku の標準ブラウザも WebKit だったはずなので,これを理由に今後 Linux の各ディストリビューションのパッケージマネージャに Swift が収録されたり,Haiku サポートが復活したりするのもあり得そうですね. (Swift 使ってる部分は元からなのでそうでもなさそうですね) (edited)
Avatar
omochimetaru 3/22/2024 3:16 PM
見つけたー dependenciesのswift-snapshot-testingの機能使ってファイルを上書きしてるみたい https://t.co/nU77Lg8LiC
3:16 PM
3:17 PM
lit じゃん。この手があったか。
Avatar
omochimetaru 3/30/2024 1:28 PM
@swift-main func foo(a: Any, b: AnyHashable) { // Intが出てくる print(type(of: a)) // Intにキャストできる print(a as? Int) // AnyHashableにしか見えない print(type(of: b)) // Intにキャストできる(なんで?) print(b as? Int) // AnyHashable.base は Any型で、Intが出てくる // これを使えばAnyとの挙動の違いを避けられる print(type(of: b.base)) // キャストできる print(b.base as? Int) } foo(a: 1, b: 1) Int Optional(1) AnyHashable Optional(1) Int Optional(1) Program ended with exit code: 0 (edited)
Avatar
AnyHashableはスペシャルすぎて何がなんだかわからない
Avatar
omochimetaru 3/30/2024 1:30 PM
bot反応ないから出力をコピペしておこう
Avatar
Avatar
Yuta Saito
AnyHashableはスペシャルすぎて何がなんだかわからない
omochimetaru 3/30/2024 1:31 PM
typeofの挙動が残念なことと、それを解決する .base 生えてるの知らなかったわ、今両方知った
1:32 PM
まあ Anyany protocol<> だから、一級のerasureで、
1:32 PM
AnyHashableはライブラリのstructだから
Avatar
まあ AnyHashable 自体はstructだからなぁ
Avatar
omochimetaru 3/30/2024 1:32 PM
typeofがこうなるのはまあいい
1:32 PM
変なのは as の挙動だな
Avatar
キャストできる分には良いんじゃないですか
Avatar
omochimetaru 3/30/2024 1:33 PM
typeofとasがズレてるのが変というのと、asの特殊な挙動は普通ユーザ実装できない
1:33 PM
_ObjectiveCBrideable とかはあるけど
Avatar
Int -> AnyHashableのキャストがありえるのであれば AnyHashable as? Intがあっても不思議じゃない
Avatar
omochimetaru 3/30/2024 1:33 PM
あーそうか、アップキャスト側も特別扱いがあるか。
1:33 PM
(そっちがあるのも変だけども
Avatar
Objective-C Interopのための妥協だったんですかねぇ
Avatar
omochimetaru 3/30/2024 1:35 PM
まあ確かに。これも結局ObjCのために必要な部分か。
Avatar
Existential Typeへのself conformingが開放されるとAnyHashableは用済みになるのかなー
Avatar
omochimetaru 3/30/2024 1:39 PM
うーんどうなんだろう
1:39 PM
self conformingはあくまでprotocol methodの実装が差し替えられるだけだけど
1:39 PM
AnyHashableの挙動を実装するためには、AnyHashableを構築するタイミングで色々前準備してるんじゃないか
1:40 PM
そうじゃないと効率が悪そう
1:40 PM
initのこの辺
Avatar
うーん色々やってるし無理筋っぽい
Avatar
omochimetaru 3/30/2024 1:43 PM
違う型なら not equal とするシンプルな any Hashable なら self conformance で作れそうだけど
1:43 PM
そうすると any HashableAnyHashable の使い分け問題が出てくるんだよな
1:44 PM
NSDictionary の interop があるから後者をdeprecatedにもできないし・・・
Avatar
厳しいですな
Avatar
omochimetaru 3/31/2024 1:51 PM
JavaScriptKitを触るコードをmacでテストするために、 JavaScriptKitとソースコード互換なJavaScriptKitMockを作る事にした
1:51 PM
で、本来はブラウザのDOMとして動いてるJSのオブジェクトがJavaScriptKit経由で触れるはずだが
1:52 PM
そのようなブラウザのDOMとして動いてるつもりの普通のSwiftの実装をJavaScriptKit経由でJavaScriptだと思って触るためのブリッジインターフェースを作る事になった
Avatar
non-Wasmターゲット向けのフックポイントをJavaScriptKitに持たせれば楽になったりしますか?
Avatar
omochimetaru 3/31/2024 2:02 PM
理屈としてはそうなんだけど、 それが _CJavaScriptKit_set_prop とかのインターフェースの場合、 C API の RawJSValue とか JavaScriptPayload1 とかに対応しないといけないから、残念ながらめんどくさそう DOMの描画部分で必要な機能だけでいいから手抜きでMockを書いちゃった方が早そうだ (edited)
Avatar
いやぁそうなんですよねー
😀 1
Avatar
omochimetaru 3/31/2024 2:05 PM
あと、JS World側をSwiftで作ろうとすると、C APIの境界でretain chainが途切れるからその辺が多分厳しい
Avatar
昔一回考えたんですが、 https://github.com/swiftwasm/JavaScriptKit/pull/148 やっぱり下側で頑張るより上のレイヤで差し替えてもらうほうが良いという結論になった
Avatar
omochimetaru 3/31/2024 2:08 PM
おお。頑張った形跡だ・・ やるんだったら RawJSValue じゃなくてもうちょっと上のところでSwiftの型のインターフェースで差し込めるようになってる必要があると思う (edited)
2:09 PM
2:09 PM
jf1さんのこの実装とは別でkatei式がその後にあったのかな
Avatar
あったのかな…?何も覚えてない
Avatar
omochimetaru 3/31/2024 2:11 PM
Avatar
omochimetaru 3/31/2024 2:21 PM
おお
2:22 PM
ブリッジインターフェースのプロトコルにブリッジする型をassociateさせてるから
2:22 PM
WASMなら従来通りC仕様にしつつ、Swiftだけならリッチな型で繋ぐこともできる
2:22 PM
これはいいね。
2:23 PM
飛べないdiscord linkだ
Avatar
SwiftWasm Discordサーバに参加してないと見れないのか
Avatar
omochimetaru 3/31/2024 2:24 PM
踏むとこうなる
Avatar
難しい
Avatar
omochimetaru 3/31/2024 2:24 PM
これかな
Avatar
それっすね
Avatar
omochimetaru 3/31/2024 2:25 PM
そのうち入るか
Avatar
omochimetaru 3/31/2024 2:41 PM
笑える
2:43 PM
このthunk、セレクターからジェネリックに作れそうだな
Avatar
仰々しいなw
Avatar
omochimetaru 3/31/2024 2:44 PM
自分をJSだと思い込んでいるSwiftのコードです
Avatar
omochimetaru 3/31/2024 4:07 PM
ここ #wasm じゃなかったわ
12:43 PM
[Any]Any... に渡すことができるけど、 [Int]Int... に渡すことができない。
12:43 PM
なんだこれ?
Avatar
[Any] -> Anyへのキャストはあるけど[Int] -> Intは無いって話かな
Avatar
omochimetaru 4/1/2024 12:45 PM
違うんすよ
12:45 PM
anys: [Any] の要素が、可変長引数に一個ずつ展開される
😦 1
12:46 PM
可変長引数関数に対して、配列を1個だけ渡すんじゃなくて 中身がsplatされている (edited)
Avatar
おーほんとだ
Avatar
omochimetaru 4/1/2024 12:46 PM
takeVariadicAny(ints) // (offset: 0, element: [4, 5, 6])
12:47 PM
[Int] の場合は、1個の配列として渡る。
Avatar
不思議現象
Avatar
omochimetaru 4/1/2024 12:47 PM
takeVariadicAny(ints as [Any]) (offset: 0, element: 4) (offset: 1, element: 5) (offset: 2, element: 6)
12:47 PM
これは当然こうなる
12:48 PM
まだまだ知らない暗黙の型変換があるンゴね・・・
Avatar
おお、不思議だ
Avatar
omochimetaru 4/9/2024 12:34 PM
package visibility便利だな・・・
12:34 PM
あると結構使いたくなってしまう。
👀 2
Avatar
omochimetaru 4/12/2024 1:26 AM
I recently visited the PL group at Cornell to give a talk about our formal model and implementation of generics in Swift. While the talk was not recorded, the slides are available online: https://pl.cs.cornell.edu/pldg/slava-pestov.pdf. The talk was meant for a mathematically-inclined audience unfamiliar with Swift, and the slides might be hard...
👀 1
1:27 AM
Slavaがコーネル大学でSwiftのジェネリクスの形式的理論と実装について講義をした時の資料らしい @shiz さんに教えてもらいました
12:03 PM
property wrapperって、default init を持ってる場合、whereを無視してそれがマッチして、 他のinitで明示的に初期化することができなくなるの?
12:09 PM
12:10 PM
extensionに分けたら回避された
12:10 PM
where付きメンバとextensionってlookup rule同じじゃないのか・・・??
Avatar
omochimetaru 4/19/2024 7:04 AM
FullTypedThrowsが使いたいんだけど
7:04 AM
Xcode15.4 beta では使えなさそうだった
7:04 AM
2024-04-02 snapshotでは使えた
7:07 AM
swift6.0 snapshotはどうなんだろう
7:09 AM
This feature is not fully implemented, and cannot be considered to be "upcoming" until it is.
7:09 AM
6.0 release process では 3/15 がブランチカットで これが3/2だから
7:10 AM
6.0系ではexperimentalで使えるのかな。
7:13 AM
あ〜使えそう とりあえずsyntaxは。
👀 1
7:15 AM
switch-caseも使えるぞ。
Avatar
omochimetaru 4/19/2024 8:07 AM
swiftpmで言語モードを 5 に下げるのって swiftLanguageVersions: [.v5] でいいんですかね
8:08 AM
そしてswift5.10の .enableUpcomingFeature("InternalImportsByDefault") が全く機能していない気がする
8:08 AM
.enableExperimentalFeature("AccessLevelOnImport"), .enableUpcomingFeature("InternalImportsByDefault") これセットで使ってたけど多分動作していなくて
8:08 AM
6.0使ったら internal import に起因するエラーがめっちゃたくさん出てきた
8:09 AM
し、6.0で .v5 にしてもその挙動変わらなくてエラーがたくさん出るぞ
8:12 AM
あれ?Xcode15.4 betaでもしかして対応されたか? (edited)
Avatar
omochimetaru 4/19/2024 8:24 AM
Xcode15.3 でも同じだ どこかに public import があるときは揃えてくれっていうエラーが出るんですね
8:28 AM
Swift6.0だと「揃えてくれエラー」は出ないな・・・
8:29 AM
このあたりの挙動、5 to 6 のマイグレーションが全然うまくいかないんじゃないか・・・?
Avatar
Avatar
omochimetaru
swiftpmで言語モードを 5 に下げるのって swiftLanguageVersions: [.v5] でいいんですかね
omochimetaru 4/19/2024 8:36 AM
これはうまくいってそうで -swift-version 5 が設定されているけど、importの挙動が切り替わっていない
Avatar
omochimetaru 4/19/2024 8:43 AM
本当はSwift5.10の前方互換機能のバグだけど、ほっといてもSwift6を積んだXcodeのベータが出てきたタイミングで、後方互換モードのバグとしてみんな踏むから、そこから直されたらなんとかなるか
Avatar
Avatar
omochimetaru
そしてswift5.10の .enableUpcomingFeature("InternalImportsByDefault") が全く機能していない気がする
Swift 5.10 には InternalImportsByDefault は ship されてないですよ. https://github.com/apple/swift/blob/release/5.10/include/swift/Basic/Features.def
Avatar
えええ
11:02 AM
5.10の次が6.0なのに、6.0に事前対応するためのfeature flagが5.10に入ってなかったら、意味ないです
Avatar
Swift 6.0 のツールチェーンを使って Swift 5 互換モードでコンパイルするとき向けのフラグなのかなと思ってます. こういうのが入ってきたら存在しないフラグを指定してしまった時にわかりやすくなるんですけどねー https://github.com/apple/swift/pull/72787 https://github.com/apple/swift/pull/72483 (edited)
Avatar
なるほどなるほど
11:08 AM
下位互換モードで使う上位互換機能だ
Avatar
ちなみに InternalImportsByDefault は Language Steering Group で方針転換があって Swift 6 じゃなくて Swift 7 に見送られたみたいです. https://github.com/apple/swift/pull/73149
The language steering group has decided to revert their previous decision and remove this feature from Swift 6. Scope: Bare import statements in Swift 6. Risk: This will be source breaking for earl...
Avatar
omochimetaru 4/20/2024 5:07 PM
お。そうなんですね。じゃあこの機能のことは忘れていいか
Avatar
omochimetaru 4/22/2024 1:33 AM
お、6.0コンパイラでも、5モードにして、AccessLevelOnImportとInternalImportsByDefaultを外したら、コンパイルできた。
1:33 AM
しばらく忘れよう。
Avatar
omochimetaru 4/22/2024 1:46 AM
ほとんどのswiftpmライブラリで swiftLanguageVersions: [.v5] が指定されていないけど
1:47 AM
これだと6コンパイラ使ったらいきなり色々変わってダメになる事が多いような?
❗ 2
👀 1
Avatar
omochimetaru 4/24/2024 8:16 AM
// swift-tools-version: によって変わったりするのかなあ?
Avatar
すごいざっくりとした質問なんですけど、 みなさんSwift6に向けた準備ってどのくらいされていますか?(業務、個人どちらでも) もしくはいつぐらいから始めようかなと思っていますか?
Avatar
サーバサイドは積極的に機能フラグONにして対応してますが、iOSは色々な都合でまだ有効に出来る段階じゃないのも多くて出遅れがちですね
👍🏻 1
Avatar
ありがとうございます!
iOSは色々な都合でまだ有効に出来る段階じゃないのも多くて出遅れがちですね
たとえばStrict ConcurrencyをCompleteにするとビルドエラーになるとか、そういう感じですかね?
Avatar
(Concurrencyは)各種Frameworkの対応が遅れてるのもそうですし、parameter packとかregexとかはランタイムの実装が足りないとかもありますね (edited)
3:40 AM
モバイルだとMainActorの需要が大きいですが、システムライブラリの各種実装が全然追いついてなくてAssumeIsolatedに頼らざるを得ない場面とかあって恩恵の割に面倒が優ってる印象です。
Avatar
parameter packとかregexとかはランタイムの実装が足りないとかもありますね
なるほどーなかなかConcurrencyにばかり目がいってしまいますけど、そういうのもあるんですね。
モバイルだとMainActorの需要が大きいですが、システムライブラリの各種実装が全然追いついてなくてAssumeIsolatedに頼らざるを得ない場面とかあって恩恵の割に面倒が優ってる印象です。
AssumeIsolated(最終手段)で結局Wrapしないといけない場面ありますねw ↓が入ればそこら辺緩和するのかなあと思ってます。 https://github.com/apple/swift-evolution/blob/main/proposals/0434-global-actor-isolated-types-usability.md - Stored properties of Sendable type in a global-actor-isolated value type can be declared as nonisolated without using (unsafe). - Stored properties of Sendable type in a global-actor-isolated value type are treated as nonisolated when used within the module that defines the property. - @Sendable is inferred for global-actor-isolated functions and closures. - Global-actor-isolated closures are allowed to capture non-Sendable values despite being @Sendable. - A global-actor-isolated subclass of a non-isolated, non-Sendable class is allowed, but it must be non-Sendable
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
👀 1
Avatar
actorで安全にならないばかりか、安全じゃない場合と安全だけど回避しなきゃいけないかどうか余計に考えなきゃいけなくて、 (edited)
5:38 AM
それだったらそんなんいらん
5:38 AM
ってなるという...
5:38 AM
余計気を使うというメリットよりデメリットが優ってしまうケースが多い (edited)
5:40 AM
WWDCのデモアプリみたいなものを作ってる限りではギリつかえるけど、そんなアプリケーションは誰も必要としてないので合った
5:40 AM
という感じでつらみが多い...
t_wakaru 3
Avatar
余計気を使うというメリットよりデメリットが優ってしまうケースが多い
すごいわかりますw 現状だとStrict ConcurrecyをCompleteにしてwarning出ても、↑にもあったようなAssumeIsolatedを使わないといけないケースなど「本当にこれでいいのか!?」ってなりますね。 WWDC(あるいはpublicリリース)までには、すべての道具がそろってもっとわかりやすくなるのかなという期待はしています。(Migrationガイドを出すとは言ってますけど、結局やってみなければわからないことが多そうな気はしてます…w) みなさん、今の所は必要な機能が全部入るまで様子見って感じですかね…😅
Avatar
すでに適用できるタイプのアプリや実装はまあまああると思っているんだけど、運用で特定のwarningは無視みたいなことは必要なのかなあ...
t_zutsuu 1
Avatar
These changes are now available in 4.98.0 ⚠️ WARNING: If you have strict concurrency checking enabled you should migrate to the async Application.make() NIO's EventLoopFuture.wait() is marked a...
12:48 AM
async contextからは通常async funcとfuncの両方を呼び出す事ができるけど
12:49 AM
ブロッキングする func とか、 async版が提供されたfunc とか、 async contextからは呼んでほしくないような場合に、 @available(*, noasync) を付けると警告が出せるらしい
👀 2
Avatar
omochimetaru 5/16/2024 3:24 AM
public typealias Validated<Value> = Result<Value, InputErrorCollection> extension Validated where Failure == InputErrorCollection { このwhereが必要なのバグっぽい
Avatar
@swift-5.9.2 struct Value{} struct InputErrorCollection: Error {} struct OtherError: Error {} typealias Validated<Value> = Result<Value, InputErrorCollection> extension Validated where Failure == OtherError { func hoge() { print("OK???") } }
Avatar
Avatar
masakihori
@swift-5.9.2 struct Value{} struct InputErrorCollection: Error {} struct OtherError: Error {} typealias Validated<Value> = Result<Value, InputErrorCollection> extension Validated where Failure == OtherError { func hoge() { print("OK???") } }
no output
Avatar
なるほど
Avatar
Typed throwsって今どういう状況なんでしたっけ? https://github.com/apple/swift-evolution/blob/main/proposals/0413-typed-throws.md まだ完全に実装されていないからexperimentalになっていてでSwift6.0で使えるようになるかわからない? https://github.com/apple/swift/pull/72032
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
This feature is not fully implemented, and cannot be considered to be "upcoming" until it is.
Avatar
なんとなく使えるけどまだ実装途中
Avatar
ありがとうございますmm Acceptedステータスで実装済のものがどのバージョンで使えるようになるのかがわからず... ↓は6.0になっているのですが、これは今のままでも問題ないということなんですかね? https://github.com/apple/swift-evolution/blob/main/proposals/0421-generalize-async-sequence.md extension AsyncIteratorProtocol { /// Default implementation of `next(isolation:)` in terms of `next()`, which is /// required to maintain backward compatibility with existing async iterators. @available(SwiftStdlib 6.0, *) @available(*, deprecated, message: "Provide an implementation of 'next(isolation:)'") public mutating func next(isolation actor: isolated (any Actor)?) async throws(Failure) -> Element? { nonisolated(unsafe) var unsafeIterator = self do { let element = try await unsafeIterator.next() self = unsafeIterator return element } catch { throw error as! Failure } } } (edited)
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
こっちはimplementedだからできてるんじゃないかしら?
Avatar
あ、構文自体はもう使っても問題ないけど、まだ足りない機能があるって感じなんですかね?(で、それは特に影響しない) https://github.com/apple/swift/pull/71704 (edited)
Avatar
僕が最近触ったときの挙動だと投げるところはできてて、catchで直接網羅検査するやつが未完成
10:22 PM
なのでnext(isolation)はオッケーみたいな感じな気がする
Avatar
なるほど、ありがとうございます! Availabilityも5.11(?たぶん6.0)になっているので、TypedThrows自体はそのまま使えそうですね https://github.com/apple/swift/blob/main/include/swift/AST/FeatureAvailability.def#L68
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
この形の型推論は未実装か実装予定なしなのかわからないけど今のところできませんね (Result<Int, E>にならない) https://x.com/masakihori/status/1781246047978926222
6:03 AM
extension Result where Success: ~Copyable { /// Creates a new result by evaluating a throwing closure, capturing the /// returned value as a success, or any thrown error as a failure. /// /// - Parameter body: A potentially throwing closure to evaluate. @_alwaysEmitIntoClient public init(catching body: () throws(Failure) -> Success) { do { self = .success(try body()) } catch { self = .failure(error) } } }
6:03 AM
catchingの実装は throws(Failure) になってるから、それができないならこのシグネチャになってる意味がないので、推論器が未実装なんだと思います。
Avatar
この辺のやりとりを読んでいて気になったんですが,今の Swift で Any を書く以外で empty protocol composition を表現する方法って存在するのでしょうか? https://github.com/apple/swift/pull/7222#discussion_r99262673
[Sema] Penalize conversions to Any. We previously penalized bindings to Any, and that resulted in inappropriately rejecting solutions where we bind a decl that is explicitly typed Any. That penalty...
Avatar
omochimetaru 6/2/2024 11:38 AM
typealias MyAny = protocol<> って今はもう書けない気がする
Avatar
少なくとも普通には書けないっぽいですよね.protocol<> は.
Avatar
omochimetaru 6/3/2024 1:13 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
1:14 AM
今は Any の定義はstdlibには書かれてないっぽい?(ここに無ければ) コンパイラが特別に認識するのかな
Avatar
この時には既に stdlib には無かったっぽいですね https://github.com/apple/swift/commit/da94183e3539fe6c1d45b0ead0b1d623189fe81d
Now that Any isn’t in the stdlib we need to add it to code completion separately.
Avatar
omochimetaru 6/3/2024 2:30 AM
なるほど。ちょっと調べてもわからなかったんですが、このパッチはいいですね。コミットメッセージでよくわかる。
t_desune 1
2:28 AM
@available(*, deprecated, renamed:) 使うとコンパイラがクラッシュするなんてあるんですね・・・
Avatar
@available(*, unavailable, renamed:) では踏んだことがないですが,何がトリガーなのか気になりますね.
Avatar
@swift-main protocol P<A> { associatedtype A } protocol Q {} func f(_ v: any P<Int>) {} func g(_ v: any (P<Int> & Q)) {} func h(_ v: any (P & Q)) {} (edited)
Avatar
Avatar
Iceman
@swift-main protocol P<A> { associatedtype A } protocol Q {} func f(_ v: any P<Int>) {} func g(_ v: any (P<Int> & Q)) {} func h(_ v: any (P & Q)) {} (edited)
swiftNightly BOT 6/13/2024 10:05 AM
exit status: 1 with <stdin>:6:18: error: non-protocol, non-class type 'P<Int>' cannot be used within a protocol-constrained type 4 | protocol Q {} 5 | func f(_ v: any P<Int>) {} 6 | func g(_ v: any (P<Int> & Q)) {} | `- error: non-protocol, non-class type 'P<Int>' cannot be used within a protocol-constrained type 7 | func h(_ v: any (P & Q)) {} 8 | (edited)
Avatar
PrimaryAssociatedType使ったprotocolは他のprotocolと結合できないんですね
Avatar
omochimetaru 7/9/2024 1:36 AM
Xcode16 beta3でstrict concurrencyがバグってる?
1:36 AM
デフォルト引数の = .a に反応してるんですが、問題があるとは思えない
1:37 AM
明示的に foo(e: .a) なら怒られないし。
Avatar
デフォルト値の生成タイミングが変になってるとか?
Avatar
omochimetaru 7/9/2024 1:39 AM
その辺の扱いでバグってそうです
Avatar
特定のスコープにselfを暗黙的に定義する方法って、guard let self else { ... }を定義する(SE-0365)以外に何かあるでしょうか? (edited)
Avatar
omochimetaru 8/10/2024 9:48 AM
普通に最初からキャプチャする場合以外は無いと思う (edited)
Avatar
できたらKotlinのapplyを実装するライブラリとか出てそうだし、できないか〜
Avatar
スコープの中身をそのselfの型のextensionにコピーすればできそうだ
Exported 10,459 message(s)
Timezone: UTC+0