Swift:問題と展望

2014年6月2日、Appleの世界で誰も予想していなかったことが起こりました。 Appleは、新しいオブジェクト指向プログラミング言語-Swiftを導入しました。



Swiftを引き付けるものは何ですか?

クラスごとにインターフェースと実装でそれぞれ* .hおよび* .mファイルを作成する必要があるObjective-Cとは異なり、Swiftでは、インターフェースと実装の両方を含む* .swiftファイルを1つだけ作成する必要があります。 これは、プロジェクトのソースファイルが2倍小さくなり、プラスになることを意味します。 しかし、問題が発生します-クラスのプロパティとメソッドをパブリックとプライベートに分離する方法は? Objective-Cでは、* .mファイルでプライベートプロパティとメソッドを非表示にするために使用されます。 現在、Swiftでこれを行うことはできません。



画像



Appleによると、そのようなメカニズムは引き続き表示されます。



画像



ソース: https : //devforums.apple.com/thread/227288 (開発者アカウントが必要です)。

Swiftには、優れたswitch-caseステートメントがあります。 Objective-Cとは異なり、Swiftでは、行ごとに条件付きで列挙できます。



let vegetable = "red pepper" switch vegetable { case "celery": let vegetableComment = "Add some raisins and make ants on a log." case "cucumber", "watercress": let vegetableComment = "That would make a good tea sandwich." case let x where x.hasSuffix("pepper"): let vegetableComment = "Is it a spicy \(x)?" default: let vegetableComment = "Everything tastes good in soup." }
      
      







SwiftとObjective-Cは同じプロジェクトで使用できます。 Swiftへの移行をスムーズに行うことができます;古いライブラリとクラスを書き換える必要はありません。

Swiftモジュールはプロジェクト全体ですぐに使用できますが、Objective-Cでは、それらを使用するためにインターフェイスファイル(* .h)を含める必要があります。

それでは、Swiftが本当に速く動作するかどうかを確認してみましょう。 これを行うには、Objective-CとSwiftで2つの同一のアプリケーションを作成します。 アプリケーションの機能は、コントローラー(UIViewController)をロードし、メインビュー(UIView)に画像を配置して表示(UIImageView)することです。 アプリケーションが完全にロードされてから最初のコントローラーが表示されるまでの時間を検出します。 テストを10回繰り返します(下図)。



画像



ご覧のとおり、Objective-CアプリケーションはSwiftアプリケーションよりも速くコントローラーをロードし、Objective-Cのロード時間はより安定しています。

したがって、Objective-Cアプリケーションは平均で0.02556秒でコントローラーをロードし、Swiftアプリケーションは0.03404秒でロードします。 なぜそうですか? おそらく、Appleは、Swiftでコントローラーとビューを作成するUIKitを含むフレームワークを書き換えなかったためです。 代わりに、いわゆる「ラッパー」が作成されました。 簡単に言えば、コントローラー、ビューなどを作成するためのSwiftメソッドです。 それらは単にObjective-Cのメソッドを呼び出し、結果を返します。 ほとんどの場合、状況は将来変化し、Appleは最適化に慎重に取り組み、将来的にはSwiftのアプリケーションはより高速に動作します。 しかし、今ではありません。

では、クラスの名前を変更してみましょう。 クラス名を右クリックして、「リファクタリング/名前変更」および...:



画像



もちろん、Xcode 6の最終バージョンがリリースされる秋までに、この問題は間違いなく確実に解消されますが、これもまたSwiftの「湿気」を暗示しています。

Objective-Cに慣れている経験豊富なiOS開発者でさえ、Objective-CのSwiftでブロックや同様のクロージャーを使用する場合、タブブレースに違いがあるという事実に混乱します。

これは、Objective-Cでの単純なアニメーションブロックの外観です。



画像



したがって、Swiftでは:



画像



何らかの理由で、Swiftでは、閉じブレースがブロック本体と同じレベルにあるのが慣習です。 このようにするのは非常に論理的です(中括弧{}に注意):



画像



もう1つの非常に迷惑なSwiftの問題は、インクリメントに関連しています。 インクリメントは、主にカウンターとしてサイクルで使用されます。



 let startDate = NSDate() var j:Int64 = 0 for var i:Int64 = 0; i<=1000000000; i = i+1 { j = i j = j+1 } println("\(NSDate().timeIntervalSinceDate(startDate))")
      
      







このコードの実行時間:4.44419801235199秒。



しかし、i = i + 1とj = j + 1をそれぞれ++ iとj ++に置き換えた場合(そしてこれはより一般的なケースです):



 let startDate = NSDate() var j:Int64 = 0 for var i:Int64 = 0; i<=1000000000; i++ { j = i j++ } println("\(NSDate().timeIntervalSinceDate(startDate))")
      
      







その実行時間は、624.784721970558秒(10分以上!)に急上昇します。



したがって、Objective-C:

 NSDate *startDate = [NSDate date]; int64_t j = 0; for (int64_t i = 0; i<= 1000000000; i = i + 1) { j = i; j = j + 1 } NSLog(@"%f", [[NSDate date] timeIntervalSinceDate:startDate]);
      
      







時間:2.842506秒。



 NSDate *startDate = [NSDate date]; int64_t j = 0; for (int64_t i = 0; i<= 1000000000; i++) { j = i; j++; } NSLog(@"%f", [[NSDate date] timeIntervalSinceDate:startDate]);
      
      







時間:2.833201秒。



実験の純度のために、SwiftとObjective-Cで個別にi ++とi = i + 1を使用する場合の違いにのみ注意を払います。 また、Objective-Cのint64_tは単純型ですが、SwiftのInt64は構造体であり、もちろん動作が遅くなりますが、Swiftは別の出力を提供しません。

さらに、Xcodeのサポートは現在非常に貧弱であり、コードのオートコンプリートは不十分であり、おそらくiOSアプリケーションを作成するためのメインフレームワークであるUIKitをまだ完全にはサポートしていません。 残りについては何が言えますか...

したがって、Swiftが導入されたと結論付けることができます。 ほとんどの場合、これらの問題はすべて時間の経過とともに解決されますが、現時点では、Swiftを使用して商用アプリケーションを作成することは強く推奨されていません。 現在では、トレーニングにのみ適しています。 Swiftは確かに代わりになりますが、Objective-Cはさらに2年間メイン言語として使用されます。



All Articles