WWDC2014で発表されたAppleの新言語Swiftについて語りましょう
関連スレ
プログラミング言語Swift Part4
http://potato.2ch.net/test/read.cgi/mac/1484763495/
[SDK]iPhoneアプリ開発初心者質問箱48[touch][iPad]
http://potato.2ch.net/test/read.cgi/mac/1484217623/
Xcode part14
http://potato.2ch.net/test/read.cgi/mac/1476190499/
Swiftアンチスレ part1
http://echo.2ch.net/test/read.cgi/tech/1458491343/
前スレ
Swift part9
http://echo.2ch.net/test/read.cgi/tech/1476758084/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
探検
Swift part10 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 3b3c-eq+O)
2017/02/20(月) 10:00:13.40ID:ChbPWtRt0643デフォルトの名無しさん (ワッチョイ ca3b-ydzL)
2017/05/24(水) 07:14:18.79ID:6yksy5B10 このスレチの話題の結末が
MFCがmacOSで使える、そうSwiftならね
だったら感動する
MFCがmacOSで使える、そうSwiftならね
だったら感動する
644デフォルトの名無しさん (アウアウエー Sac2-PCQh)
2017/05/24(水) 10:39:54.11ID:2xFOJ35Oa 感動はするけど、真っ平御免だなw
645デフォルトの名無しさん (アウアウエー Sac2-PCQh)
2017/05/24(水) 10:40:45.91ID:2xFOJ35Oa646デフォルトの名無しさん (ワッチョイ 9ff3-A/6v)
2017/05/24(水) 10:44:09.55ID:vuqBov/y0647デフォルトの名無しさん (JP 0H2f-CgLL)
2017/05/24(水) 11:45:23.69ID:4nncZNTTH MFCはクラスライブラリとは言ってるけどただのモジュールだからなω
648デフォルトの名無しさん (ワッチョイ 7a6e-p3s1)
2017/05/24(水) 12:03:02.42ID:2l4fECtb0 KFCはファーストフードとは言ってるけどただのフライドチキンだからなω
649デフォルトの名無しさん (JP 0H2f-CgLL)
2017/05/24(水) 12:10:44.50ID:4nncZNTTH KFC高いよね
650デフォルトの名無しさん (アウアウエー Sac2-9r6K)
2017/05/24(水) 12:40:42.62ID:QzCZ6xD4a あとポケトも不味いよね
651デフォルトの名無しさん (ササクッテロリ Sp03-ydzL)
2017/05/24(水) 12:43:35.78ID:5Ui6S+Mpp macもファストフードって言ってるけどハンバーガーなんだよな...
652デフォルトの名無しさん (ワッチョイ fff5-sZ5x)
2017/05/24(水) 15:21:05.18ID:9HF6LZlN0 もうkotlinでいいんじゃね。大体同じだし。
653デフォルトの名無しさん (ワッチョイ 7a6e-p3s1)
2017/05/24(水) 15:27:20.63ID:yyV+KPjA0 Kotlinの方が名前が可愛いな
654デフォルトの名無しさん (ブーイモ MMea-XqYc)
2017/05/24(水) 15:39:03.23ID:EADXj+S1M バカッターの次はマスト鈍かよ
Swiftはコンパイル必要とかスクリプト言語だとかクッソデタラメばかり撒き散らしてやがる
Swiftはスクリプト言語のようにJIT実行もできるし事前コンパイルして動作することもできるっちゅーねん
よくわかってないからと言って既存のカテゴリに当てはめようとするからおかしくなるんだ。黙ってればいいのに。
twitterもマストドンもバカに絡まれたくないから間違ってても誰も訂正してくれないてことはもうそろそろ理解しないといけないだろうに
Swiftはコンパイル必要とかスクリプト言語だとかクッソデタラメばかり撒き散らしてやがる
Swiftはスクリプト言語のようにJIT実行もできるし事前コンパイルして動作することもできるっちゅーねん
よくわかってないからと言って既存のカテゴリに当てはめようとするからおかしくなるんだ。黙ってればいいのに。
twitterもマストドンもバカに絡まれたくないから間違ってても誰も訂正してくれないてことはもうそろそろ理解しないといけないだろうに
655デフォルトの名無しさん (ワッチョイ dea3-M94C)
2017/05/24(水) 15:43:46.34ID:820zba2j0 つまりkotlin統一でいいね?
656デフォルトの名無しさん (ワッチョイ 9ff3-A/6v)
2017/05/24(水) 16:16:47.79ID:vuqBov/y0 kotlinのvar, valが嫌いだ。
var, letにしてくれ!
var, letにしてくれ!
657デフォルトの名無しさん (ワッチョイ b33c-0jzF)
2017/05/24(水) 17:53:01.63ID:IPRnvfLw0 じゃあvar, letにした新言語Kotiftで
658デフォルトの名無しさん (アウアウエー Sac2-PCQh)
2017/05/24(水) 18:40:00.41ID:fS2T0Ehba659デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
2017/05/25(木) 08:20:49.95ID:STB2bQ410660デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
2017/05/25(木) 08:39:03.16ID:STB2bQ410 RAD StudioってのでiOSアプリ作れるみたい。
661デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
2017/05/25(木) 09:04:58.00ID:STB2bQ410662デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/25(木) 09:55:30.40ID:pDlob0Fd0 >>661
ブラクラ
ブラクラ
663デフォルトの名無しさん (JP 0Hcf-Evzo)
2017/05/25(木) 10:26:57.11ID:nE79I92lH ブラクラではないが特に読む意味もなかった
664デフォルトの名無しさん (アウアウエー Sa3f-0req)
2017/05/25(木) 10:35:05.59ID:jD8c7u6va665デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
2017/05/25(木) 11:18:46.81ID:STB2bQ410666デフォルトの名無しさん (スッップ Sdbf-fYd5)
2017/05/25(木) 12:08:23.03ID:ETNdktOYd >>662
ブラクラとは、どういう意味ですか。
ブラクラとは、どういう意味ですか。
667デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/25(木) 12:36:36.05ID:pDlob0Fd0 >>666
ブラクラとは、どういう意味ですか。とは、どういう意味ですか?
ブラクラとは、どういう意味ですか。とは、どういう意味ですか?
668デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
2017/05/25(木) 12:53:08.46ID:STB2bQ410 >>667
お前、相当、捻くれ者!
お前、相当、捻くれ者!
669デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/25(木) 13:09:18.12ID:pDlob0Fd0 >>668
ありがとー
ありがとー
670デフォルトの名無しさん (ワッチョイ 9ff3-UHtP)
2017/05/25(木) 13:38:00.17ID:A2RaX9kE0 完全にスレチな話題延々してるのとどっちもどっち
671デフォルトの名無しさん (ワッチョイ fbf3-W32U)
2017/05/25(木) 16:35:11.41ID:trjr6FJg0 下のドキュメントを読むにCopy On Writeで最適化する場合にはprotocolやclassでラップせよと言ってるんだけど
Copy On Writeって関数引数に単純なstruct型を渡した時の値渡しには適用されないって認識であってる?
教えてエロい人
https://github.com/apple/swift/blob/master/docs/OptimizationTips.rst
Advice: Use copy-on-write semantics for large values
Copy On Writeって関数引数に単純なstruct型を渡した時の値渡しには適用されないって認識であってる?
教えてエロい人
https://github.com/apple/swift/blob/master/docs/OptimizationTips.rst
Advice: Use copy-on-write semantics for large values
672デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/25(木) 17:14:53.66ID:pDlob0Fd0 どこに
>Copy On Writeで最適化する場合にはprotocolやclassでラップせよ
とか書いてあんだよ
>Copy On Writeって関数引数に単純なstruct型を渡した時の値渡しには適用されないって認識であってる?
んなわけねーだろ
>Copy On Writeで最適化する場合にはprotocolやclassでラップせよ
とか書いてあんだよ
>Copy On Writeって関数引数に単純なstruct型を渡した時の値渡しには適用されないって認識であってる?
んなわけねーだろ
673デフォルトの名無しさん (ワッチョイ fbf3-W32U)
2017/05/25(木) 17:36:25.00ID:trjr6FJg0 あ、すまん、Advice:の節を注視して前の節を飛ばしてた
> When we copy values (the effect of assignment, initialization, and argument passing) the program will create a new copy of the value.
値渡しはコピーするってしっかり書いてあったわ
> When we copy values (the effect of assignment, initialization, and argument passing) the program will create a new copy of the value.
値渡しはコピーするってしっかり書いてあったわ
674デフォルトの名無しさん (ワッチョイ 9ff3-UHtP)
2017/05/25(木) 17:42:45.12ID:A2RaX9kE0 structは常にコピー
このstructはcopy on writeです、という場合も便宜上そう言ってるだけで、実際は中の参照型のストレージをcopy on writeしてるんであってstruct自体は常にコピー
ただしin-out引数だけは例外的にstructでも参照渡しになる場合がある
このstructはcopy on writeです、という場合も便宜上そう言ってるだけで、実際は中の参照型のストレージをcopy on writeしてるんであってstruct自体は常にコピー
ただしin-out引数だけは例外的にstructでも参照渡しになる場合がある
675デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/25(木) 17:46:16.79ID:pDlob0Fd0 copy on writeだから、コビーの必要性が生じた時にコピーが発生するんだろ
structであっても参照するだけならコピーはしない(はず)
structであっても参照するだけならコピーはしない(はず)
676デフォルトの名無しさん (ワッチョイ fbf3-W32U)
2017/05/25(木) 17:59:30.69ID:trjr6FJg0677デフォルトの名無しさん (ワッチョイ fbf3-W32U)
2017/05/25(木) 18:01:40.91ID:trjr6FJg0 structの参照渡しのためのin-out parameter(inout)は使いたくないと思った
それするなら、最初からclassでAPIを設計しろというね
それするなら、最初からclassでAPIを設計しろというね
678デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/25(木) 18:02:56.87ID:pDlob0Fd0 >>676
常にコピーなら、コピーオンライトとは呼べないな
常にコピーなら、コピーオンライトとは呼べないな
679デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/25(木) 18:12:33.09ID:pDlob0Fd0 >>677
inoutを指定しなくないから、クラスにするって考え方がそもそもおかしい
inoutを指定しなくないから、クラスにするって考え方がそもそもおかしい
680デフォルトの名無しさん (スプッッ Sdbf-4cAo)
2017/05/25(木) 18:31:58.93ID:ud72tGp9d >>678
メモリ操作としてのコピーと、変数への代入時の複製を混同すると、そういう訳のわからない議論になるね
structはコピーオンライトと言っても、osやハードウェアのレイヤーになるとclassであっても必要に応じてコピー(と消去を組み合わせた移動)を行ってるんだけどね。
swiftのレイヤーでは、常にコピーされるって言って良いんじゃないかな
コピーの為に支払うコストがいつ払うことになるか、そもそも払う必要が生じるのか、っていう部分にコピーオンライトの概念が関係してくるだけなんだから
メモリ操作としてのコピーと、変数への代入時の複製を混同すると、そういう訳のわからない議論になるね
structはコピーオンライトと言っても、osやハードウェアのレイヤーになるとclassであっても必要に応じてコピー(と消去を組み合わせた移動)を行ってるんだけどね。
swiftのレイヤーでは、常にコピーされるって言って良いんじゃないかな
コピーの為に支払うコストがいつ払うことになるか、そもそも払う必要が生じるのか、っていう部分にコピーオンライトの概念が関係してくるだけなんだから
681デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/25(木) 18:40:08.35ID:pDlob0Fd0 >>680
ごちゃごちゃした理論は言語設計者の領域の話で
プラグラマ視点でのコピーオンライトという文脈では書き換え時にコピー(コスト)が発生するという単純な理解で特に問題ないだろ
じゃないと、Structは常にコピーが発生するからデータの粒度をなるべく小さくして関数への引数渡しも注意しないととか余計な設計負荷を意識しないといけなくなる
ごちゃごちゃした理論は言語設計者の領域の話で
プラグラマ視点でのコピーオンライトという文脈では書き換え時にコピー(コスト)が発生するという単純な理解で特に問題ないだろ
じゃないと、Structは常にコピーが発生するからデータの粒度をなるべく小さくして関数への引数渡しも注意しないととか余計な設計負荷を意識しないといけなくなる
682デフォルトの名無しさん (ササクッテロリ Sp0f-W32U)
2017/05/25(木) 19:05:12.83ID:rwN5JfUNp structは値渡し、classは参照渡し、Array Structの中身はCOWで処理、プログラマはこれを意識して最適化しろ
と>>671のリンク先で言ってるわけだが?
プログラマのレイヤーで考えるべきことが提示されてるのに、なぜそれを見ようとしないのか
と>>671のリンク先で言ってるわけだが?
プログラマのレイヤーで考えるべきことが提示されてるのに、なぜそれを見ようとしないのか
683デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/25(木) 19:55:10.84ID:pDlob0Fd0 でかいデータをstructにつっこんで扱う時に注意すべきことが書いてあるだけだろ
つまり代入が頻繁に発生する状況でも、そのプロパティに実際にアクセスがあるまでコピーを遅延させるテクニックについて触れられてるだけ
別に関数の引数に値型を使うなとかとんちんかんなことは書いてないな
つまり代入が頻繁に発生する状況でも、そのプロパティに実際にアクセスがあるまでコピーを遅延させるテクニックについて触れられてるだけ
別に関数の引数に値型を使うなとかとんちんかんなことは書いてないな
684デフォルトの名無しさん (ワッチョイ 9f3c-V38z)
2017/05/25(木) 21:10:12.75ID:1RtxtHBK0 SwiftでCOW意識する人なんているんだ。
そういう人はC++とかRustとか使えばいいのに。
そういう人はC++とかRustとか使えばいいのに。
685デフォルトの名無しさん (ワッチョイ 6b3c-9J/J)
2017/05/25(木) 22:26:04.80ID:VkchUDpW0 最適化しない場所も含めて意識くらいはするでしょ
その程度のことで言語を変える理由にはならんよ
むしろStructでCoWという設計だからこと気兼ねなく渡せるってことに気付いた方がいい
その程度のことで言語を変える理由にはならんよ
むしろStructでCoWという設計だからこと気兼ねなく渡せるってことに気付いた方がいい
686デフォルトの名無しさん (ワッチョイ fbf3-W32U)
2017/05/26(金) 05:16:56.16ID:xRlJL6be0 誤: StructでCoWという設計だからこと気兼ねなく渡せる
正: Array StructでCoWという設計だからこと気兼ねなく渡せる
どうしてもSturct全般でCOWが適用されると思い込みたいアホが食いしばってて笑う
正: Array StructでCoWという設計だからこと気兼ねなく渡せる
どうしてもSturct全般でCOWが適用されると思い込みたいアホが食いしばってて笑う
687デフォルトの名無しさん (ワッチョイ 6b3c-9J/J)
2017/05/26(金) 07:23:41.84ID:nbO+4ovP0 >>686
「Structが」じゃなくて「Structで」な
Arrayに限らず、StringやDictionaryなどのstructでCoWを実装したもの全般
classでCoWを実装する場合は使う側が明示的にcopy()clone()などを呼ぶかinitを使う必要があるが
structでは代入,引数渡し,戻り値がコピーセマンティクスなので透過的に扱うことが出来る
「Structが」じゃなくて「Structで」な
Arrayに限らず、StringやDictionaryなどのstructでCoWを実装したもの全般
classでCoWを実装する場合は使う側が明示的にcopy()clone()などを呼ぶかinitを使う必要があるが
structでは代入,引数渡し,戻り値がコピーセマンティクスなので透過的に扱うことが出来る
688デフォルトの名無しさん (ワッチョイ fbf3-W32U)
2017/05/26(金) 08:03:17.32ID:xRlJL6be0 COWの話題から、いつの間にか参照渡し/値渡しの解説になっててワロタ
結局はSturctでCOWが常時適用されるわけじゃないから気をつけようってこったな
参照渡し/値渡しの違いを知らないLL言語勢もいるかもしれんが、別の問題だから気にしない
>>671のReducing Dynamic Dispatchの節も面白い
SwiftはObjective-Cと違ってダイナミックディスパッチを減らす機構を持ってるぜ、と
これを徹底的に使い倒したら、局所的にはObjCよりSwiftの方が性能よくなる可能性が微レ存?
結局はSturctでCOWが常時適用されるわけじゃないから気をつけようってこったな
参照渡し/値渡しの違いを知らないLL言語勢もいるかもしれんが、別の問題だから気にしない
>>671のReducing Dynamic Dispatchの節も面白い
SwiftはObjective-Cと違ってダイナミックディスパッチを減らす機構を持ってるぜ、と
これを徹底的に使い倒したら、局所的にはObjCよりSwiftの方が性能よくなる可能性が微レ存?
689デフォルトの名無しさん (ワッチョイ 6b3c-nNOo)
2017/05/26(金) 08:31:19.29ID:nbO+4ovP0 細かいところだけどclassは参照の値渡しでinoutは参照渡し
690デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
2017/05/26(金) 08:45:20.46ID:zBDwmOYm0 >>676
protocolにまつわる言い回しを色々見ますが、どれが適当なのでしょう?
1. protocolを切る
2. protocolを当てる
3. protocolに準拠させる
すべてadding protocol confromanceの訳語だとおもうんですけど。
protocolにまつわる言い回しを色々見ますが、どれが適当なのでしょう?
1. protocolを切る
2. protocolを当てる
3. protocolに準拠させる
すべてadding protocol confromanceの訳語だとおもうんですけど。
691デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
2017/05/26(金) 08:49:45.12ID:zBDwmOYm0 最近のCPUはSIMD命令(SSEとかAVRとか言われるやつ)を内蔵していて、
でかいStructも一発でコピーできるって、理解は正しいっすかねぇ?
512bitレジスタが32個あって、しかもその32レジスタはペアで使える。
って事は、512bit x 32個 = 2Kbyteを一発でレジスタ -> メモリへmoveしたり
メモリ -> レジスタloadできる。
この理解はOKっすかねぇ。
でかいStructも一発でコピーできるって、理解は正しいっすかねぇ?
512bitレジスタが32個あって、しかもその32レジスタはペアで使える。
って事は、512bit x 32個 = 2Kbyteを一発でレジスタ -> メモリへmoveしたり
メモリ -> レジスタloadできる。
この理解はOKっすかねぇ。
692デフォルトの名無しさん (ワッチョイ 9ff3-UHtP)
2017/05/26(金) 10:19:08.37ID:LS4RNUEG0 >>689
in-out引数は参照渡しじゃない
in-out引数のセマンティクスはあくまでcopy-in copy-outで、最適化で参照渡しになる"場合もある"だけ
リファレンスではin-out引数が参照渡しであると想定したコードを書いてはいけないとはっきり言ってる
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/doc/uid/TP40014097-CH34-ID545
var i: Int = 0 {
willSet { print("willSet: ¥(newValue)") }
}
i = 1 // prints "willSet: 1"
i = 2 // prints "willSet: 2"
func f(_ v: inout Int) {
v = 3
v = 4
}
f(&i) // prints "willSet: 4"
参照渡しなら"willSet: 3"と"willSet: 4"両方表示されるはずだけど
実際には関数に入るときにiの値がvにcopy-inされ
関数から出るときにvの値がiにcopy-outされるので
copy-out時の"willSet: 4"しか表示されない
in-out引数は参照渡しじゃない
in-out引数のセマンティクスはあくまでcopy-in copy-outで、最適化で参照渡しになる"場合もある"だけ
リファレンスではin-out引数が参照渡しであると想定したコードを書いてはいけないとはっきり言ってる
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/doc/uid/TP40014097-CH34-ID545
var i: Int = 0 {
willSet { print("willSet: ¥(newValue)") }
}
i = 1 // prints "willSet: 1"
i = 2 // prints "willSet: 2"
func f(_ v: inout Int) {
v = 3
v = 4
}
f(&i) // prints "willSet: 4"
参照渡しなら"willSet: 3"と"willSet: 4"両方表示されるはずだけど
実際には関数に入るときにiの値がvにcopy-inされ
関数から出るときにvの値がiにcopy-outされるので
copy-out時の"willSet: 4"しか表示されない
693デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
2017/05/26(金) 10:43:47.67ID:zBDwmOYm0 >>692
すんばらしい、説明
すんばらしい、説明
694デフォルトの名無しさん (ワッチョイ 0f1f-9J/J)
2017/05/27(土) 14:04:16.20ID:SDTaiU/Z0695デフォルトの名無しさん (ワッチョイ 7b46-sPQt)
2017/05/27(土) 21:00:43.52ID:h0JsdT2O0 >>694の心の声
(やべぇ、まじかよ…。バグ仕込んじまった…)
(やべぇ、まじかよ…。バグ仕込んじまった…)
696デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/27(土) 21:48:41.96ID:aL4+kPgB0 inoutで渡された配列変数のオリジナルを関数内で操作しても副作用はないみたいただけどな
var a = [Int]()
func f(_ v: inout [Int]) {
v.append(3)
a.append(4)
v.append(5)
}
a.append(1)
f(&a)
a.append(2)
print(a) // [1, 3, 4, 5, 2]
ただ、それを想定するなということなんだろ
var a = [Int]()
func f(_ v: inout [Int]) {
v.append(3)
a.append(4)
v.append(5)
}
a.append(1)
f(&a)
a.append(2)
print(a) // [1, 3, 4, 5, 2]
ただ、それを想定するなということなんだろ
697デフォルトの名無しさん (ワッチョイ 0fd4-ZpYF)
2017/05/27(土) 21:57:51.65ID:e57lt1AJ0 SwiftってiOSアプリ以外に広がる可能性ある?
698デフォルトの名無しさん (ワッチョイ 6b3c-waVG)
2017/05/27(土) 22:13:54.38ID:7vlRlcaj0 少なくともwillSetがある場合は参照渡しの最適化が掛からないようだね
以下のAはcopy-in, copy-outになっていて、Bは参照渡しになってる
http://swift.sandbox.bluemix.net/#/repl/592977d0d72c2a7516859cca
以下のAはcopy-in, copy-outになっていて、Bは参照渡しになってる
http://swift.sandbox.bluemix.net/#/repl/592977d0d72c2a7516859cca
699デフォルトの名無しさん (ワッチョイ 0f1f-9J/J)
2017/05/27(土) 22:20:21.28ID:SDTaiU/Z0700デフォルトの名無しさん (ワッチョイ 6b3c-9J/J)
2017/05/27(土) 22:21:46.44ID:7vlRlcaj0 >>696
var a = [Int]() { willSet{ } } にしたら [1, 3, 5, 2] になるね
var a = [Int]() { willSet{ } } にしたら [1, 3, 5, 2] になるね
701デフォルトの名無しさん (ワッチョイ 0f1f-9J/J)
2017/05/27(土) 22:26:06.26ID:SDTaiU/Z0 えええええ
ほんとに動き違うのかwwww
ほんとに動き違うのかwwww
702デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/27(土) 22:26:19.82ID:aL4+kPgB0703デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/27(土) 22:30:22.71ID:aL4+kPgB0 willSetの有無で挙動が変わるのはいただけな
デバッグで混乱する元になる
デバッグで混乱する元になる
704デフォルトの名無しさん (ワッチョイ 0f1f-9J/J)
2017/05/27(土) 22:31:17.31ID:SDTaiU/Z0705デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/27(土) 22:38:43.72ID:aL4+kPgB0 >>704
そこに
As an optimization, when the argument is a value stored at a physical address in memory, the same memory location is used both inside and outside the function body. The optimized behavior is known as call by reference
とも書いてある。参照を渡して最適化されると。
それに依存して関数内で参照元にアクセスするなとも書いてあるけど
そこに
As an optimization, when the argument is a value stored at a physical address in memory, the same memory location is used both inside and outside the function body. The optimized behavior is known as call by reference
とも書いてある。参照を渡して最適化されると。
それに依存して関数内で参照元にアクセスするなとも書いてあるけど
706デフォルトの名無しさん (ワッチョイ 0f1f-9J/J)
2017/05/27(土) 22:41:57.41ID:SDTaiU/Z0707デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/27(土) 22:47:16.42ID:aL4+kPgB0 >>706
Playgroundにコピペして試してみればいいだろ
Playgroundにコピペして試してみればいいだろ
708デフォルトの名無しさん (ワッチョイ 0f1f-9J/J)
2017/05/27(土) 22:49:30.62ID:SDTaiU/Z0 Write your code using the model given by copy-in copy-out, without depending on the call-by-reference optimization,
so that it behaves correctly with or without the optimization.
…最適化と言い張ってるがこれはひどい
so that it behaves correctly with or without the optimization.
…最適化と言い張ってるがこれはひどい
709デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/27(土) 23:01:24.62ID:aL4+kPgB0 このぐらいの最適化はやってくれた方がありがたい
参照渡しの方が確実にパフォーマンス上がるし、通常の使い方で副作用もない
副作用があるようなら書き方に問題があるだろ
inoutで受けた変数のオリジナルにアクセスするコードにワーニングぐらい出してくれたら
とも思うけど、まだそこまで面倒は見きれないんだろ
ただ、最適化の恩恵にあずかりたいなら、willSetなんかは入れない方がいいみたいだな
参照渡しの方が確実にパフォーマンス上がるし、通常の使い方で副作用もない
副作用があるようなら書き方に問題があるだろ
inoutで受けた変数のオリジナルにアクセスするコードにワーニングぐらい出してくれたら
とも思うけど、まだそこまで面倒は見きれないんだろ
ただ、最適化の恩恵にあずかりたいなら、willSetなんかは入れない方がいいみたいだな
710デフォルトの名無しさん (ワッチョイ 9ff3-UHtP)
2017/05/27(土) 23:07:17.91ID:Hem7AZxu0711デフォルトの名無しさん (ワッチョイ 6b3c-9J/J)
2017/05/27(土) 23:47:08.68ID:7vlRlcaj0 willSetがあるとmutating funcもself自体がcopy-in copy-outになった
これもリファレンスのどこかにあるのかな
struct A{
var v = [Int]()
var onAppend: (()->())? = nil
mutating func f() {
v.append(1)
onAppend?()
}
}
do {
var a = A()
a.onAppend = { a.v.append(2) }
a.f()
print("willSetなし", a.v) // [1, 2]
}
do {
var a = A() {willSet{}}
a.onAppend = { a.v.append(2) }
a.f()
print("willSetあり", a.v) // [1]
}
willSetなし [1, 2]
willSetあり [1]
これもリファレンスのどこかにあるのかな
struct A{
var v = [Int]()
var onAppend: (()->())? = nil
mutating func f() {
v.append(1)
onAppend?()
}
}
do {
var a = A()
a.onAppend = { a.v.append(2) }
a.f()
print("willSetなし", a.v) // [1, 2]
}
do {
var a = A() {willSet{}}
a.onAppend = { a.v.append(2) }
a.f()
print("willSetあり", a.v) // [1]
}
willSetなし [1, 2]
willSetあり [1]
712デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/28(日) 00:12:22.92ID:Kbiso++70 willSet/didSetの挙動が怪しすぎるな
バグなのかもな
バグなのかもな
713デフォルトの名無しさん (ワッチョイ 6b3c-9J/J)
2017/05/28(日) 08:47:45.67ID:tTxkySJm0 >>712
いや挙動的には予想通りだよ
didSetはともかく、willSetの方は呼ばれたコード内では「変更前のオリジナル変数」と「変更後のnewValue」が用意されてるから別の実体作って変更してる
想像だけどinout引数を持つ関数側はバイナリコードレベルでは常に参照で受取るようになっていて
willSetがある変数でmutating funcやinout渡しをすると、呼ぶ側が一時変数作ってそれを渡すコードを生成してると思う
var a = A() { willSet{ } }
a.f() //mutating func f()
↓
var a = A()
func a_willSet(_ newValue:A) { }
do {
var tmp = a
tmp.f()
a_willSet(tmp)
a = tmp
}
inoutの場合は a.f()とtmp.f() が f(&a)とf(&tmp)になるイメージ
いや挙動的には予想通りだよ
didSetはともかく、willSetの方は呼ばれたコード内では「変更前のオリジナル変数」と「変更後のnewValue」が用意されてるから別の実体作って変更してる
想像だけどinout引数を持つ関数側はバイナリコードレベルでは常に参照で受取るようになっていて
willSetがある変数でmutating funcやinout渡しをすると、呼ぶ側が一時変数作ってそれを渡すコードを生成してると思う
var a = A() { willSet{ } }
a.f() //mutating func f()
↓
var a = A()
func a_willSet(_ newValue:A) { }
do {
var tmp = a
tmp.f()
a_willSet(tmp)
a = tmp
}
inoutの場合は a.f()とtmp.f() が f(&a)とf(&tmp)になるイメージ
714デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/28(日) 09:31:38.11ID:o7LOyvX/0 この挙動を理解してなければ、structにwillSet/didSetを実装してパフォーマンスに意図しない影響を与える可能性があるな
715デフォルトの名無しさん (ワッチョイ 7b46-sPQt)
2017/05/28(日) 11:21:48.67ID:6qJqAaY90716デフォルトの名無しさん (ワッチョイ 9ff3-UHtP)
2017/05/28(日) 11:31:20.31ID:z3zgF0Nw0 mutatingはselfをinoutで渡す
a.f() // これは
A.f(&a)() // これと同じ
なので一般のinout引数と同様にmutatingメソッド内のselfもセマンティクス的にはcopy-in copy-out
ただmutatingが暗黙にselfをinoutで渡すって説明はリファレンスには見つけられなかった
リポジトリのdocsに放り込まれてる文書群ではしばしば言及されてるけど
a.f() // これは
A.f(&a)() // これと同じ
なので一般のinout引数と同様にmutatingメソッド内のselfもセマンティクス的にはcopy-in copy-out
ただmutatingが暗黙にselfをinoutで渡すって説明はリファレンスには見つけられなかった
リポジトリのdocsに放り込まれてる文書群ではしばしば言及されてるけど
717デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/28(日) 12:29:40.83ID:o7LOyvX/0 気軽にプロパティ変えたつもりの1行で、コピーが3回も(うち2回は配列全体のコピー)発生するのね
structのwillSetは曲者だな
struct Weapon {
var name: String {
willSet { print("new wepon name = ¥(newValue)") }
}
}
struct Monster {
var name: String
var weapons: [Weapon] {
willSet { print("new weapons = ¥(newValue)") }
}
}
var monsters = [
Monster(name: "Goblin", weapons: [Weapon(name: "Knife")]),
Monster(name: "Orc", weapons: [Weapon(name: "Sword")]),
Monster(name: "Dragon", weapons: [])
] {
willSet { print("new monsters = ¥(newValue)") }
}
monsters[1].weapons[0].name = "Mace"
// output
/*
new weapon name = mace
new weapons = [Weapon(name: "Mace"]
new monsters = [Monster(name: "Goblin", weapons: [Weapon(name: "Knife")]), Monster(name: "Orc", weapons: [Weapon(name: "Mace")]), Monster(name: "Dragon", weapons: [])]
*/
structのwillSetは曲者だな
struct Weapon {
var name: String {
willSet { print("new wepon name = ¥(newValue)") }
}
}
struct Monster {
var name: String
var weapons: [Weapon] {
willSet { print("new weapons = ¥(newValue)") }
}
}
var monsters = [
Monster(name: "Goblin", weapons: [Weapon(name: "Knife")]),
Monster(name: "Orc", weapons: [Weapon(name: "Sword")]),
Monster(name: "Dragon", weapons: [])
] {
willSet { print("new monsters = ¥(newValue)") }
}
monsters[1].weapons[0].name = "Mace"
// output
/*
new weapon name = mace
new weapons = [Weapon(name: "Mace"]
new monsters = [Monster(name: "Goblin", weapons: [Weapon(name: "Knife")]), Monster(name: "Orc", weapons: [Weapon(name: "Mace")]), Monster(name: "Dragon", weapons: [])]
*/
718デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/28(日) 12:30:23.95ID:o7LOyvX/0 クラスで実装すれば、wellSetあってもコピーはプロバティに対しての一回だけ
class Weapon {
var name: String {
willSet { print("new wepon name = ¥(newValue)") }
}
init(name: String) {
self.name = name
}
}
class Monster {
var name: String
var weapons: [Weapon] {
willSet { print("new weapons = ¥(newValue)") }
}
init(name: String, weapons: [Weapon]) {
self.name = name
self.weapons = weapons
}
}
var monsters = [
Monster(name: "Goblin", weapons: [Weapon(name: "Knife")]),
Monster(name: "Orc", weapons: [Weapon(name: "Sword")]),
Monster(name: "Dragon", weapons: [])
] {
willSet { print("new monsters = ¥(newValue)") }
}
monsters[1].weapons[0].name = "Mace"
// output
/*
new wepon name = Mace
*/
class Weapon {
var name: String {
willSet { print("new wepon name = ¥(newValue)") }
}
init(name: String) {
self.name = name
}
}
class Monster {
var name: String
var weapons: [Weapon] {
willSet { print("new weapons = ¥(newValue)") }
}
init(name: String, weapons: [Weapon]) {
self.name = name
self.weapons = weapons
}
}
var monsters = [
Monster(name: "Goblin", weapons: [Weapon(name: "Knife")]),
Monster(name: "Orc", weapons: [Weapon(name: "Sword")]),
Monster(name: "Dragon", weapons: [])
] {
willSet { print("new monsters = ¥(newValue)") }
}
monsters[1].weapons[0].name = "Mace"
// output
/*
new wepon name = Mace
*/
719デフォルトの名無しさん (ササクッテロル Sp0f-Kfqe)
2017/05/28(日) 12:35:53.43ID:eqNgb5P3p Swift初期にJavaScriptに似てるからWeb屋が参入してくるとか言ってた人もいたけど全然違うしSwiftはObjective-Cより仕様が複雑になってきたね
でもおかしなコードはコンパイラがビシバシ教えてくれるし仕様を詳しく知らなくてもとりあえずコードを書く事はできるかな?
でもおかしなコードはコンパイラがビシバシ教えてくれるし仕様を詳しく知らなくてもとりあえずコードを書く事はできるかな?
720デフォルトの名無しさん (ワッチョイ dbee-Uhxf)
2017/05/28(日) 22:04:52.22ID:ls5tm5z70 Swiftけっこう難しい
Objective-Cは形式張っていてコードがやたらと長くなるだけで実はそんなに難しくない
Objective-Cは形式張っていてコードがやたらと長くなるだけで実はそんなに難しくない
721デフォルトの名無しさん (ワッチョイ fb54-WkB/)
2017/05/28(日) 22:35:10.01ID:7/a46AkG0722デフォルトの名無しさん (ワッチョイ 0fa3-iTU4)
2017/05/28(日) 22:44:58.49ID:ew7wH7J40 詰め込みすぎて開発者のスキルでコードが変わりすぎるのが難点
723デフォルトの名無しさん (スップ Sdbf-sPQt)
2017/05/28(日) 22:57:25.17ID:Y/jTFKWEd >>720
C知ってればハードル高くないからなObjCは
C知ってればハードル高くないからなObjCは
724デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/28(日) 23:22:08.09ID:o7LOyvX/0 そのCがハードル高いからな初心者には
725デフォルトの名無しさん (ワッチョイ 7b46-NZKg)
2017/05/28(日) 23:28:56.75ID:6qJqAaY90 SwiftとCのどっちがハードル高いかって言ったらCとは言えないけどな
Cのシンタックスをベースにしてる言語は多いから、初学者にSwiftとC
どっちをやった方がいいかって言われたら間違いなくCだわ
Cのシンタックスをベースにしてる言語は多いから、初学者にSwiftとC
どっちをやった方がいいかって言われたら間違いなくCだわ
726デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/28(日) 23:30:24.66ID:o7LOyvX/0 初心者にポインターは結構ハードル高いと思うけど
あとメモリ管理にシビアな所とか
あとメモリ管理にシビアな所とか
727デフォルトの名無しさん (ワッチョイ 7b46-sPQt)
2017/05/29(月) 00:25:02.54ID:lFCv8yRy0 Cもわからんようなもやしエンジニアが増えると思うと先が思いやられる
ソフト屋もハードウェアに近いプリミティブな部分の理解は必要なんだけとな
そういう意味でCは高級アセンブラ的なバランスがちょうどいい
ソフト屋もハードウェアに近いプリミティブな部分の理解は必要なんだけとな
そういう意味でCは高級アセンブラ的なバランスがちょうどいい
728デフォルトの名無しさん (アウアウエー Sa3f-Kfqe)
2017/05/29(月) 00:38:37.93ID:21264BYsa >>726
ポインタが難しいって言ったって、結局ポインタ的なメモリの知識はあった方がデバッグでメモリ周り疑う疑わないに直結するしなぁ。。。
ポインタが難しいって言ったって、結局ポインタ的なメモリの知識はあった方がデバッグでメモリ周り疑う疑わないに直結するしなぁ。。。
729デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/29(月) 00:47:58.23ID:3RO08/qX0 でも今は簡単なゲーム作りたいとかなら特にポインタの知識なくても作れちゃうからなぁ
初心者にC言語でゲーム作ってだと難しいと思うけど、Swiftなら割と簡単
モグラたたきとかジャンケンゲーム程度なら初心者でも2,3日で作れるかも
初心者にC言語でゲーム作ってだと難しいと思うけど、Swiftなら割と簡単
モグラたたきとかジャンケンゲーム程度なら初心者でも2,3日で作れるかも
730デフォルトの名無しさん (アウアウエー Sa3f-Kfqe)
2017/05/29(月) 00:57:45.02ID:21264BYsa 誰もポインタないと作れないなんて言ってない。
ポインタの知識はトラブった時にトラブルの原因の候補にメモリが上がるか?どう状態かを推測出来るか?ってのに直結する。
ポインタと言うか、メモリの構造を知らなけりゃトラブルの原因として候補にすら上がらない。
下手すれば永延と原因分からないまま、プログラムは未完に終わる。
ポインタの知識はトラブった時にトラブルの原因の候補にメモリが上がるか?どう状態かを推測出来るか?ってのに直結する。
ポインタと言うか、メモリの構造を知らなけりゃトラブルの原因として候補にすら上がらない。
下手すれば永延と原因分からないまま、プログラムは未完に終わる。
731デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/29(月) 01:03:25.64ID:3RO08/qX0 そんなこと言い出したら究極的にはコンパイラの癖とかハードの特性とかまで知らないとデバッグできないことになる
初心者にそこまで求めるのは余りにも遠い道のりになる
初心者にそこまで求めるのは余りにも遠い道のりになる
732デフォルトの名無しさん (アウアウエー Sa3f-Kfqe)
2017/05/29(月) 01:19:59.07ID:21264BYsa そこまで言わんが、初心者と言えどもCPUとメモリの仕組みは理解してからプログラミングは始めて欲しいものだが。
体験して見たいだけなら兎も角、プログラマになりたいんならね。
体験して見たいだけなら兎も角、プログラマになりたいんならね。
733デフォルトの名無しさん (ワッチョイ 7bf5-vlKO)
2017/05/29(月) 06:40:45.44ID:DGY6L2yw0 kotlin nativeがllvm対応してるらしいのでiosでもkotlin使えそう。
となればswiftはもういいかな。
となればswiftはもういいかな。
734デフォルトの名無しさん (ササクッテロリ Sp0f-3U4p)
2017/05/29(月) 07:01:38.32ID:L9ed4gjcp フフってなった
昔、SwiftもLLVMだからどこでも動くって言ってたなぁ
まぁKotlinは頑張ってポーティングしてるようだから
実用性はさておき動くんだろうけど
昔、SwiftもLLVMだからどこでも動くって言ってたなぁ
まぁKotlinは頑張ってポーティングしてるようだから
実用性はさておき動くんだろうけど
735デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
2017/05/29(月) 08:51:21.58ID:A7rCPaLD0736デフォルトの名無しさん (スプッッ Sdbf-iTU4)
2017/05/29(月) 09:10:28.76ID:96NrxdYRd737デフォルトの名無しさん (ワッチョイ 2b72-Kfqe)
2017/05/29(月) 10:41:09.25ID:M6frmmyd0 ポインタとか分からんレベルの人にはやりたい放題出来ないがんじがらめの世界の方がいい気はする
柔軟性はObjective-Cで安全性はSwiftなイメージ
柔軟性はObjective-Cで安全性はSwiftなイメージ
738デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
2017/05/29(月) 11:13:19.98ID:A7rCPaLD0739デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
2017/05/29(月) 11:14:56.30ID:A7rCPaLD0 It is not a fully functional release yet,
Kotlin/Nativeがどの程度動くのか?気になる。
Kotlin/Nativeがどの程度動くのか?気になる。
740デフォルトの名無しさん (エムゾネ FFbf-4cAo)
2017/05/29(月) 11:27:53.51ID:trx2RJe/F >>729
ポインタ分からないって人は、参照型の値型の違いが理解出来なくないか?
ポインタ分からないって人は、参照型の値型の違いが理解出来なくないか?
741デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/29(月) 12:04:20.43ID:3RO08/qX0 参照型と値型の違いがわからなくても使い方さえ理解できれば簡単なアプリは作れるからな
ある程度の最適化はコンパイラがやってくれるし、ハードの性能も上がってるから、多少の冗長性は無視できる
C言語だとそうはいかない
ポインタを知らないとまずまともなアプリはつくれない
外部のライブラリを利用する場合もポインタの知識は必須になる
ポインタの理解が参照型の理解の助けにはなるだろうけど厳密にはポインタと参照型は同じものでもないし
ある程度の最適化はコンパイラがやってくれるし、ハードの性能も上がってるから、多少の冗長性は無視できる
C言語だとそうはいかない
ポインタを知らないとまずまともなアプリはつくれない
外部のライブラリを利用する場合もポインタの知識は必須になる
ポインタの理解が参照型の理解の助けにはなるだろうけど厳密にはポインタと参照型は同じものでもないし
742デフォルトの名無しさん (スプッッ Sdbf-4cAo)
2017/05/29(月) 12:14:04.16ID:idSzy2HYd それは、ポインタを知らなくても使い方さえ覚えれば簡単なアプリは作れる、っていっても同じじゃないか?
743デフォルトの名無しさん (ワッチョイ df6e-cMFO)
2017/05/29(月) 12:33:55.33ID:3RO08/qX0 ポインタの場合は概念を理解しないで使い方だけ覚えるってのはちと無理がある
Swiftの参照型は概念をきっちり理解できなくても、大概動くものは作れるし、変なことやろうとしてもIDEやコンパイラが注意してくれる
Swiftの参照型は概念をきっちり理解できなくても、大概動くものは作れるし、変なことやろうとしてもIDEやコンパイラが注意してくれる
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 地震 [Hitzeschleier★]
- 【地震】 茨城 栃木 埼玉 千葉 震度4 [KingFisherは魚じゃないよ★]
- 【STARTO ENTERTAINMENT】SUPER EIGHTの横山裕、フジ『ドッキリGP』ロケで全治2ヶ月の重傷 [Ailuropoda melanoleuca★]
- 【食】「シャウエッセンは焼くべからず」暗黙のルールを破り売上高過去最高…日本ハム社員たちが「夜味」にかけた情熱 [ぐれ★]
- 【話題】好きな鍋は?! 「寄せ鍋」「キムチ鍋」「水炊き」「もつ鍋」「豆乳鍋」「ちゃんこ鍋」「ごま坦々鍋」「トマト鍋」 [ひぃぃ★]
- 「もうキモくてキモくて…」29歳女性が語る“おぢアタック”の実態。「俺ならイケるかも」年下女性を狙う勘違い中年男性に共通点が★6 [Hitzeschleier★]
- ( ´ん`)地震…? [399583221]
- 🖐( -᷄ὢ)俺には>>2の>>3を自由に扱える権利がある……
- 地震
- 地震地震うっせーーーんだよゴミ共wwwwwwwwwwwwwwwwwwwwwwwwwwwwww
- 【お笑い】自民党広報「SNS上のデマに実効性ある対策を😤」鹿デマ言いやがった高市に言えカス [359965264]
- 震度4とか舐めてるやろ
