質問: コンパイラがifステートメントの条件が内部で正しいと想定しないのはなぜですか? まず最初に:タイトルを申し訳ありませんが、次の質問の意味を1つのフレーズでより適切に定式化する方法がわかりませんでした。次のswiftコードを書いている間:if errordata.ismemberofclass(uialertcontroller) { self.presentviewcontroller(errordata, animated: true, completion: nil) } else { /* some other code */ } 私の個人的なプロジェクトでは、コンパイラーから次のエラーが発生しました。'anyobject' is not convertible to 'uialertcontroller'; did you mean to use 'as!' to force downcast? コードを次のように変更しないと、コンパイラーはそれ以上使用できなくなります。if errordata.ismemberofclass(uialertcontroller) { self.presentviewcontroller(errordata as! uialertcontroller, animated: true, completion: nil) } else { /* some other code */ } しかし、これはわかりません。プログラムにif statementを使用してerrordata(正確にはクラスanyobject)のクラスをチェックさせると、なぜそうなるのでしょうか。 if内にあるはずのクラスのタイプに対して、強制的にダウンキャストを強制しますか?言い換えると、コンパイラは、ステートメント内でerrordataがuialertcontrollerであることをすでに認識していませんか?代わりに、プログラムがelse部分で続行されなかった場合、errordataはクラスintまたはstringである可能性もあります。
回答: これにはいくつかの異なる可能な答えがあります。答えの1は、ismemberofclassが他のメソッドと同じメソッドであるということです。コンパイラーは、このメソッドが何をしているのか、そしてコードが何を意味するのか全くわかりません。サブクラスでオーバーライドされることもあります。このメソッドはswiftの一部ではなく、objective-c標準ライブラリの一部です。答え2は、コンパイラが知っていることです。これにより、より効率的なコードが生成される可能性がありますが、言語のセマンティクスはswiftは、参照の静的型に存在するメソッドのみを呼び出すことができると言います。コンパイラーが言語セマンティクスに違反することは許可されていません。この情報は、最適化、より適切なエラーメッセージの生成など、さまざまな目的で使用される場合がありますが、言語仕様を実行するために使用されることはありません禁止します。回答番号3は、活字ケースまたはタイプガード構造を持つ言語がありあり、kotlinのスマートキャストについてはすでに言及されているということです。ただし、kotlinのif (errordata is uialertcontroller)の場合、is構造は型テスト用の言語組み込み構造であるため、コンパイラはそれが何を意味するか、ismemberofclassは他のメソッドと同じように単なるメソッドですが、コンパイラにとって特別な意味はありません。したがって、このような機能をswiftに追加できますが、おそらくメソッドではなく、言語に組み込まれたタイプテスト(is)を使用します(オプションのif letと同様)。私は実際にはswiftを知りませんが、次のようなことができると思います。if let errordata = errordata as? uialertcontroller { self.presentviewcontroller(errordata, animated: true, completion: nil) } else { /* some other code */ } これを短縮するためにシンタックスシュガーを導入する方法はいくつかあると想像できますが、それほど多くはありません。