Swift part10 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/02/20(月) 10:00:13.40ID:ChbPWtRt0
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
636デフォルトの名無しさん (ワッチョイ 9ff3-A/6v)
垢版 |
2017/05/23(火) 13:07:30.75ID:3fZmvxNt0
>>635
なるほどぉ
637デフォルトの名無しさん (ワッチョイ 9ff3-A/6v)
垢版 |
2017/05/23(火) 13:46:30.45ID:3fZmvxNt0
>>633
Visual Studio6の頃までしか、MFCは知らんけど、
Microsoftは、MFCを放置してるんちゃうの?

同時に、C++11, C++14って進化してるのに、Micorsoft C++はこれも独自仕様
で放置されてる、ちゅうのが俺の印象なんすけど、違うんでしょうか?

最近のMicrosoft系開発環境に疎いので間違ってたら申し訳ないすけど。
2017/05/23(火) 14:21:59.30ID:ka9VvDM30
>>634
違いは>>635(AnyClassはclassだけ)であってるけど
補足するとMetatypeという識別子の型は無い
あれは単なるジェネリクスのプレースホルダ名

実際のメタタイプの型は「(型名).Type」でAny.Type型にも入れられる
AnyClassは「AnyObject.Type」のエイリアスでclassのメタタイプのみ入る

ちなみにメタタイプの値自体はclass型でないのでメタタイプのメタタイプはAnyClassに入らない
class A{}
let a:AnyClass = A.self //OK
let b:AnyClass = A.Type.self //NG
let c:Any.Type = A.Type.self //OK
639デフォルトの名無しさん (ワッチョイ 9ff3-A/6v)
垢版 |
2017/05/23(火) 17:12:29.92ID:3fZmvxNt0
/var/folders/4x/4kvmnvfd46zdv9xt45wf2kx00000gn/T/
vzb3TAU/1:20:19: warning: operator should no longer be declared with body
infix operator ^^ { }
~^~~

SwiftコンパイラーをTerminal.appで動かすと上記の様なwarningが出ます。
エラーの内容は^^演算子が定義されていません。って事だんですけど。これは、置いておいて、
1:20:19は何を表わしてるのでしょうか?20行目19カラムって事は判ったのですが、1は何でしょう?
1番目のソースって事なんでしょうか?
2017/05/23(火) 18:36:11.48ID:PJIONmxya
>>637
リボンUIはMFCらしいってのまでは追ってたんで、今も地味に進化してると思うけど、おいらも分からん。

あの機能は何の為かとか分かるようになったけど、結局C++触らなくなった。
再入門しようにも入門書の少なさよ。。。
641デフォルトの名無しさん (ワッチョイ ca3b-ydzL)
垢版 |
2017/05/23(火) 19:14:39.26ID:1Q8iu32F0
ビルドキャッシュとして
/var/folders/4x/4kvmnvfd46zdv9xt45wf2kx00000gn/T/vzb3TAU/1
ってファイルがあるんじゃないの
一時的に作られてすぐ削除されるかもしれんから存在確認できるか知らんけど
2017/05/24(水) 01:14:07.99ID:9HF6LZlN0
そもそもwindowsのアプリ開発でMFC使う事情って保守以外に何あるの?
2017/05/24(水) 07:14:18.79ID:6yksy5B10
このスレチの話題の結末が

MFCがmacOSで使える、そうSwiftならね

だったら感動する
2017/05/24(水) 10:39:54.11ID:2xFOJ35Oa
感動はするけど、真っ平御免だなw
2017/05/24(水) 10:40:45.91ID:2xFOJ35Oa
>>642
怖いもの見たさで再挑戦したいだけ。
スレチだし気にしないで。
646デフォルトの名無しさん (ワッチョイ 9ff3-A/6v)
垢版 |
2017/05/24(水) 10:44:09.55ID:vuqBov/y0
>>642
動作の軽いアプリが作れる。
.netアプリは動作がモッサリ
2017/05/24(水) 11:45:23.69ID:4nncZNTTH
MFCはクラスライブラリとは言ってるけどただのモジュールだからなω
2017/05/24(水) 12:03:02.42ID:2l4fECtb0
KFCはファーストフードとは言ってるけどただのフライドチキンだからなω
2017/05/24(水) 12:10:44.50ID:4nncZNTTH
KFC高いよね
2017/05/24(水) 12:40:42.62ID:QzCZ6xD4a
あとポケトも不味いよね
2017/05/24(水) 12:43:35.78ID:5Ui6S+Mpp
macもファストフードって言ってるけどハンバーガーなんだよな...
2017/05/24(水) 15:21:05.18ID:9HF6LZlN0
もうkotlinでいいんじゃね。大体同じだし。
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もマストドンもバカに絡まれたくないから間違ってても誰も訂正してくれないてことはもうそろそろ理解しないといけないだろうに
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にしてくれ!
2017/05/24(水) 17:53:01.63ID:IPRnvfLw0
じゃあvar, letにした新言語Kotiftで
2017/05/24(水) 18:40:00.41ID:fS2T0Ehba
>>647
そうそう。
macで使えるようになって嬉しいとしたらDelphiのVCL。
C#の中の人(Delphiの生みの親)をMSから引き抜けw
659デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
垢版 |
2017/05/25(木) 08:20:49.95ID:STB2bQ410
>>658
VCLって使った事ない。
けど、噂には聞いている。

最近のDelphiではiOSアプリ作れるのか?
660デフォルトの名無しさん (ワッチョイ 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:STB2bQ410
http://qiita.com/kazaiso/items/7f4955318f9d40a391fc
2017/05/25(木) 09:55:30.40ID:pDlob0Fd0
>>661
ブラクラ
663デフォルトの名無しさん (JP 0Hcf-Evzo)
垢版 |
2017/05/25(木) 10:26:57.11ID:nE79I92lH
ブラクラではないが特に読む意味もなかった
2017/05/25(木) 10:35:05.59ID:jD8c7u6va
>>659
.netがVCLに似てる。
ネイティヴ版.netって感じだよ。
言語がC++かObjectPascalってだけで。

.netのForms使えるならVCLも違和感無く使える。
665デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
垢版 |
2017/05/25(木) 11:18:46.81ID:STB2bQ410
>>664
なるほど!VCL良いじゃん。

Common Language RuntimeとかいうInterpreter無しに.netモドキが動くなんて。
666デフォルトの名無しさん (スッップ Sdbf-fYd5)
垢版 |
2017/05/25(木) 12:08:23.03ID:ETNdktOYd
>>662
ブラクラとは、どういう意味ですか。
2017/05/25(木) 12:36:36.05ID:pDlob0Fd0
>>666
ブラクラとは、どういう意味ですか。とは、どういう意味ですか?
668デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
垢版 |
2017/05/25(木) 12:53:08.46ID:STB2bQ410
>>667
お前、相当、捻くれ者!
2017/05/25(木) 13:09:18.12ID:pDlob0Fd0
>>668
ありがとー
2017/05/25(木) 13:38:00.17ID:A2RaX9kE0
完全にスレチな話題延々してるのとどっちもどっち
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
2017/05/25(木) 17:14:53.66ID:pDlob0Fd0
どこに
>Copy On Writeで最適化する場合にはprotocolやclassでラップせよ
とか書いてあんだよ

>Copy On Writeって関数引数に単純なstruct型を渡した時の値渡しには適用されないって認識であってる?
んなわけねーだろ
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.
値渡しはコピーするってしっかり書いてあったわ
2017/05/25(木) 17:42:45.12ID:A2RaX9kE0
structは常にコピー
このstructはcopy on writeです、という場合も便宜上そう言ってるだけで、実際は中の参照型のストレージをcopy on writeしてるんであってstruct自体は常にコピー
ただしin-out引数だけは例外的にstructでも参照渡しになる場合がある
2017/05/25(木) 17:46:16.79ID:pDlob0Fd0
copy on writeだから、コビーの必要性が生じた時にコピーが発生するんだろ
structであっても参照するだけならコピーはしない(はず)
2017/05/25(木) 17:59:30.69ID:trjr6FJg0
>>674
だよなー、昔もSwiftはCOWで処理するからコピーするわけない!!みたいな奴がいて
ずっと首を捻ってたから、このドキュメントで裏付け取れて良かったわ

>>672, 675
お前はフィーリングだけで物を言わず、COWの実装を学べ

あと>>671でprotocolでラップとか言ったけど意味ないな
protocolはI/F切るだけのものだから、class/structで差をつけないと参照/値渡しには影響ないわ
2017/05/25(木) 18:01:40.91ID:trjr6FJg0
structの参照渡しのためのin-out parameter(inout)は使いたくないと思った
それするなら、最初からclassでAPIを設計しろというね
2017/05/25(木) 18:02:56.87ID:pDlob0Fd0
>>676
常にコピーなら、コピーオンライトとは呼べないな
2017/05/25(木) 18:12:33.09ID:pDlob0Fd0
>>677
inoutを指定しなくないから、クラスにするって考え方がそもそもおかしい
680デフォルトの名無しさん (スプッッ Sdbf-4cAo)
垢版 |
2017/05/25(木) 18:31:58.93ID:ud72tGp9d
>>678
メモリ操作としてのコピーと、変数への代入時の複製を混同すると、そういう訳のわからない議論になるね
structはコピーオンライトと言っても、osやハードウェアのレイヤーになるとclassであっても必要に応じてコピー(と消去を組み合わせた移動)を行ってるんだけどね。
swiftのレイヤーでは、常にコピーされるって言って良いんじゃないかな
コピーの為に支払うコストがいつ払うことになるか、そもそも払う必要が生じるのか、っていう部分にコピーオンライトの概念が関係してくるだけなんだから
2017/05/25(木) 18:40:08.35ID:pDlob0Fd0
>>680
ごちゃごちゃした理論は言語設計者の領域の話で
プラグラマ視点でのコピーオンライトという文脈では書き換え時にコピー(コスト)が発生するという単純な理解で特に問題ないだろ
じゃないと、Structは常にコピーが発生するからデータの粒度をなるべく小さくして関数への引数渡しも注意しないととか余計な設計負荷を意識しないといけなくなる
2017/05/25(木) 19:05:12.83ID:rwN5JfUNp
structは値渡し、classは参照渡し、Array Structの中身はCOWで処理、プログラマはこれを意識して最適化しろ
>>671のリンク先で言ってるわけだが?
プログラマのレイヤーで考えるべきことが提示されてるのに、なぜそれを見ようとしないのか
2017/05/25(木) 19:55:10.84ID:pDlob0Fd0
でかいデータをstructにつっこんで扱う時に注意すべきことが書いてあるだけだろ
つまり代入が頻繁に発生する状況でも、そのプロパティに実際にアクセスがあるまでコピーを遅延させるテクニックについて触れられてるだけ
別に関数の引数に値型を使うなとかとんちんかんなことは書いてないな
684デフォルトの名無しさん (ワッチョイ 9f3c-V38z)
垢版 |
2017/05/25(木) 21:10:12.75ID:1RtxtHBK0
SwiftでCOW意識する人なんているんだ。
そういう人はC++とかRustとか使えばいいのに。
2017/05/25(木) 22:26:04.80ID:VkchUDpW0
最適化しない場所も含めて意識くらいはするでしょ
その程度のことで言語を変える理由にはならんよ

むしろStructでCoWという設計だからこと気兼ねなく渡せるってことに気付いた方がいい
2017/05/26(金) 05:16:56.16ID:xRlJL6be0
誤: StructでCoWという設計だからこと気兼ねなく渡せる
正: Array StructでCoWという設計だからこと気兼ねなく渡せる

どうしてもSturct全般でCOWが適用されると思い込みたいアホが食いしばってて笑う
2017/05/26(金) 07:23:41.84ID:nbO+4ovP0
>>686
「Structが」じゃなくて「Structで」な
Arrayに限らず、StringやDictionaryなどのstructでCoWを実装したもの全般

classでCoWを実装する場合は使う側が明示的にcopy()clone()などを呼ぶかinitを使う必要があるが
structでは代入,引数渡し,戻り値がコピーセマンティクスなので透過的に扱うことが出来る
2017/05/26(金) 08:03:17.32ID:xRlJL6be0
COWの話題から、いつの間にか参照渡し/値渡しの解説になっててワロタ
結局はSturctでCOWが常時適用されるわけじゃないから気をつけようってこったな
参照渡し/値渡しの違いを知らないLL言語勢もいるかもしれんが、別の問題だから気にしない

>>671のReducing Dynamic Dispatchの節も面白い
SwiftはObjective-Cと違ってダイナミックディスパッチを減らす機構を持ってるぜ、と
これを徹底的に使い倒したら、局所的にはObjCよりSwiftの方が性能よくなる可能性が微レ存?
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の訳語だとおもうんですけど。
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っすかねぇ。
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"しか表示されない
693デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
垢版 |
2017/05/26(金) 10:43:47.67ID:zBDwmOYm0
>>692
すんばらしい、説明
2017/05/27(土) 14:04:16.20ID:SDTaiU/Z0
>>692
え…
参照渡しと値渡しで違う動作するとき
動作がどっちになるかわからんってこと?
2017/05/27(土) 21:00:43.52ID:h0JsdT2O0
>>694の心の声
(やべぇ、まじかよ…。バグ仕込んじまった…)
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]

ただ、それを想定するなということなんだろ
697デフォルトの名無しさん (ワッチョイ 0fd4-ZpYF)
垢版 |
2017/05/27(土) 21:57:51.65ID:e57lt1AJ0
SwiftってiOSアプリ以外に広がる可能性ある?
2017/05/27(土) 22:13:54.38ID:7vlRlcaj0
少なくともwillSetがある場合は参照渡しの最適化が掛からないようだね
以下のAはcopy-in, copy-outになっていて、Bは参照渡しになってる
http://swift.sandbox.bluemix.net/#/repl/592977d0d72c2a7516859cca
2017/05/27(土) 22:20:21.28ID:SDTaiU/Z0
>>696
いやそれ副作用ある状態じゃん
関数終わった時点で
a=1,4
v=1,3,5
だからoutでvがaに上書きされて
1,3,5,2 が出ないといけないはず
2017/05/27(土) 22:21:46.44ID:7vlRlcaj0
>>696
var a = [Int]() { willSet{ } } にしたら [1, 3, 5, 2] になるね
2017/05/27(土) 22:26:06.26ID:SDTaiU/Z0
えええええ
ほんとに動き違うのかwwww
2017/05/27(土) 22:26:19.82ID:aL4+kPgB0
>>699
aの内容を変更するためにf()にaを渡したのだから、f()の中ではaとvは同じ扱い
なので、inoutの仕様からすれば、>>696の挙動が自然だと思うけど
2017/05/27(土) 22:30:22.71ID:aL4+kPgB0
willSetの有無で挙動が変わるのはいただけな
デバッグで混乱する元になる
2017/05/27(土) 22:31:17.31ID:SDTaiU/Z0
>>702
>>692のリンク先
In-out parameters are passed as follows:
1.When the function is called, the value of the argument is copied.
2.In the body of the function, the copy is modified.
3.When the function returns, the copy’s value is assigned to the original argument.

コピーされるて書いてあるやん!
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
とも書いてある。参照を渡して最適化されると。
それに依存して関数内で参照元にアクセスするなとも書いてあるけど
2017/05/27(土) 22:41:57.41ID:SDTaiU/Z0
>>705
うん、>>692を誤読してた
動作変わるのは最適化って言わねーよ!

>>696ってほんとに試したんか
2017/05/27(土) 22:47:16.42ID:aL4+kPgB0
>>706
Playgroundにコピペして試してみればいいだろ
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.

…最適化と言い張ってるがこれはひどい
2017/05/27(土) 23:01:24.62ID:aL4+kPgB0
このぐらいの最適化はやってくれた方がありがたい
参照渡しの方が確実にパフォーマンス上がるし、通常の使い方で副作用もない
副作用があるようなら書き方に問題があるだろ
inoutで受けた変数のオリジナルにアクセスするコードにワーニングぐらい出してくれたら
とも思うけど、まだそこまで面倒は見きれないんだろ
ただ、最適化の恩恵にあずかりたいなら、willSetなんかは入れない方がいいみたいだな
2017/05/27(土) 23:07:17.91ID:Hem7AZxu0
>>706
いや最適化だよ
参照渡しにしたとしても、外形的にcopy-in copy-outした場合と全く同じ動作をする場合にだけ、参照渡しに最適化される
ただ、>>696みたいなコード書くとその最適化の前提がぶっ壊れるから絶対するなとリファレンスでも言ってるだけで

リファレンスにはっきりやるなと書いてることをやって壊れたからってそれはプログラマの責任でしょ

