トップページ⇒tech
1001コメント313KB

Swift part4 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2014/11/13(木) 15:39:01.67ID:TmOo0Hy+
WWDC2014で発表されたAppleの新言語Swiftについて語りましょう

関連スレ
TypeScript(MS) VS Swift(Apple)
http://peace.2ch.net/test/read.cgi/tech/1401758403/
帰ってきた動的言語 VS 静的言語(代表Swift)
http://peace.2ch.net/test/read.cgi/tech/1401809550/
新言語Swiftを語るスレ
http://anago.2ch.net/test/read.cgi/mac/1401736249/
プログラミング言語Swift
http://anago.2ch.net/test/read.cgi/mac/1401736921/

前スレ
Swiftスレ
http://peace.2ch.net/test/read.cgi/tech/1401736341/
Swift part2
http://peace.2ch.net/test/read.cgi/tech/1402465335/
Swift part3
http://peace.2ch.net/test/read.cgi/tech/1406083608/
0561デフォルトの名無しさん2015/02/13(金) 03:36:32.63ID:buPT00S0
>>560
"key"を一旦変数に入れれば辞書の値は取得できる。
val k = "key"
"\(dicB[k])"
だけど、オプショナルなんでOptionalという文字列が付加される。
オプショナルについての条件判断を追加したほうがいいんじゃないの?
if let v = dicB["key"] {
取得した値vを使って文字列作成
}
0562デフォルトの名無しさん2015/02/13(金) 07:51:40.67ID:lUySCnaC
val k = "key\(dicB[k]!)"
ただし nil だと落ちる
0563デフォルトの名無しさん2015/02/13(金) 12:38:22.60ID:iKg98AzI
>>561,562
レスありがとです。
やっぱり一回変数に入れないとなんですね。
ちなみにオプショナルバインディングて、絶対に中身あるってわかってるものでも使っておいた方がいいんでしょうか?
例えばplistから配列作って使う場合みたいに中身が絶対nilじゃないケースで
0564デフォルトの名無しさん2015/02/13(金) 15:03:19.62ID:SEI7NHmi
絶対にnilじゃないとわかっているのにOptionalの皮を被ってるものを狼少年Optionalと呼ぶ(俺の中で)
0565デフォルトの名無しさん2015/02/14(土) 21:52:32.61ID:qQK3AVz3
ArrayやDictionaryが構造体ってことは、関数の引数でArrayやDictionary受け取って、
関数内でいじくっても関数を呼び出した側では反映されない?
いじくったArrayやDictionaryを返り値として返すか、
inoutにすればOK?
0566デフォルトの名無しさん2015/02/14(土) 22:57:54.44ID:yymPAXuR
>>565
array や dictionary はvalue type なので、関数の引数に指定した時はコピーされますよ。
0567デフォルトの名無しさん2015/02/15(日) 09:16:28.92ID:ZBOaPrrY
MVCにチャレンジしてるんだけどそもそもが理解できない・・・アホす
例えばModelで宣言してるクラスの変数を複数のVCから使う場合はそのインスタンスはAppDelegateに宣言して共有しちゃって問題ないですか?
それともprepareSegueでVC同士でインスタンスを都度渡すべき?
0568デフォルトの名無しさん2015/02/15(日) 09:18:22.40ID:OwkhoVMF
>>566
ですよね。
というか引数は定数だからそもそもいじれなかった。
varつけていじっても値型だから呼び出し側には変化無くて(中身のオブジェクトとかいじったら変わるけど)
配列や辞書受け取って、いじった配列や辞書返す関数をつくるには
変えた後の配列や値を返り値として返すか、inoutつけて参照するかになるわけだ
0569デフォルトの名無しさん2015/02/15(日) 11:02:14.80ID:oAveDeym
参照型に持たせて受け渡しするって手もある
0570デフォルトの名無しさん2015/02/15(日) 11:42:17.34ID:I+Ksv/GK
メモリ効率とか大丈夫なのかね。
0571デフォルトの名無しさん2015/02/15(日) 11:44:32.43ID:ZBOaPrrY
>>569
セグエでってことですよね?
グローバルな宣言よりそっちのがいいんですかね
0572デフォルトの名無しさん2015/02/15(日) 11:59:44.48ID:oAveDeym
>>571
ごめん>>569は>>568に向けてだった
0573デフォルトの名無しさん2015/02/15(日) 12:15:41.26ID:ZBOaPrrY
>>572
すみません勘違いしてしまいました汗
0574デフォルトの名無しさん2015/02/15(日) 13:04:44.05ID:Bd6vSIe4
>>567
それってModelをどこで確保しておくかってことじゃね?
たぶんこれという正解は無いので、個人的に作っているならどっちでもどこでもいいよw 仕事上では一部でしか参照しないのになんでもかんでもAppDelegateに入れんなよと思ったりするけど
0575デフォルトの名無しさん2015/02/15(日) 16:15:08.10ID:4GZ3t+xS
>>567
このiOSアプリのMac版作るぞ〜って時に
作り直しの部分が少なくできるように
なってればいいのではないか。
0576デフォルトの名無しさん2015/02/15(日) 18:26:35.75ID:6aDKSPw5
>>567
MVCの元祖の言語SmalltalkがもうMVCモデルすてちゃったよ
0577デフォルトの名無しさん2015/02/15(日) 18:57:42.60ID:bX6frV1s
ですよね。
0578デフォルトの名無しさん2015/02/15(日) 20:49:33.01ID:HN+lsg6Z
UIKitがベッタリMVCだからなぁ
Swiftと相性悪いと思う
0579デフォルトの名無しさん2015/02/15(日) 21:57:04.36ID:VwlzZl8k
>>576
捨ててはないと思うけど。
Smalltalk-80 の直系の子孫の VisualWorks はずっと MVC だし、
リリース前の v1 からフォークした Squeak(と、そこからさらにフォークした Pharo)は
Morphic という SELF 由来の GUI フレームワークに切り替わってはいるけど、
Morphic のウィジェットを使って MVC は実現されているし。
0580デフォルトの名無しさん2015/02/16(月) 08:42:46.66ID:f+L9KC1f
>>574,575
レスありがとうございます
例えばグローバル変数はなるべく使わない方がいいみたいに、〜がベターみたいな宣言位置があるのかと気にしていました
あまり拘る必要がなさそうで安心しました
とりあえずガシガシ書いてトライアンドエラーで学んでいきます
0581デフォルトの名無しさん2015/02/16(月) 23:41:29.72ID:EqgM0b6a
class A {

}
var dic1: [String:Any] = [
"a" : A()
]
var dic2: [String:Any] = [
"b" : dic1["a"]
]
var b = dic2["b"] as A
これキャストに失敗してクラッシュするのなんで?
Xcode 6.1.1
0582デフォルトの名無しさん2015/02/17(火) 01:16:27.91ID:h4FzBcNN
>>581
dic1["a"] は Any? 型だから dic2 は [String: Any] 型じゃなくて [String: Any?] 型にしないといけない。
あるいは dic2 を [String: Any] 型のまま行くなら dic2 に突っ込む時にオプショナル外さないといけない

