Swift part10 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>706 Playgroundにコピペして試してみればいいだろ 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. …最適化と言い張ってるがこれはひどい このぐらいの最適化はやってくれた方がありがたい 参照渡しの方が確実にパフォーマンス上がるし、通常の使い方で副作用もない 副作用があるようなら書き方に問題があるだろ inoutで受けた変数のオリジナルにアクセスするコードにワーニングぐらい出してくれたら とも思うけど、まだそこまで面倒は見きれないんだろ ただ、最適化の恩恵にあずかりたいなら、willSetなんかは入れない方がいいみたいだな >>706 いや最適化だよ 参照渡しにしたとしても、外形的にcopy-in copy-outした場合と全く同じ動作をする場合にだけ、参照渡しに最適化される ただ、>>696 みたいなコード書くとその最適化の前提がぶっ壊れるから絶対するなとリファレンスでも言ってるだけで リファレンスにはっきりやるなと書いてることをやって壊れたからってそれはプログラマの責任でしょ まぁ将来的にownershipが入れば>>696 みたいなコードもちゃんとコンパイルエラーにしてくれるようになると思うよ 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] willSet/didSetの挙動が怪しすぎるな バグなのかもな >>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)になるイメージ この挙動を理解してなければ、structにwillSet/didSetを実装してパフォーマンスに意図しない影響を与える可能性があるな >>697 ないっしょ… なぜSwiftとかいう自己満発展途上言語なんか使ってるかって言ったらApple様ご指定だからってだけだし mutatingはselfをinoutで渡す a.f() // これは A.f(&a)() // これと同じ なので一般のinout引数と同様にmutatingメソッド内のselfもセマンティクス的にはcopy-in copy-out ただmutatingが暗黙にselfをinoutで渡すって説明はリファレンスには見つけられなかった リポジトリのdocsに放り込まれてる文書群ではしばしば言及されてるけど 気軽にプロパティ変えたつもりの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: [])] */ クラスで実装すれば、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 */ Swift初期にJavaScriptに似てるからWeb屋が参入してくるとか言ってた人もいたけど全然違うしSwiftはObjective-Cより仕様が複雑になってきたね でもおかしなコードはコンパイラがビシバシ教えてくれるし仕様を詳しく知らなくてもとりあえずコードを書く事はできるかな? Swiftけっこう難しい Objective-Cは形式張っていてコードがやたらと長くなるだけで実はそんなに難しくない >>720 俺もSwift難しい。 structにprotocol適用したり、protocol extensionとか。 詰め込みすぎて開発者のスキルでコードが変わりすぎるのが難点 >>720 C知ってればハードル高くないからなObjCは SwiftとCのどっちがハードル高いかって言ったらCとは言えないけどな Cのシンタックスをベースにしてる言語は多いから、初学者にSwiftとC どっちをやった方がいいかって言われたら間違いなくCだわ 初心者にポインターは結構ハードル高いと思うけど あとメモリ管理にシビアな所とか Cもわからんようなもやしエンジニアが増えると思うと先が思いやられる ソフト屋もハードウェアに近いプリミティブな部分の理解は必要なんだけとな そういう意味でCは高級アセンブラ的なバランスがちょうどいい >>726 ポインタが難しいって言ったって、結局ポインタ的なメモリの知識はあった方がデバッグでメモリ周り疑う疑わないに直結するしなぁ。。。 でも今は簡単なゲーム作りたいとかなら特にポインタの知識なくても作れちゃうからなぁ 初心者にC言語でゲーム作ってだと難しいと思うけど、Swiftなら割と簡単 モグラたたきとかジャンケンゲーム程度なら初心者でも2,3日で作れるかも 誰もポインタないと作れないなんて言ってない。 ポインタの知識はトラブった時にトラブルの原因の候補にメモリが上がるか?どう状態かを推測出来るか?ってのに直結する。 ポインタと言うか、メモリの構造を知らなけりゃトラブルの原因として候補にすら上がらない。 下手すれば永延と原因分からないまま、プログラムは未完に終わる。 そんなこと言い出したら究極的にはコンパイラの癖とかハードの特性とかまで知らないとデバッグできないことになる 初心者にそこまで求めるのは余りにも遠い道のりになる そこまで言わんが、初心者と言えどもCPUとメモリの仕組みは理解してからプログラミングは始めて欲しいものだが。 体験して見たいだけなら兎も角、プログラマになりたいんならね。 kotlin nativeがllvm対応してるらしいのでiosでもkotlin使えそう。 となればswiftはもういいかな。 フフってなった 昔、SwiftもLLVMだからどこでも動くって言ってたなぁ まぁKotlinは頑張ってポーティングしてるようだから 実用性はさておき動くんだろうけど >>722 C言語のソースも、人によって全然違うけどなぁ。 とくに、Headerファイルのマクロ定義によってソースの印象がガラッと変わる。 >>735 Cと比較したらCのがやりたい放題に決まってるだろ… 関数をアドレス指定で直接コールできる言語やぞ… 比較対象がおかしいわ ポインタとか分からんレベルの人にはやりたい放題出来ないがんじがらめの世界の方がいい気はする 柔軟性はObjective-Cで安全性はSwiftなイメージ >>733 Kotlin/Nativeなんてのがあるのね! 知らんかった。JVM無しで動くコードが作れるのかな? It is not a fully functional release yet, Kotlin/Nativeがどの程度動くのか?気になる。 >>729 ポインタ分からないって人は、参照型の値型の違いが理解出来なくないか? 参照型と値型の違いがわからなくても使い方さえ理解できれば簡単なアプリは作れるからな ある程度の最適化はコンパイラがやってくれるし、ハードの性能も上がってるから、多少の冗長性は無視できる C言語だとそうはいかない ポインタを知らないとまずまともなアプリはつくれない 外部のライブラリを利用する場合もポインタの知識は必須になる ポインタの理解が参照型の理解の助けにはなるだろうけど厳密にはポインタと参照型は同じものでもないし それは、ポインタを知らなくても使い方さえ覚えれば簡単なアプリは作れる、っていっても同じじゃないか? ポインタの場合は概念を理解しないで使い方だけ覚えるってのはちと無理がある Swiftの参照型は概念をきっちり理解できなくても、大概動くものは作れるし、変なことやろうとしてもIDEやコンパイラが注意してくれる >>744 じゃなくて、ポインタの概念を理解出来ない人は、参照という概念も理解出来ないって言う意味だけど 挙動で理解出来てるなら、それは理解出来る人だよ >>745 参照を理解できたからとポインタも理解できたとは言えない 大小が逆 そもそも初心者は参照型だ値型だとあまり意識しないんじゃないか 意識しなくてもコードは書ける Swiftならね >>741 だからObjective-Cはいろいろと素晴らしいと考える人が少なくないんだと思うけどな 今後出現して欲しい本 SwiftプログラマのためのKotlin入門 Androidアプリ作りたいけど、Javaは嫌なんだよなぁ。 >>749 そんな本なくてもswiftの簡単版みたいなもんだから余裕でかける iosもandroidも共通で言えることなんだけどさ、もう一段フレームワークが欲しい。どっちもuiライブラリ止まりで、 全体の管理を行う部分が開発者任せで、正直困る。一画面アプリ止まりならそれでもいいんだけどさ。 ステート管理だけで言えばreactのreduxみたいなやつとか。 あれってファイルの置き場所とかもある程度誘導されるから迷いが減るんだよね。 ソースファイルの置場所も公式に決まってないSwiftに何期待してるのか まずはSwift Package ManagerとXcodeで共通化することから始めよう 俺もパッケージマネージャが複数あるのが好かんなぁ。 1. Carthage 2. CocoaPods 3. Swift Package Manager 俺は1.がxcodeprojへの変更が少なくて好みだ。 2.はxcodeprojをどう変更してるのかが、見えない。 CocoaPodsはオープンソースだからxcodeprojをどう変更してるかは見えるだろ Swiftとはちょいと違う事で質問です。 UMLモデリングって最近でも使われますか? 使う目的は何でしょう? 1. すでにあるコードの解析 2. これから作成するコードの可視化 そんなこと聞いてどうすんの? と聞き返したくなるような質問すんな 皆が使ってるなら使ってみようかってことか >>755 まさにこれ。決めてほしい。 それかアップル自身が公式にリファレンスとなるアプリをオープンソースにしてほしい。 react-nativeだとf8appがそれっぽいが。 なんかそれなりの規模のオープンソースアプリないかな。 swift.orgのPackage Managerのページにゴミのようなサンプルはあるけど 自身(SPM)のことしか考えてないから、自分で作った方が良いだろうねぇ Swift Package Manager https://swift.org/package-manager/#conceptual-overview Package.swift作って、Sources, Testsディレクトリ作る CocoaPods https://guides.cocoapods.org/syntax/podfile.html Podfile作る, Sources/*.swiftを参照 Carthage https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile Carfile作る, Sources/*.swiftを参照 Xcode 上の全部を適当にpodが作った.xcworkspaceのプロジェクトツリーに加える qiitaのKotlin記事を読んでて出くわしたphrase。 Android アプリ開発者であれば普段から英語を読んでいると思いますし、平易な英語なので大きな問題はないと思います。 俺にはComputer関連の英語文章が難しく感じるのだけど、どうなんでしょう? exressionを式だと理解するのに、随分時間がかかったと思う。 和書にも専門用語は英訳も一緒に載ってること多いから違和感無かったけど、入門してすぐ洋書だとそう感じるかも。 たしかに! 順方向伝搬(forward propagation)って書いてあるね。和書には。 expressionを式、statementを文と訳すのは判ったけど、和書には「式文」 ってのが時々出て来て、これ何を翻訳したんだ? と不安になる。 そんなあなたに Regular Expression はどう訳す regular = いつもの 例:regular customer = 常連、regular coffee = 日々よく飲むコーヒー regular ¥= 正規 = formal, proper >>772 まあ、情報が入手しずらい時代に苦心して日本語を当てたって感じだ。 Microsoftの文書を読んで、まったく意味がわからんかったのを思い出さしてクレルわぁ。DAO ActiveX Library, RDO ActiveX Libraryに関しての記述を読んで、 さっぱり意味不明だった。和文も、英文も。 サンプルコードを見たら一発で理解できた。 >>771 じゃあ リベンジ:復讐 を、なんとかしてよ。 あとfeatureをフューチャーって発音するのもなんとかして欲しい。 swiftが言語仕様固まらないうちにkotlinがios対応しちゃうな。 swiftは作る奴の思考によってパラダイムが変わるから他人のコードがストレスになる糞言語 いっそのことclassを消してしまえばいいわ >>782 糞に見えるのなら、三流エンジニアだな。使いこなせない事を棚に上げて、悪態ツイテルだけにしか思えん。 一体どこが糞なんだ? SwiftとKotlinでちょっと遅延評価リストを比較した ■Kotlin オンラインコンパイラ: https://try.kotlinlang.org/ val a = generateSequence(0){it+1} //A 問題なし println("A: "+ a.take(10).toList() ) //B 問題なし println("B: "+ a.take(10).map{it*10}.toList() ) //C 問題なし println("C: "+ a.filter{3<it}.take(10).toList() ) //D 問題なし println("D: "+ a.map{it*10}.take(10).toList() ) //E 問題なし println("E: "+ a.map{it*10}.filter{50<it}.take(5).toList() ) swiftは言語仕様固まらないうちにAndroid対応しちゃうバカだからな kotlinのios対応って何周遅れだよ...対応遅すぎる ■Swift オンラインコンパイラ: https://swift.sandbox.bluemix.net/ extension Sequence { var array:[Iterator.Element] {get{return map{$0}}} } let a = sequence(first:0){$0+1} //A 問題なし print("A:", a.prefix(10).array ) //B 問題なし print("B:", a.prefix(10).map{$0*10}.array ) //C 死ぬ print("C:", a.filter{3<$0}.prefix(10).array ) //C-2 lazy付けたら動く print("C:", a.lazy.filter{3<$0}.prefix(10).array ) //D 死ぬ print("D:", a.map{$0*10}.prefix(10).array ) //D-2 lazy付けてもコンパイル不可 print("D:", a.lazy.map{$0*10}.prefix(10).array ) //E print("E:", a.map{$0*10}.filter{50<$0}.prefix(5).array ) //E-2 lazy付加+分割で何とか動く do { let a2 = a.lazy.map{$0*10} let a3 = a2.filter{50<$0} print("E:", a3.prefix(5).array ) } >>786 THX 無限個Sequenceを扱う時には、気をつけます。 >>786 let a = sequence(first:0){$0+1}.lazy でよくね ここ書いてる時点で無限sequenceだってわかってるんだから ambiguous云々言われるのは…まぁ… たしかにこれはガイジ 理由書いてるレスに理由聞くとか新しすぎる >>788 //print("D:", a.map{$0*10}.prefix(10).array ) print("D:", a.map{($0 as Int)*10}.prefix(10).array ) => D: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] 修正したらambiguous言わなくなったけど、なんでだ? スタイリッシュを装ってるが ときどき地がでて$0とか$1とか書いちゃう田舎者 それがSwift without Cという、表面的な自己満足を実現する言語仕様 という意味では成功してるかもなSwiftは See what’s next. The new beta of Xcode 9 is now available, and includes Swift 4 and SDKs used to build apps with the latest innovations and powerful capabilities in macOS, iOS, watchOS, and tvOS. おはギャーきたな 2017/05/26 改正民法が成立、「瑕疵担保責任」などシステム開発契約に影響大 欠陥に気付いた時点から1年以内にITベンダーに通知すれば、通知後5年以内は修正や報酬の減額などを求めることできる Swift3でシステム作って納品する ↓ iOSバージョンが12になる。Swift4が必須になる ↓ 客がプロジェクトファイルからアップデート試す。Swift4の必須のエラーが出る。動作の不具合に気づく ↓ 気付いた時点から1年以内に通知すれば、5年間無料保証ゲット ↓ つまりSwiftがアップデートするたびに、無償の修正作業を発生するということかな > iOSバージョンが12になる。Swift4が必須になる ダウト 中途半端な知識でモノを言うもんじゃねぇよww なお、小賢しいPMはSwiftバージョン上がる度に 最新のXcodeでビルドできないのはアポーのせいなんでwwwってメンテ工数をぶん取る模様 それはお前が決めることじゃない。コンペで「今後欠陥に気付いてから5年間無料保証を請け負うお」を提案できる会社だけが仕事を取れることだけのこと コンペで競争がおき、それを提案できる会社が出てくるから、それが慣習化していくよ。法でデフォルトで定められた無限保証をわざわざ有限保証にするバカはいない。 開発環境を変えてビルド出来なくなるのをソフトウェアの欠陥とは言わないよ Xcode 9、リファクタリングとプロトコルのスタブ来たな インデックス作成もサクサクになってる GitHub統合とMarkdownエディタもいい感じ DoubleWidthの実装がマージされた https://github.com/apple/swift/pull/9367 Int1024だって作れる typealias Int128 = DoubleWidth<Int64> typealias Int256 = DoubleWidth<Int128> typealias Int512 = DoubleWidth<Int256> typealias Int1024 = DoubleWidth<Int512> ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる