Swiftについて、そして私の大きなプロジェクトがObjective-Cでしばらく(おそらくより長い時間)使用される理由

翻訳者から:C金曜日、親愛なるKhabrovites! 今日は、Swift言語の使用経験に関する小さなブログの記事の翻訳を共有したいと思います。 真剣かつ綿密な分析の栄誉を主張することはまずありませんが、「このObjective-Cを歴史のダンプに送る時が来たのか?」と思ったすべての人にとって興味深いと思います。



AppleがSwiftを紹介したとき、それはすごかったです! 最後に、アップルデバイスの開発用の次世代(つまり、ファッションスクリプトのような)言語を取得しました(ただし、クラスのプライベートメンバーのサポートなしで、うーん....)。 これで、この[正方形の恐竜恐竜]は博物館に行くことができ、これらの新しい光沢のある言語機能を突っ込み始めます。 もちろん、1年未満の言語にはゴキブリがないと仮定するのは単純です。 明らかに、あなたは彼に子供のただれを取り除くためにいくらかの時間を与える必要があります。 そのため、発表後すぐにSwiftですべてのプロジェクトを書き直そうとはしませんでした。





鳥が落ちていることに注意してください?





卒業して1年後、私はついに言語を学ぶことにしました。 これを行うために、私は世界で最も恐ろしいもの(Windows 3.1の世界では大丈夫)についてのおもちゃを書き始めました-SkiFreeゲームのモンスターです。 ここでそれについて読むことができます。



免責事項 :私は1年の速さについて書いています。 Appleのスタッフがこれらすべての問題を修正し、言語が非常にエレガントなツールになると確信しています。 さて、Xcode 7以降の不器用なカバのいずれかです。



Swiftに戻ります。 「The swift programming language」という本のある夜、私は挑戦の準備ができています。 この言語は、そのシンプルさ、構造の透明性、そして安全なコードを書くことを可能にする隠された力に魅了されました(そしてもちろん、クラスのプライベートメンバーを追加しました)。 私はSripteKitのおもちゃを書き始めました...



画像



それは深刻ですか? 私の60,000行のObjective-Cプロジェクトは、Swiftの600行のHello Worldの約2倍の長さです。 私は巨大なプロジェクトに取り組んでいたときのその輝かしい時代(実際にはほんの数か月前でした)を突然思い出し、下の写真は数営業日を完璧に説明していました:







この文書化されていない言語の機能は、私にとって非常に不快でした。小さなおもちゃを開発し、ハードコードされた値を小さなロジックで頻繁に変更することがよくありました。 そして、小さな変更にはすべてプロジェクトの再構築が必要でした。 はい、この問題はさまざまな方法で解決できることを知っています。たとえば、構成に定数を入れたり、ゲーム内のデバッグメニューを作成したりします。 しかし、これらすべてのアプローチには追加の努力が必要であり、主なタスクである小さな面白いゲームの作成に集中したいと思います。



最終的に、人は何にでも慣れることができます。 しかし、コンパイラは再び私を襲った:







うーん... 2つのフロートをスタックすることはできません...まあ...



このモンキーコーダーがハードコードされた値を操作したり、コードで同時にfloat型とdouble型を使用したりするのをやめるために、すでにナイフを研いでいる人のために、私は言いたいです:まず、CGFloatはUIKitから、そしてサードパーティコードからdouble 。 したがって、これら2つのタイプを混在させる必要がある場合、これはあまりエキゾチックな状況ではありません。 ハードコードされた値を定数に削除すると、コードがより賢明になりますが、コンパイラを喜ばせる驚くべき宙返りから私たちを救うことはできません。 もちろん、このろくでなしは2つのフロートを追加できます-実際、彼は私から本当の問題を隠しています!



ご存知のように、私はコンパイラーを昔の賢者のガンダルフのようなものだと常に思っていました。







この老人が持っているものを理解するのが難しい場合があります。 しかし、考えてみれば、それは本当に問題を示しています。 比phorを続けると、2つの浮動小数点数を追加する問題について教えてくれるSwiftコンパイラーは、このホビット映画スティックを思い出させます。







コードに対する黒い儀式、そして最終的には機能しました。 考えられるオプションは次のとおりです。







開発中にそのような事件をすべて覚えていませんでしたが、これらは私の考えを説明するのに十分だと思います。



最初の問題に関連するもう1つの問題は、Objective-Cと比較して静的解析の速度が遅いことです。 Xcodeで解析するよりもはるかに高速にコードを記述したため、Xcodeで構文エラーの強調表示をリアルタイムでオフにしたことがありました(人対マシン:1:0、ho-ho)。 ヒントのヒントは私を悩ませただけでした。 新しいケシを購入すると、分析はほとんど瞬時になりました-そして、この機能を使い始めました。 しかし、Swiftを使用すると、同じ問題に再び遭遇しました(2:1。男が勝ちます)。



そして最後に、私のコレクションの真珠:







私は私の人生で多くを見てきました...

挿入された 'if(0){...}'式により、コンパイラの最適化がパフォーマンスをクラッシュさせるのを見ました

欠落している「volatile」キーワードに関連する巨大なバグを見ました

言語の不明確な振る舞いがもたらす恐ろしい破壊を私は見た。



しかし、私はコンパイラがその困難な生活について文句を言うのを見たことがない。



このメッセージは、warning'omの場合に非常に役立ちます。 しかし、これは重大な間違いです。 そのため、この式を単純化する必要があります。 非常に長い構成でこのエラーが発生した場合、この状況を理解できます。 しかし、私の表現は120文字未満でした。 一部の開発者にとって、この状況は普通のように思えるかもしれませんが、C / C ++とx86アセンブラーのオオカミに育てられました。 だから私にとっては奇妙に見えます。



一番下の行は何ですか? 素晴らしいPython / Go / Rubyに似た言語ができました。 しかし、大きなプロジェクトを開始する理由はありますか?



ジェネリック? はい、これは非常に優れていますが、Objective-Cにも汎用的なサポートがあります(はい、しかしいですが、あります)。 そして、囲fromの人は一般的に、ジェネリックなしでは正常だと言います。



オプションタイプ? 私の意見では、これは非常に物議を醸す概念です。 関数で引数を渡すことを議論する場合、それは非常に便利ですが、長時間初期化されない可能性のあるクラスメンバに関しては(たとえば、遅延初期化の場合)痛い場合があります。



値によってオブジェクトを転送しますか? パフォーマンスが必要な場合は、C / C ++がサービスにあります。 オプションの値を同時に使用したい場合は、もちろん、C / C ++ではこれは少しlittleいように見えますが、それでも可能です。



そうですね まじめな話、角かっこ(!(「英語で話しているかのようにコードを書く」)、ブール値でYES / NOを使用して笑ったからこそ、言語を作成したように見えます。価格はいくらですか?)アセンブリが遅い言語であり、時には非常に奇妙なコンパイラの動作があります。



だから、老人は彼が望むすべてを言った。 しかし、流行のスクリプトのような言語の愛好家であるあなたは、私の言葉を心に留めすぎてはいけません。実際、Swiftは優れたデザインの優れた言語です。 私が説明したすべての問題は、言語を大幅に変更することなく考えられるため、いつかは消えてしまいます。 SwiftはHello Worldを作成するのに最適な言語ですが、まだ大規模なプロジェクトを開始することはお勧めしません。



All Articles