var dic2: [String: Any?] = ["b": dic1["a"]]
または
var dic2: [String: Any] = ["b": dic1["a"]!]
0583デフォルトの名無しさん2015/02/17(火) 02:33:32.25ID:q2NMkJsx
>>581の解決方法は>>582でいいんだけどこの例をそのまま使えないかなと思って色々やってみてふと疑問に思ったことがある
Any型の変数にOptionalをUnwrapしないでそのまま代入できるけどその場合どうやってUnwrapするの?

let str:String? = "string”
let anyStr:Any = str

if let s = anyStr as? String{
println(s)//実行されない
}
0584デフォルトの名無しさん2015/02/17(火) 10:19:13.17ID:lqlm+AeY
一旦String?にキャストつまりString??にすりゃいんじゃねとおもったらなんかよう分からんエラーが出る(1.2)
0585デフォルトの名無しさん2015/02/17(火) 20:39:55.71ID:q2NMkJsx
>>584
色々やってみたんだけど正直分からなかった
非OptionalからOptionalへのキャストがエラーになるのはそもそもSwiftが「変数の型が非Optionalだけど中身はOptional」な状況を想定してないから「変数の型が非OptionalなのにOptionalにキャストするのはおかしい」と判断してるからだろうね
多分「Any型の変数使う場合は必ずOptionalにしろ」しか対策ないと思う
0586デフォルトの名無しさん2015/02/17(火) 21:14:15.05ID:RqkpPCDB
>>583
http://stackoverflow.com/questions/27989094/how-to-unwrap-an-optional-value-from-any-type

