Swift で利用可能な拡張機能について調べましたが、静的protocol extensions
がサポートされているかどうか疑問に思っていましたか? でインスタンスメソッドを使用できることを知っていますprotocol extension
。
そのリポジトリの実装とともに、リポジトリのプロトコルを作成したいと考えていました。
リポジトリ プロトコル
public protocol NoteRepositoryProtocol {
func getAllNotes() -> [Note]
}
リポジトリの実装
class NoteRepository : NoteRepositoryProtocol {
func getAllNotes() -> [Note] {
return [Note]()
}
}
次に、アプリケーション内で疎結合を維持するために、ファクトリを介してリポジトリを作成したいと考えました。私は巧妙になり、次のように静的メソッドをプロトコルにアタッチしようとしていました。
public extension NoteRepositoryProtocol {
public static func createInstance() -> NoteRepositoryProtocol {
return NoteRepository()
}
}
ここにキーワードをドロップすればこれができることはわかっていますがstatic
、本当に静的にしたかったので、これを行うことができました:
func test_note_repository_returns_a_valid_note_repository() {
let repository = NoteRepositoryProtocol.createInstance()
}
リポジトリの実装を変更したい場合は、プロトコル拡張ファクトリ メソッドを更新することで実行できます。もう 1 つの方法は、これを処理する実際のファクトリを作成することですが、型自体にファクトリ メソッドが存在するというアイデアが気に入っています。
これをコンパイルすると、次のコンパイラ エラーが表示されます。
シグナルが原因でコマンドが失敗しました: 不正な命令: 4
警告: 不変値 'repository' の初期化は使用されませんでした。'_'への割り当てに置き換えるか、それを削除することを検討してくださいrepository = noterepositoryprotocol.createinstance()~~~~^~~~~~~~~ _/library/caches/com.apple.xbs/ソース/swiftlang/swiftlang-700.0.38.1/src/swift/lib/SILGen/SILGenExpr.cpp:3311! 0 swift 0x0000000106760e0b llvm::sys::PrintStackTrace(__sFILE*) + 43 1 swift 0x000000010676154b SignalHandler(int) + 379 2 libsystem_platform.dylib 0x00007fff9440ef1a _sigtramp + 26 3 swift 0x0000000106d5aa2e FirstTarget + 60550 4 swift 0x0000000106761346 abort + 22 5 swift 0x000000010671ae21 llvm: :llvm_unreachable_internal(char const*,
プロトコル拡張で静的メソッドを使用できませんか?
アップデート
サンプル ソースの問題の根本を改善するために、単体テスト アサーションを削除しました。問題は、プロトコルで静的メソッドを呼び出すことをコンパイラが好まないことです。