it-swarm-ja.com

Swiftの拡張機能に関して、再利用性を考慮して、ベストプラクティスは何ですか?

私はSwift可能な限り意図しない結果を排除しようとする方法が好きです。私が何年もやってきたことを非難する言語に変更があるときはいつでも、私が考えていることを再考することを余儀なくされますベストプラクティスである++の排除、-はこれが起こった最新の時間でした。

意図しない結果が生じる可能性が非常に高いと思われる領域の1つは、外部ファイルから自動的に含まれる拡張機能です。 UIViewをどこかに拡張して、その拡張機能に依存するコードを新しいプロジェクトで再利用しようとすると、コードがコンパイルされていないときにしばらく頭を悩ませている可能性があり、それを導入したファイルを探す必要があります拡張。

私の質問は、拡張機能に関してはどのようなベストプラクティスですか?各拡張子は独自のファイルに存在する必要がありますか?タイプ別にグループ化する必要がありますか?

私が尋ねている理由の1つは、将来の反復でSwiftは、上記の状況を回避するために、拡張機能の暗黙的なインポートステートメントを必要とする可能性があると考えていることです。Swiftコミュニティ?

4
DudeOnRock

Swiftの今後の反復では多くのことができるようになりますが、3.0ロードマップには何も表示されません( https://github.com/Apple/Swift-evolution )これは、ファイルごとのインポートについて心配する必要があることを示唆しています。Swiftインポートはファイルレベルの問題ではなくパッケージであり、変更される可能性は低いようです。

現在の混乱は、拡張機能の使用を各アプリのパッケージにコピーして再利用することに起因しているようです。その場合、同じパッケージ内の拡張機能に対するそのコードの暗黙の依存関係は明らかではありません。再利用可能な拡張機能を独自のパッケージに移動することで、これを解決できます。これらの拡張機能を使用するには、拡張機能を含むパッケージをインポートする必要があります。これにより、依存関係がより明確になり、新しいアプリで拡張機能を実行できない場合に見つけやすくなります。

再利用可能な拡張機能を多数使用している場合は、 "Swift拡張機能には名前がありません" と見なすことができます。その結果、2つの拡張機能がある場合、タイプに同じメソッドを導入すると、それらの拡張機能の両方のモジュールを使用できない可能性があります。代わりに、次のことを行うことができます。

  1. 追加する動作のプロトコルを定義します。
  2. プロトコル拡張を使用して、実装を提供します。
  3. 拡張機能を使用して、拡張するタイプにこのプロトコルを採用させます。

次に、同じシグネチャを持つメソッドを定義する複数のプロトコルを採用する型を明確化できます( https://forums.developer.Apple.com/thread/5812 を参照)

例えば両方がfunc setBackgroundGradientColors(start: UIColor, end: UIColor)を定義するプロトコルBackgroundLinearGradientDisplayableBackgroundRadialGradientDisplayableがあり、UIViewが両方のプロトコルに準拠するように拡張されている場合、(view as BackgroundGradientDisplayable).setBackgroundGradientColors(start: color1 end: color2)を使用して特定のプロトコルの実装。 2つのUIView拡張機能を定義するだけでは、両方を同じパッケージにインポートすることはできません。

4
Jonah