ここに同じ様な問題で Int? の場合があったけど、ドキュメントに載っていない reflect を使う解決法が載ってる。
#reflect って初めて知ったけど。

ちなみに、
let str:String? = "str"
let anyStr:Any? = str
if let x = anyStr as? String
は動作しますね。
0587デフォルトの名無しさん2015/02/17(火) 22:49:23.99ID:lqlm+AeY
このrintaroって人しょっちゅうみるな。
Swift詳しすぎたろどんだけ愛してるんだ
0588デフォルトの名無しさん2015/02/17(火) 23:25:10.22ID:h4FzBcNN
Any ガンガン使うこと自体 Swift の流儀じゃないって思う
05895832015/02/18(水) 01:10:01.76ID:PG0yrYqr
>>586のリンク先のunwrap関数(Anyを渡すとAny?が返ってくる)使ったらいけたわ
MirroTypeは色々面白そうだけどあまりお世話になりたくはないかなw
0590デフォルトの名無しさん2015/02/18(水) 02:44:49.48ID:EaNt20NS
>>581
DictionaryやArrayは必ずOptionalを返すからじゃないの?
0591デフォルトの名無しさん2015/02/18(水) 21:03:01.10ID:p402jgdk
>>590
それなら非オプショナルの辞書にオプショナル入れようとした時点でコンパイルエラーになって欲しい気がするんだけど…
それにAnyだろうとAny?だろうと実際の型がAならキャストできると思うんだけど、
キャストできないってことは中身はAではなくなってしまうの?
だとすればどの時点でAではなくなるのか?
Aでないとすれば実際の型は何か?
元のA型のオブジェクトはどこにいったのか?
0592デフォルトの名無しさん2015/02/18(水) 21:48:31.98ID:QUK3YI5R
Any? is Any
だから入るのは仕方ない
あと中身はAそのものじゃなくA?だからキャストできないんじゃないか?
0593デフォルトの名無しさん2015/02/18(水) 22:41:21.03ID:58KY8dA5
キャストできなきゃ落ちるのが swift だろう
0594デフォルトの名無しさん2015/02/19(木) 02:32:43.00ID:WJfndVBC
>>592
えっと、わかった、つまり
オプショナルをネストすると、アンラップしても元の型に戻らないってことか
オプショナルを辞書に入れるときにアンラップしないとオプショナルのまま入って取り出すとオプショナルがネストされたものが返されてしまうんだな
Optional<Optional<A>>をアンラップしたらOptional<A>であってAではないからキャストに失敗するんだな
めんどくさい(小並感)
0595デフォルトの名無しさん2015/02/19(木) 05:36:13.10ID:lzq5WWDP
二重にキャストするの?
0596デフォルトの名無しさん2015/02/19(木) 09:45:48.63ID:ybiW+36S
折角mac買ったんでswiftを勉強し始めたんだけど文法に慣れねえ…
0597デフォルトの名無しさん2015/02/19(木) 23:00:33.51ID:eKjo0MpI
>>594
let optOptStr:Optional<Optional<String>> = "String"
みたいなOptionalのネストはOptional Bindingをネストすれば面倒くさいけどUnwrapできる

if let optStr = optOptStr {
if let str = optStr {
println(str)//実行される
}
}

中身が非nilだと確信が持てるなら
println(optOptStr!!)
でもいいけど

>>592が言いたいのはOptional型の値も非OptionalのAny型の範疇になるため
一見Unwrapしないと代入できなさそうな>>583みたいなコードもエラーを吐かずに通ってしまうという事

さらに変数の型はOptionalを許容してないのに中身の値の型はOptionalという矛盾した状態を作ってしまうため>>586のリンンク先にあるunwrap関数みたいなものを自作しないとUnwrapできくなる
0598デフォルトの名無しさん2015/02/20(金) 02:19:24.41ID:8Wdi/5E9
OptionalをネストするとOptional型の本質(変数に値が有るのか無いのか判別すること)から外れるし
無駄にコードが分かり辛くなるからやめたほうが良いと思う