まぁ将来的にownershipが入れば>>696みたいなコードもちゃんとコンパイルエラーにしてくれるようになると思うよ
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]
2017/05/28(日) 00:12:22.92ID:Kbiso++70
willSet/didSetの挙動が怪しすぎるな
バグなのかもな
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)になるイメージ
2017/05/28(日) 09:31:38.11ID:o7LOyvX/0
この挙動を理解してなければ、structにwillSet/didSetを実装してパフォーマンスに意図しない影響を与える可能性があるな
2017/05/28(日) 11:21:48.67ID:6qJqAaY90
>>697
ないっしょ…
なぜSwiftとかいう自己満発展途上言語なんか使ってるかって言ったらApple様ご指定だからってだけだし
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に放り込まれてる文書群ではしばしば言及されてるけど
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: [])]
*/
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
*/
2017/05/28(日) 12:35:53.43ID:eqNgb5P3p
Swift初期にJavaScriptに似てるからWeb屋が参入してくるとか言ってた人もいたけど全然違うしSwiftはObjective-Cより仕様が複雑になってきたね
でもおかしなコードはコンパイラがビシバシ教えてくれるし仕様を詳しく知らなくてもとりあえずコードを書く事はできるかな?
2017/05/28(日) 22:04:52.22ID:ls5tm5z70
Swiftけっこう難しい
Objective-Cは形式張っていてコードがやたらと長くなるだけで実はそんなに難しくない
721デフォルトの名無しさん (ワッチョイ fb54-WkB/)
垢版 |
2017/05/28(日) 22:35:10.01ID:7/a46AkG0
>>720
俺もSwift難しい。
structにprotocol適用したり、protocol extensionとか。
2017/05/28(日) 22:44:58.49ID:ew7wH7J40
詰め込みすぎて開発者のスキルでコードが変わりすぎるのが難点
2017/05/28(日) 22:57:25.17ID:Y/jTFKWEd
>>720
C知ってればハードル高くないからなObjCは
2017/05/28(日) 23:22:08.09ID:o7LOyvX/0
そのCがハードル高いからな初心者には
2017/05/28(日) 23:28:56.75ID:6qJqAaY90
SwiftとCのどっちがハードル高いかって言ったらCとは言えないけどな
Cのシンタックスをベースにしてる言語は多いから、初学者にSwiftとC
どっちをやった方がいいかって言われたら間違いなくCだわ
2017/05/28(日) 23:30:24.66ID:o7LOyvX/0
初心者にポインターは結構ハードル高いと思うけど
あとメモリ管理にシビアな所とか
2017/05/29(月) 00:25:02.54ID:lFCv8yRy0
Cもわからんようなもやしエンジニアが増えると思うと先が思いやられる
ソフト屋もハードウェアに近いプリミティブな部分の理解は必要なんだけとな
そういう意味でCは高級アセンブラ的なバランスがちょうどいい
2017/05/29(月) 00:38:37.93ID:21264BYsa
>>726
ポインタが難しいって言ったって、結局ポインタ的なメモリの知識はあった方がデバッグでメモリ周り疑う疑わないに直結するしなぁ。。。
2017/05/29(月) 00:47:58.23ID:3RO08/qX0
でも今は簡単なゲーム作りたいとかなら特にポインタの知識なくても作れちゃうからなぁ
初心者にC言語でゲーム作ってだと難しいと思うけど、Swiftなら割と簡単
モグラたたきとかジャンケンゲーム程度なら初心者でも2,3日で作れるかも
2017/05/29(月) 00:57:45.02ID:21264BYsa
誰もポインタないと作れないなんて言ってない。
ポインタの知識はトラブった時にトラブルの原因の候補にメモリが上がるか?どう状態かを推測出来るか?ってのに直結する。
ポインタと言うか、メモリの構造を知らなけりゃトラブルの原因として候補にすら上がらない。
下手すれば永延と原因分からないまま、プログラムは未完に終わる。
2017/05/29(月) 01:03:25.64ID:3RO08/qX0
そんなこと言い出したら究極的にはコンパイラの癖とかハードの特性とかまで知らないとデバッグできないことになる
初心者にそこまで求めるのは余りにも遠い道のりになる
2017/05/29(月) 01:19:59.07ID:21264BYsa
そこまで言わんが、初心者と言えどもCPUとメモリの仕組みは理解してからプログラミングは始めて欲しいものだが。

体験して見たいだけなら兎も角、プログラマになりたいんならね。
2017/05/29(月) 06:40:45.44ID:DGY6L2yw0
kotlin nativeがllvm対応してるらしいのでiosでもkotlin使えそう。
となればswiftはもういいかな。
2017/05/29(月) 07:01:38.32ID:L9ed4gjcp
フフってなった
昔、SwiftもLLVMだからどこでも動くって言ってたなぁ

まぁKotlinは頑張ってポーティングしてるようだから
実用性はさておき動くんだろうけど
735デフォルトの名無しさん (ワッチョイ fbf3-Y9+t)
垢版 |
2017/05/29(月) 08:51:21.58ID:A7rCPaLD0
>>722
C言語のソースも、人によって全然違うけどなぁ。
とくに、Headerファイルのマクロ定義によってソースの印象がガラッと変わる。
2017/05/29(月) 09:10:28.76ID:96NrxdYRd
>>735
Cと比較したらCのがやりたい放題に決まってるだろ…
関数をアドレス指定で直接コールできる言語やぞ…
比較対象がおかしいわ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況