Следуя this, он работал нормально.
Но когда я попробовал то же самое для разрешения вложенной зависимости (внедренный класс зависимости, в свою очередь, имеет зависимость - NetworkService в нашем случае), произошел сбой. Что я здесь делаю не так? Любая помощь будет высоко ценится.
Сценарий в реальном времени
class AppContainer {
static let shared = AppContainer()
var index: [Any] = [NetworkingLibrary(), NetworkService()]
func resolve<T>(_ type: T.Type) -> T {
return index.first(where: { $0 as? T != nil }) as! T
}
}
@propertyWrapper
struct Inject<Value> {
var value: Value
var wrappedValue: Value {
get {
return value
}
set {
value = newValue
}
}
init(_ container: AppContainer = AppContainer.shared) {
value = container.resolve(Value.self)
}
}
class UserService {
@Inject() var networkLayer: NetworkLayer
init() { }
func fetchUsers() {
networkLayer.fetchData()
}
}
class PostService {
@Inject() var networkLayer: NetworkLayer
init() { }
func fetchPosts() {
networkLayer.fetchData()
}
}
protocol NetworkLayer {
func fetchData()
}
class NetworkService: NetworkLayer {
@Inject() var networkLibrary: NetworkingLibraryProtocol //Expecting networkLibrary to be resolved to NetworkingLibrary()
func fetchData() {
networkLibrary.fetch()
print("Fetching Data")
}
}
let postService = PostService() // crashes here
postService.fetchPosts()
let userService = UserService() // crashes here
userService.fetchUsers()
Код, который можно запустить на игровой площадке
class AppContainer {
static let shared = AppContainer()
var index: [Any] = ["StackOverflow", NetworkService()]
func resolve<T>(_ type: T.Type) -> T {
return index.first(where: { $0 as? T != nil }) as! T
}
}
@propertyWrapper
struct Inject<Value> {
var value: Value
var wrappedValue: Value {
get {
return value
}
set {
value = newValue
}
}
init(_ container: AppContainer = AppContainer.shared) {
value = container.resolve(Value.self)
}
}
class UserService {
@Inject() var networkLayer: NetworkLayer
init() { }
func fetchUsers() {
networkLayer.fetchData()
}
}
class PostService {
@Inject() var networkLayer: NetworkLayer
init() { }
func fetchPosts() {
networkLayer.fetchData()
}
}
protocol NetworkLayer {
func fetchData()
}
class NetworkService: NetworkLayer {
@Inject() var str: String // Expecting str to be resolved to "StackOverflow"
func fetchData() {
print(str)
print("Fetching Data")
}
}
let postService = PostService()
postService.fetchPosts()
let userService = UserService()
userService.fetchUsers()
Журнал сбоев: -
ошибка: выполнение было прервано, причина: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0). Процесс был оставлен в точке, где он был прерван, используйте «thread return -x», чтобы вернуться в состояние до вычисления выражения.