上の例だと答えてる人がいたように
var dict2: [String: Any] = ["b": dict1["a"]!]
みたいにその都度unwrapするのがいいんじゃない?
0599デフォルトの名無しさん2015/02/20(金) 03:32:39.83ID:d89dlcyc
まずAnyにオプショナルが入るのと
オプショナルがネストできてしまうのが微妙
オプショナルが言語の機能というよりもひとつの型として定義されてるからなんだろうけど
ひとつの型にしてしまうとAnyに入ってしまう
オプショナルをジェネリックな型としてではなく言語機能として組み込んで
Any?をAnyではなくして
オプショナルをネストできないようにすればいいと思う
オプショナルがネストされて嬉しいことってあるか?
せめてネストされててもアンラップしたときに再帰的にアンラップされればいいんだけど
0600デフォルトの名無しさん2015/02/20(金) 05:31:54.15ID:HhpNDOhk
頭悪そうだな
汎用コンテナ等で、型のわからないデータをなんかの拍子にoptionalに入れて取り出して
型が変わったら困るでしょ
0601デフォルトの名無しさん2015/02/20(金) 14:31:15.59ID:WU53rPmt
それだとoptional関係ないんじゃ
0602デフォルトの名無しさん2015/02/20(金) 14:47:56.08ID:BQ0HPMBo
誰に圧力かけたらLinuxでSwift使えるようになるのかおしえてくれよ
0603デフォルトの名無しさん2015/02/20(金) 15:21:17.11ID:3cwntlj6
SwiftLinuxで我慢しろ
0604デフォルトの名無しさん2015/02/20(金) 17:36:00.88ID:/cS16MGZ
言い出しっぺの法則
0605デフォルトの名無しさん2015/02/20(金) 17:39:13.27ID:5FOc2mPU
silverなんとかってプロジェクトで出来たんじゃないの?
1.2は当然無理だろうけど
0606デフォルトの名無しさん2015/02/20(金) 17:50:15.98ID:c/BSOhvB
>>602
ジョブズと、あとはマイケル・ジャクソン
0607デフォルトの名無しさん2015/02/20(金) 19:47:38.44ID:d89dlcyc
>>600
なんでそんなことが起きるのか意味わからない。
どういうこと?具体的に説明して、どうぞ
0608デフォルトの名無しさん2015/02/21(土) 00:48:12.44ID:Z9EOPxZR
外部のC言語のライブラリを使ったSwift用のダイナミックフレームワークを作りたいんですがわからないことがあります。
まず、依存先のライブラリは作成するダイナミックフレームワークに含められますか?
それとも、ダイナミックフレームワークを使うアプリのプロジェクトで依存ライブラリもリンクしないといけないですか?
前者の場合、別のダイナミックフレームワークも同じC言語ライブラリを使っていたとして、
同じライブラリを使用した複数のダイナミックフレームワークを同じアプリでリンクしたらどうなりますか?
リンクエラーになりますか?正常にリンクできますか?どれかひとつの実装のみが使われますか?
0609デフォルトの名無しさん2015/02/21(土) 01:17:03.48ID:PJ316OmS
その外部のC言語のライブラリってスタティックとダイナミック両方あるの?選択可能なの?
0610デフォルトの名無しさん2015/02/21(土) 01:41:36.24ID:Z9EOPxZR
>>609
静的ライブラリとしてビルドできるのかはわかりませんがbrewで入れたものは動的リンクライブラリ(.dylib)になってますね。
0611デフォルトの名無しさん2015/02/21(土) 02:11:45.24ID:9dFVJ2j7
Swift関係ないよな

C/C++やObj-cと同じく、フレームワークに含める/含めないは自分が決定することだろうし
リンクして関数名がバッティングすればエラーが出るだろうよ

dylibはうまいことやればその辺回避出来るフォーマットだった気がするが
考えるの面倒だから必要分だけリンクすればいいんじゃね?
0612デフォルトの名無しさん2015/02/21(土) 02:19:57.94ID:Z9EOPxZR
>>611
そうなんですか?すみません。
そのへんよくわかってないんですが、
フレームワーク作れるようになったのはSwiftができたからだった気がして。
Objective-C だとフレームワークは作れないですよね。
0613デフォルトの名無しさん2015/02/21(土) 15:27:24.72ID:RqXv00zr
世の中にあるフレームワークは何で出来てると思ってるんだよ
0614デフォルトの名無しさん2015/02/21(土) 17:23:32.83ID:PJ316OmS
>>611
dylibしか気にしていなく、また、brewで入れたものしか気にしてないんだったら、Frameworkに取り込む必要は無いだろう
このライブラリが必要ですって書いておけばいいだけじゃね。使う対象も開発者なんだから

>>612
iOSに限っての話ならiOSはスタティックライブラリしか外部のライブラリは使えなく、当初はまんまスタティックライブラリを作るテンプレートしかなかった
スタティックライブラリでもFramework形態だとヘッダーも込みで取り込みにも便利でありそういう形態の外部Frameworkもあったが、作るのは自力でであった
Swiftと同時期のXcodeでFrameworkのテンプレートが入ったのでそれと混同してね?

まあ、dylibっつうてるからOS Xなんだろうけど、OS XではSwiftなんて出る前というか、OS X当初からフレームワークを作れるテンプレートは存在した。もちろん、Objective-Cで
0615デフォルトの名無しさん2015/02/21(土) 17:41:04.17ID:PJ316OmS
>>614
×>>611 (しつれ)
○>>610
0616デフォルトの名無しさん2015/02/23(月) 12:50:32.49ID:J1xgPnrT
最初に比べてだいぶ慣れてきたけどデザイン力がなさすぎる
フラットデザイン?てやつ難しすぎだろみんなどうやってんの
0617デフォルトの名無しさん2015/02/23(月) 13:03:55.19ID:cFWATYQh
アポーのガイドライン読んで、標準コンポーネント使え
Androidのマテリアルより表現少ないから楽
0618デフォルトの名無しさん2015/02/23(月) 14:57:38.62ID:Pox1yYhp
expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions

なんだこのエラー。うけるわ
0619デフォルトの名無しさん2015/02/23(月) 15:07:20.85ID:guoKYi3h
おもしろい
0620デフォルトの名無しさん2015/02/23(月) 22:23:35.44ID:4rKozWD+
推論させまくったらこうなるの?
0621デフォルトの名無しさん2015/02/24(火) 07:20:15.51ID:dmk3sM1H
Swiftってeval()みたいなの無い?
ユーザーが入力したSwiftスクリプトをアプリ上で実行したいんだけど
0622デフォルトの名無しさん2015/02/24(火) 08:30:32.44ID:6nzxQRIR
「swiftスクリプト」に笑った
ホントにこういう層が使い始めたんだなぁ
0623デフォルトの名無しさん2015/02/24(火) 09:05:52.21ID:K/19wsS7
お前はいつも笑ってるな。

>>621
REPLに渡せば?
0624デフォルトの名無しさん2015/02/24(火) 11:51:49.89ID:Z7cy/5kT
笑顔の耐えない言語 swift
良いと思います
0625デフォルトの名無しさん2015/02/24(火) 14:36:22.01ID:4AhK+XI6
beta2出てるけど、また結構変わってるな
0626デフォルトの名無しさん2015/02/24(火) 14:42:35.58ID:YtPRSFe6
beta 1に移植しなくて良かった...
0627デフォルトの名無しさん2015/02/24(火) 14:58:45.48ID:Os1aNO9O
追従疲れで脱Swiftの人はどれぐらいいるのだろうか
0628デフォルトの名無しさん2015/02/24(火) 15:27:00.55ID:1px78jPc
流行りものに手を出すから痛い目に合うんだ。
Swiftやってる人って新規参入者と遊び目的の経験者くらいだろ。
新参はもう後に引けないからかわいそうだよな。
0629デフォルトの名無しさん2015/02/24(火) 20:28:32.73ID:xl3zgpOz
何が駄目だったん?
0630デフォルトの名無しさん2015/02/24(火) 20:45:51.59ID:trUfTvKQ
間口が広いように見えて、結局Obj-Cと変わらない前提知識、とかかな
0631デフォルトの名無しさん2015/02/25(水) 15:14:38.34ID:9jFMW7lk
いつになったらドラッグアンドドロップだけでアプリが作れるようになるの?
0632デフォルトの名無しさん2015/02/25(水) 15:19:14.92ID:c988Z4ZJ
また来たのかお前
お前が作るんじゃなかったのかよ
0633デフォルトの名無しさん2015/02/25(水) 19:42:42.58ID:5/Q2jkzJ
グラフィカル言語はけっこう追ってるつもりだけど
だいたいドラッグアンドドロップでガワは組めるけど
なにをどうするかは中になんらかの形で書かなきゃならんしなぁ…
0634デフォルトの名無しさん2015/02/25(水) 20:52:14.24ID:1F5pHynb
if文21個以上連続するとエラーとか軟弱過ぎ
0635デフォルトの名無しさん2015/02/25(水) 21:11:03.45ID:MCz4NBVd
関数でデフォルト引数つけると外部引数名必須になるん?
それより後ろのやつ全部にデフォルト引数ついてれば外部引数名いらないんじゃなかったっけ?
外部引数名必須になった?
0636デフォルトの名無しさん2015/02/25(水) 21:49:34.06ID:zWtZ3bam
キーワードの前に # だか _ だか付けたら期待した動作じゃねーの
言語仕様変更で変わってるから最新は知らんけど
0637デフォルトの名無しさん2015/02/26(木) 00:06:46.75ID:ijHzY9u3
どういうプログラム組んだらif文が21個も必要になるのかが気になる
0638デフォルトの名無しさん2015/02/26(木) 01:50:03.46ID:6BSnxXxo
>>637
それと、エラーメッセージも気になる。
もしかして「あなたはプログラマーに向いてません」とか?
0639デフォルトの名無しさん2015/02/26(木) 07:47:35.86ID:f37zEvBK
Swiftだけでなんでも作れるようになりましたか?
0640デフォルトの名無しさん2015/02/26(木) 08:18:51.22ID:5WvXwXHs
オートレイアウト難しすぎワロタ
画面サイズ増やし過ぎなんだよくそっぷる
0641デフォルトの名無しさん2015/02/26(木) 11:22:26.11ID:uuMNHo2u
そんなに難しいの?
英語読めないからじゃなくて?
ツールにバグが多いとか?
0642デフォルトの名無しさん2015/02/26(木) 11:39:29.87ID:5WvXwXHs
いや日本語ドキュメントもあるし単純に設定がややこしいのと俺が池沼なだけ
ボタンを均等に配置はできるけどボタンサイズを可変にしてスペースを固定するとかがどうしても成功しない
0643デフォルトの名無しさん2015/02/26(木) 14:43:39.93ID:ZlyxtZ3O
かなりいじって慣れないと何がどうなるのかさっぱりわからんよなw
0644デフォルトの名無しさん2015/02/26(木) 14:46:24.80ID:UlpLE7Cn
部品が多くなってくるとStoryboardの操作的な意味で難しい
数ヶ月後に触ろうとすると、まず訳分からんちんになるし
0645デフォルトの名無しさん2015/02/26(木) 15:03:54.83ID:WfYDQrVs
一年後にはXcodeのメジャーバージョンアップでごっそり変わるし
あぁ、これは Swift もそうだなw
0646デフォルトの名無しさん2015/02/26(木) 20:21:38.37ID:XuDII8Li
>>634
>if文21個以上連続するとエラーとか軟弱過ぎ

これ意味分かんないんだよね。
どんな変なパーザを書くとif文の連続する個数が問題になるのかが想像できない。
0647デフォルトの名無しさん2015/02/26(木) 20:29:36.12ID:b79/fYAK
ネスト毎にスタックテーブル持ってて無限にすると壊れるから上限20にしてる
良し悪しは置いてもこれくらいは想像してやれよ
0648デフォルトの名無しさん2015/02/26(木) 20:34:15.01ID:XuDII8Li
>>647
>ネスト毎にスタックテーブル持ってて無限にすると壊れるから上限20にしてる
>良し悪しは置いてもこれくらいは想像してやれよ

もういろいろおかしい。
0649デフォルトの名無しさん2015/02/26(木) 20:39:39.28ID:435mN2Lv
そんなコードをメンテナンスさせられるようになったとしたら、書いたヤツ死ねとは思うな
0650デフォルトの名無しさん2015/02/26(木) 20:59:17.00ID:EyqmRpoR
>>644
xibとStoryboard上でもコメントを入れられるといいのにね
0651デフォルトの名無しさん2015/02/26(木) 21:10:54.59ID:jGNViKeY
Ifを20も連続するようなのはダメなプログラムだというのは正しいとしても、それでダウンするコンパイラて実装クソ過ぎでしょ
他も心配になって当然
0652デフォルトの名無しさん2015/02/26(木) 21:11:00.25ID:jyXquw1n
どこで聞いたか知らないけどif文が21個じゃなくてif文中の条件式が一定個以上でエラー
もっと言うとif文関係なく長い数式書くと死ぬ
0653デフォルトの名無しさん2015/02/26(木) 21:15:59.81ID:XuDII8Li
もしかして処理系の実装をズブの素人がやってるんじゃないかな……
0654デフォルトの名無しさん2015/02/26(木) 21:31:02.18ID:ijHzY9u3
if文関係なしにもっと汎用的な部分で気をつけないといけない箇所かもしれないから
どういうコード書いたらどういうエラーが起きたのかちゃんと説明してほしい真面目に
0655デフォルトの名無しさん2015/02/26(木) 22:21:24.21ID:fAsMn0/j
スタックコールオーバーとか、無限リストによるメモリ破壊とか
そういうことも想像出来ないズブの素人もいるしなぁ
そういうことで Source Kit が落ちないようにガードしてるんだろ、残念ながら頻繁に落ちるけど

complex check toolsに捕まらない程度に書けば良い気がする
if 20個は警告ってレベルじゃねーからな
0656デフォルトの名無しさん2015/02/26(木) 22:22:28.90ID:RBoyK9EV
>>654
おそらく >>618 のエラーのことだろうね

コードに含まれる識別子のデータ型を明示的に宣言せず式や文で使用すると、
Swift コンパイラは与えられたスコープの範囲内で型推論を試みる
型推論というのはパズルの全解探索みたいなアルゴリズムを用いるから、
(とりわけ言語仕様が複雑な Swift では)式や文の複雑度が一定限度を越えると、
探索空間が爆発してエラーとなる可能性がある
そのエラーとなる上限が、たまたま「if 文を21個連ねる」だったのだろう

おそらくエラーとなったコードも、いくつかの識別子へ明示的なデータ型宣言を
加えるだけで、正常にコンパイルできるようになる .... と推測する
06576562015/02/26(木) 22:36:45.24ID:RBoyK9EV
>>656 をカキコした後に、>>618 のエラーメッセージでググってみたら、
すでに何件か Stackoverflow 上で同様の問題が指摘されているみたいだね
・xcode - If condition failing with expression too complex - Stack Overflow
 http://stackoverflow.com/questions/26550775/if-condition-failing-with-expression-too-complex
・compiler errors - Limit to number of terms in an expression? - Stack Overflow
 http://stackoverflow.com/questions/25412198/limit-to-number-of-terms-in-an-expression
・Swift compound arithmetic operation ERROR - Stack Overflow
 http://stackoverflow.com/questions/25569373/swift-compound-arithmetic-operation-error

どうやら、型推論とは無関係に単純な式を連ねるだけで再現するみたいだ
というわけで、>>656 のカキコを撤回するわ ...orz
0658デフォルトの名無しさん2015/02/26(木) 22:55:44.07ID:435mN2Lv
うん、やっぱり死ねってレベルのコードだったw
0659デフォルトの名無しさん2015/02/26(木) 23:12:45.32ID:QRbSrjVv
var ret = -100.0 + (2.0 * 1.3) + (3.0 * 4.0) + (0.2 * 2.0 * 2.0) + 0.1 * 2.0 * 3.0

え…これで落ちるんwwwwwwwww
ありえんだろ
0660デフォルトの名無しさん2015/02/26(木) 23:38:54.33ID:jyXquw1n
一応1.2では直ってるって話
原因教えて欲しい
■ このスレッドは過去ログ倉庫に格納されています